• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

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

  • Автор темы iScream
  • Дата начала
Статус
Закрыто для дальнейших ответов.
I

iScream

Вообщем, ребят, такая проблема. Учусь на заочном отделении технического вуза. Специальность, ну, никаким образом не связана с программированием, но, как посчитали люди, составляющие программу обучения, для общего развития надо знать поверхностно С++ (боже мой, какой бред). Главное сделать, сдавать - да, каким-нибуддь образом сдам. Так как моё знание компьютера ограничивается поверхностным знанием МС оффис и не вылазит за пределы обновления антивируса ^^, хочу обратиться к вам за помощью. Задача состоит в следующем:
Решить систему уравнений с помощью обратной матрицы:

Работа выполняется на языке С в интегрированной среде Borland C++ (вер. 3.1) или как консольное приложение в среде Borland C++ Builder (вер. 5 или 6). Преподаватель сказал, что в среде Borland C++ Builder проще сделать...
Буду очень признателен всем, кто протянет руку помощи.
 
I

iScream

Сначала решение опубликуйте=)
Код:
#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;

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!