Решение СЛАУ методом Крамера - C (СИ)
Формулировка задачи:
Нужно написать программу на СИ для решения СЛАУ с помощью метода Крамера.
2x1 - x2 + 3x3 + 2x4 = 4
2x1 + 3x2 + 3x3 + 2x4 = 6
3x1 - x2 - x3 + 2x4 = 6
3x1 - x2 + 3x3 - x4 = 6
Если кому не сложно, помогите плз.
Решение задачи: «Решение СЛАУ методом Крамера»
textual
Листинг программы
#include <stdio.h>
#include <conio.h>
const N=4;
//нахождение детерминанта
float Det(int G, double M[4][4])
{
if (G == 1)
return M[0][0];
else
{
double M1[4][4];
int i, x, X, Y;
float Res = 0;
for (i = 0; i < G; i++)
{
for (Y = 1; Y < G; Y++)
{
x = 0;
for (X = 0; X < G; X++)
if (X != i)
M1[Y-1][x++] = M[Y][X];
}
if (i % 2 == 0)
Res += M[0][i] * Det(G - 1, M1);
else
Res -= M[0][i] * Det(G - 1, M1);
}
return Res;
}
}
//-----------------------------------------------------------------------------
//Вывод на экран матрицы
vyvod(double V[4][4])
{
int i,j;
for (i = 0; i < N; i++)
for (j = 0; j < N; j++)
{
if (j==0) printf("\n");
else printf("\t");
printf("%7.2f", V[i][j]);
}
printf("\n");
}
//создание матрицы и нахождение детерминанта
podstanovka(int k, double M[4][4],double A[4][4],double B[4])
{
int i,j;
for (i=0; i<N; i++)
for (j=0; j<N; j++)
{
M[i][j] = A[i][j];
}
for (i=0; i<N; i++) //подстановка
{ //
//
M[i][k] = B[i]; //
} //
float Opr = Det(4, M);
return Opr;
}
main( )
{
int i,j;
double A[4][4]={{2,-1,3,2},
{2,3,3,2},
{3,-1,-1,2},
{3,-1,3,-1}};
double B[4]={4,6,6,6};
//Вывод на экран исходной матрицы
printf("\nVyvod ishodnoi matricy");
vyvod(A);
//------Нахождение определителя исходной матрицы---------------------------
printf("\nVyvod determinanta ishodnoi matricy\n");
float Op = Det(4, A);
printf("Determinant = %7.2f\n", Op);
//-------------------------------------------------------------------------
//***********************************
//действия над новыми матрицами
double M1[N][N];
float Op1 = podstanovka(0, M1, A, B);
printf("Determinant 1 = %7.2f\n", Op1);
double M2[N][N];
float Op2 = podstanovka(1, M2, A, B);
printf("Determinant 2 = %7.2f\n", Op2);
double M3[N][N];
float Op3 = podstanovka(2, M3, A, B);
printf("Determinant 3 = %7.2f\n", Op3);
double M4[N][N];
float Op4 = podstanovka(3, M4, A, B);
printf("Determinant 4 = %7.2f\n", Op4);
// Вывод решения
printf("\nVyvod resheniya\n");
float x1 = Op1/Op;
printf("X1 = %7.2f\n", x1);
float x2 = Op2/Op;
printf("X2 = %7.2f\n", x2);
float x3 = Op3/Op;
printf("X3 = %7.2f\n", x3);
float x4 = Op4/Op;
printf("X4 = %7.2f\n", x4);
system("pause");
}
Объяснение кода листинга программы
- Объявление переменных и массивов:
- N = 4 (размерность матрицы)
- double M[4][4] (матрица размером 4x4 для хранения исходных данных)
- double A[4][4] (матрица размером 4x4 для хранения исходных данных)
- double B[4] (вектор размером 1x4 для хранения данных)
- В функции main():
- Вывод исходной матрицы A с помощью функции vyvod(A)
- Вычисление определителя исходной матрицы A с помощью функции Det(4, A) и вывод результата с помощью функции printf()
- Создание новой матрицы M1 размером 4x4 с помощью функции podstanovka(0, M1, A, B) и вычисление определителя этой матрицы
- Создание новой матрицы M2 размером 4x4 с помощью функции podstanovka(1, M2, A, B) и вычисление определителя этой матрицы
- Создание новой матрицы M3 размером 4x4 с помощью функции podstanovka(2, M3, A, B) и вычисление определителя этой матрицы
- Создание новой матрицы M4 размером 4x4 с помощью функции podstanovka(3, M4, A, B) и вычисление определителя этой матрицы
- Вычисление значений x1, x2, x3 и x4 с помощью формулы xi = Opi / Op и вывод результатов с помощью функции printf()
- В функции Det():
- Рекурсивный алгоритм для вычисления определителя матрицы. Если размерность матрицы равна 1, то возвращается значение элемента главной диагонали. В противном случае создается новая матрица M1, заполняемая значениями элементов исходной матрицы, исключая главный элемент. Затем рекурсивно вызывается функция Det() для M1. Если размерность матрицы четная, то к результату добавляется произведение главного элемента и определителя матрицы M1. Если размерность матрицы нечетная, то от результата нужно отнять произведение главного элемента и определителя матрицы M1.
- В функции podstanovka():
- Создание новой матрицы M с помощью функции podstanovka()
- Заполнение новой матрицы M значениями элементов исходной матрицы A
- Подстановка в новую матрицу M элементов вектора B с помощью цикла for
- Вычисление определителя новой матрицы M с помощью функции Det()
- Возврат значения определителя новой матрицы M
- В функции vyvod():
- Цикл for для вывода элементов матрицы на экран
- Использование функции printf() для форматирования вывода
- В функции main() после вызова функции podstanovka() происходит вывод решения с помощью функции printf()