ВОПРОС · Q&A

Решить систему уравнений с помощью обратной матрицы

3 ответов 6,9 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Статус
Закрыто для дальнейших ответов.
Автор вопроса
Вообщем, ребят, такая проблема. Учусь на заочном отделении технического вуза. Специальность, ну, никаким образом не связана с программированием, но, как посчитали люди, составляющие программу обучения, для общего развития надо знать поверхностно С++ (боже мой, какой бред). Главное сделать, сдавать - да, каким-нибуддь образом сдам. Так как моё знание компьютера ограничивается поверхностным знанием МС оффис и не вылазит за пределы обновления антивируса ^^, хочу обратиться к вам за помощью. Задача состоит в следующем:
Решить систему уравнений с помощью обратной матрицы:
www.radikal.ru
Работа выполняется на языке С в интегрированной среде Borland C++ (вер. 3.1) или как консольное приложение в среде Borland C++ Builder (вер. 5 или 6). Преподаватель сказал, что в среде Borland C++ Builder проще сделать...
Буду очень признателен всем, кто протянет руку помощи.
 
спс, решение найдено. тема маст би клосед :rolleyes:
 
Сначала решение опубликуйте=)
 
Сначала решение опубликуйте=)
Код:
#include <stdio.h>

#define N 3	// Размерность матрицы

/*
*	Определитель м-цы 2x2
*/
double GetDet2( double x[][2] ) {

return x[0][0]*x[1][1]-x[0][1]*x[1][0];

}


/*
* Вычисление алгебраического дополнения к эл-ту a[i0][j0]
*/
double GetAlgDop( double a[][N], int i0, int j0 ) {

int i, iDop, j, jDop;
double aDop[N-1][N-1];

iDop = 0;
for (i = 0; i < N; i++ ) {
if ( i == i0 )
continue;	 // Пропускаем строку i0
jDop = 0;
for ( j = 0; j < N; j++ ) {
if ( j == j0 )
continue; // Пропускаем столбец j0
aDop[iDop][jDop] = a[i][j];
++jDop;
}
++iDop;
}

if ( (i0+j0) % 2 == 0 )
return GetDet2( aDop );
else
return -GetDet2( aDop );

}



/*
* Печать матрицы n x m
*/
void PrintMatrix( double* x, // Адрес первого эл-та м-цы, которую нужно распечатать
int n,	// К-во строк в м-це, 
int m	 // К-во столбцов
) {

int i;

for (i = 0; i < n*m; i++ ) {
printf( "%6.1g", x[i] );
if ( (i+1) % m == 0 )
printf( "\n" );
}

}


int main() {

int	 i, j;
double a[N][N] = {1., 2., 1.,
3., -5., 3.,
2., 7., -1. };
double aM1[N][N]; // Обратная матрица
double x[N];	 // Решение
double b[N] = {4., 1., 8.}; // Свободные члены
double det = 0;			// Определитель исх. м-цы

// Исходная матрица
printf( "Исходная м-ца:\n" );
PrintMatrix( &a[0][0], N, N );

// Столбец свободных членов
printf( "Столбец свободных членов:\n" );
PrintMatrix( &b[0], N, 1 );

// Определитель
for ( j = 0; j < N; j++ )
det = det + a[0][j]*GetAlgDop( a, 0, j );
printf( "Det = %6.1g\n", det );
if ( det == 0. ) {
printf( "Вырожденная матрица к-тов!\n" );
return -1;
}

// Обратная м-ца
for ( i = 0; i < N; i++ )
for ( j = 0; j < N; j++ ) 
// Сразу и транспонируем
aM1[j][i] = GetAlgDop( a, i, j ) / det;

printf( "Обратная м-ца:\n" );
PrintMatrix( &aM1[0][0], N, N );

// Решение
for ( i = 0; i < N; i++ ) {
x[i] = 0.;
for ( j = 0; j < N; j++ ) 
x[i] = x[i] + aM1[i][j] * b[j];
}

printf( "Решение:\n" );
PrintMatrix( &x[0], N, 1 );
printf( "\n" );

return 0;

}
 
Статус
Закрыто для дальнейших ответов.