Отчёт (1080957)
Текст из файла
Московский государственный технический
университет им. Н.Э. Баумана.
Факультет «Информатика и управление»
Кафедра ИУ5. Курс «Основы информатики»
Отчет по лабораторной работе №13
«Вычисление обратной матрицы методом Гаусса-Жордана»
Выполнил: | Проверил: | |
студент группы ИУ5-14 | преподаватель каф. ИУ5 | |
Шевченко Роман | Папшев И.С. | |
Подпись и дата: | Подпись и дата: |
г. Москва, 2008 г.
Постановка задачи
Цели работы:
- разработка программы, реализующей алгоритм вычисления обратной матрицы методом Гаусса-Жордана;
- исследование влияния ошибок округления на результаты вычисления.
Задание.
Создать функцию для вычисления обратной матрицы по методу Гаусса-Жордана. Размер матрицы передавать в функцию в качестве параметра.
Применить функцию для решения системы линейных алгебраических уравнений.
Исследовать влияние коэффициентов исходной матрицы на точность вычисления обратной матрицы.
Часть 2.
-
Выполнить тестирование программы. Проверку правильности результатов вычислений выполнять путем умножения полученной обратной матрицы на исходную (в результате должна получиться единичная матрица). Для реализации контроля разработайте функцию, реализующую произведение матриц.
-
Применить функцию для решения системы линейных алгебраических уравнений.
-
Исследовать влияние коэффициентов исходной матрицы на точность вычисления обратной матрицы.
Разработка алгоритма
Алгоритм преобразования исходной матрицы в обратную состоит из двух шагов:
Прямой ход. В результате исходная матрица преобразуется в верхнюю треугольную матрицу.
Обратный ход. В результате исходная матрица преобразуется в единичную, а введенная единичная матрица – в матрицу, обратную исходной.
Можно уменьшить погрешность вычисления обратной матрицы, если позаботиться о том, чтобы элементы обращаемой матрицы имели примерно один и тот же порядок величин. Для уменьшения погрешностей округления нужно использовать более «длинные» типы данных для представления коэффициентов, например, double вместо float.
СЛАУ решается путём умножения обратной матрицы на свободные коэфициенты
Описание входных, выходных и вспомогательных данных:
Входные данные:
double **mat – исходная матрица;
int n – размер матрици;
double *svob – массив для хранения свободных членов при решении СЛАУ
Выходные данные:
double **mat_ob – обратная матрица;
Вспомагательные данные:
double **mat_ed – единичная матрица;
double **mat_help – вспомогательная матрица(справа исходная, слева единичная);
double *mas – массив преднозначен для получения нулевых злементов в матрице;
Текст программы.
#include <iostream>
#include <iomanip>
using namespace std;
double **obrat(double **mat, int n);
void ymnog(double **mat1, double **mat2, int n);
void ymnog(double **mat1, double *mat2, int n);
void slau();
void main(){
int n;
setlocale(LC_ALL,".1251");
cout << "Нахождение обратной матрици.\n";
cout << "Введите размер матрици ";
cin >> n;
double **mat= new double *[n];
for(int i= 0; i < n; i++) mat[i]= new double [n];
//--------------------------------------------Ввод матрици-------------------------------------------------
cout << "\nВведите элементы матрици\n";
for (int i= 0; i < n; i++) for(int j= 0; j < n; j++) cin >> mat[i][j];
//-------------------------------------Нахождение обратной матрици-----------------------------------------
double **mat_ob=obrat(mat,n);
cout <<" Обратная матрица: \n";
for (int i = 0; i < n; i++){
for(int j= 0; j < n; j++) cout << setw(8) << fixed << setprecision(3) << mat_ob[i][j] << " ";
cout <<"\n";
}
ymnog(mat,mat_ob,n); //проверка умножением
//---------------------------------------------ЧАСТЬ II----------------------------------------------------
//-----------------------------------------Решение СЛАУ----------------------------------------------------
cout << "\nРешение системы уравнений.\n";
slau();
system("Pause");
}
double **obrat(double **mat, int n)
{
double a,b,c;
double *mas= new double[2*n];
// Создание единичной матрици
double **mat_ed= new double *[n];
for(int i= 0; i < n;i++) mat_ed[i]= new double [n];
for(int i= 0; i < n; i++)
for(int j= 0; j < n; j++){
if(i == j) mat_ed[i][j]= 1;
else mat_ed[i][j]= 0;
}
// Создание вспомогательной матрици
double **mat_help= new double *[n];
for(int i= 0; i < n; i++) mat_help[i]= new double [2*n];
for(int i= 0; i < n; i++)
for(int j= 0; j < (2*n); j++){
if(j < n) mat_help[i][j]= mat[i][j];
else mat_help[i][j]= mat_ed[i][j-n];
}
// Прямой ход
for(int k= 0; k < n; k++){
if (mat_help[k][k] == 0){
for(int i= k+1; i < n; i++){
if(mat_help[i][k] != 0){
for(int j= 0; j < n*2; j++){
c= mat_help[i][j];
mat_help[i][j]= mat_help[k][j];
mat_help[k][j]= c;
}
break;
}
}
}
for(int i= k; i < n; i++){
if(i == k) for(int j= 0; j < 2*n; j++) mas[j]= mat_help[i][j];
for(int j= k; j < 2*n; j++){
if(i == k){
if(j == k) a= mat_help[k][k];
mat_help[i][j]= mat_help[i][j]/a;
}else{
if(j == k) b= mat_help[i][j];
mat_help[i][j]= mat_help[i][j]-mas[j]*b/a;
}
}
}
}
// Обратный ход
for (int k= n-1; k >= 0; k--)
for(int i= k; i >= 0; i--){
if(i == k) for(int j= 0; j < 2*n; j++) mas[j]= mat_help[i][j];
for(int j= k; j < 2*n; j++){
if(i == k){
if(j == k) a= mat_help[k][k];
mat_help[i][j]= mat_help[i][j]/a;
}else{
if(j == k) b= mat_help[i][j];
mat_help[i][j]= mat_help[i][j]-mas[j]*b/a;
}
}
}
double **mat_ob= new double*[n];
for (int i= 0; i < n; i++) mat_ob[i]=new double [n];
for (int i= 0; i < n; i++) for(int j= 0; j < n; j++) mat_ob[i][j]= mat_help[i][j+n];
return mat_ob;
}
void ymnog(double **mat1, double **mat2, int n)
{
double s;
double **mat= new double *[n];
for(int i= 0; i < n; i++) mat[i]= new double [n];
for(int i= 0; i < n; i++){
for(int j= 0; j < n; j++){
s= 0;
for(int k= 0; k < n; k++) s= s+mat1[i][k]*mat2[k][j];
mat[i][j]= s;
}
}
cout <<" Умножение обратной на исходную: \n";
for (int i=0; i < n; i++){
for(int j= 0; j < n; j++) cout <<setw(8) <<fixed <<setprecision(3) <<abs(mat[i][j]) << " ";
cout <<"\n";
}
}
void ymnog(double **mat1, double *mat2, int n){
double s;
double *mat= new double[n];
for (int i= 0; i < n; i++){
s= 0;
for (int j= 0; j < n; j++) s= s+mat1[i][j]*mat2[j];
mat[i]= s;
}
cout << "\nРезультат:\n";
for (int i= 0; i < n; i++) cout << "x" << i+1 << " = " << mat[i] << "\n";
}
void slau(){
int n,i,j;
cout <<"Введите количество уравнений в системе - ";
cin >>n;
double **mat= new double *[n];
for(int i=0; i<n;i++) mat[i]= new double [n];
for(int i=0; i < n; i++){
cout <<"Введите коэффициенты уравнения: " <<i+1 <<"\n";
for(int j=0; j < n; j++) cin >> mat[i][j];
}
double **mat_ob= obrat(mat,n);
double *svob= new double [n];
cout <<"Введите свободные члены уравнений:\n";
for(int j= 0; j < n; j++) cin >>svob[j];
ymnog(mat_ob, svob, n);
}
Анализ результатов
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.