Консультация № 181756
05.01.2011, 21:52
105.64 руб.
0 6 2
Здравствуйте, уважаемые эксперты! Прошу Вас помочь с задачкой.

Разработать программу на языке С++ реализующую один из следующих методов вычислительной математики:
Вычисление определителя и нахождение обратной матрицы.

И желательно бы блок-схему к программе. Заранее спасибо.

Обсуждение

Неизвестный
05.01.2011, 22:36
общий
Здравствуй-те Svistaplas90
ответь-те пожалуйста на следующие вопросы.
1. Какая размерность матрицы?
2. Блок схема в Visio устроит?
Неизвестный
05.01.2011, 22:59
общий
1. размерность матрицы 5 на 5.
2. конечно устроит
Неизвестный
06.01.2011, 02:27
общий
это ответ
Здравствуйте, Svistaplas90!

Программу тестировал под VS 2005.

Приложение:
#include <iostream>
#include <math.h>

using namespace std;

double determ(int** Arr, int size)
// функция вычисления определителя
{
double det=0;
int** matr; // вспомогательная матрица

if(size==1) det=Arr[0][0];
else
if(size==2) det=Arr[0][0]*Arr[1][1]-Arr[0][1]*Arr[1][0];
else // если размерность больше двух, то вычисляем методом рекурсии
{
matr=new int*[size-1]; // определяем вспомогательную матрицу
for (int i=0; i<size-1; i++)
matr[i]=new int[size-1];
// вычисляем определитель раскладывая по нулевой строке
for(int k=0; k<size; k++)
{
// заполняем вспомогательную матрицу
// строки берем из основной матрицы все кроме нулевой
// столбцы все кроме k-го
for (int i=0; i<size-1; i++)
for(int j=0; j<size-1; j++)
{
if(j<k) matr[i][j]=Arr[i+1][j];
else matr[i][j]=Arr[i+1][j+1];
};
det+=pow((double)-1, k)*determ(matr, size-1)*Arr[0][k];
}
// освобождение ресурсов
for(int i=0; i<size-1; i++)
delete matr[i];
delete matr;
};

return det;
}
double dopol(int k, int n, int size, int** Arr)
// вычисление алгебраического дополнения
{
int** matr;
double m;

matr = new int*[size-1];// определяем вспомогательную матрицу
for (int i=0; i<size-1; i++)
matr[i]=new int[size-1];
// заполняем вспомогательную матрицу, путем исключения из основной
// k-й строки и n-го столбца
for (int i=0; i<size-1; i++)
for (int j=0; j<size-1; j++)
if (i<k)
if (j<n) matr[i][j]=Arr[i][j];
else matr[i][j]=Arr[i][j+1];
else
if (j<n) matr[i][j]=Arr[i+1][j];
else matr[i][j]=Arr[i+1][j+1];

m=pow((double)-1, (k+n))*determ(matr, size-1);

// освобождение ресурсов
for (int i=0; i<size-1; i++)
delete matr[i];
delete matr;

return m;
}

int main() {
// поддержка кириллицы
setlocale(LC_CTYPE, "Russian");

int n; // размерность матрицы
int** a; // заданная матрица
double** b; // обратная матрица
double d; // определитель

cout << "Введите размерность матрицы: ";
cin >> n;
// определяем основную матрицу
a=new int*[n];
for (int i=0; i<n; i++)
a[i]=new int[n];

// определяем обратную матрицу
b=new double*[n];
for (int i=0; i<n; i++)
b[i]=new double[n];

// ввод основной матрицы
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
{
cout << "Введите A[" << i << "," << j << "]: ";
cin >> a[i][j];//a[i,j];
};

d = determ(a, n);
cout << "\nОпределитель равен " << d;

// вычисляем обратную матрицу
// если определитель матрицы равен нулю, то обратная матрица не существует
if (d != 0.0)
{
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
b[i][j]=dopol(j, i, n, a)/d;
// вывод обратной матрицы
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
cout << "\nA[" << i << "," << j << "]= " << b[i][j];
}
else cout << "\nОбратная матрица не существует";

cout << "\n";
// освобождение ресурсов
for (int i=0; i<n; i++)
delete a[i];
delete a;

for (int i=0; i<n; i++)
delete b[i];
delete b;

return 0;
}
Неизвестный
07.01.2011, 17:15
общий
И конечно очень желательно блок схему по программе :)
давно
Профессор
230118
3054
07.01.2011, 21:23
общий
это ответ
Здравствуйте, Svistaplas90!

Это блок-схема вычисления определителя.
Прикрепленные файлы:
Неизвестный
08.01.2011, 00:20
общий
Спасибо огромное :)
Форма ответа