Тема: Яким чином добути корені матриці?
Є код, який зводить елементи під головною діагоналлю до 0. Працює не завжди, але для наочності підійде:
#include <stdio.h>
#include <math.h>
main()
{
int i, j, k, l, m, col, row;
float a;
col = row = 0;
printf("Gauss Elimination Method to Solve Linear Equations\n");
printf(" 01 02 03 .. = C\n");
printf("01 aa + ab + ac + .. = b1\n");
printf("02 ba + bb + bc + .. = b2\n");
printf("03 ca + cb + cc + .. = b3\n");
printf(" .. + .. + .. + .. = ..\n");
printf(" R tR + tR + tR + .. = tC\n\n");
printf("\nInput number of Coloumns:\n");
scanf("%i", &col);
printf("\nInput number of Rows:\n");
scanf("%i", &row);
float matrix[row][col], root[col-1];
printf("\nInput matrix elements:\n");
for(i = 0; i < row; i++)
for(j = 0; j < col; j++)
scanf("%4f", &matrix[i][j]);
for(i = 0; i < row; i++){
for(j = 0; j < col; j++)
printf("%.3f ", matrix[i][j]);
putchar('\n');
}
printf("\nStep 1: Leading all members under main diagonal to null\n\n");
for(i = 1; i < row; i++){
for(j = 0; j < i; j++){
a = - (double) (matrix[j][j] / matrix[i][j]);
for(k = 0; k < col; k++){
matrix[i][k] = matrix[i][k] * a + matrix[j][k];
}
matrix[i][j] = fabs(matrix[i][j]);
for(l = 0; l < row; l++){
for(m = 0; m < col; m++)
printf("%.3f ", matrix[l][m]);
putchar('\n');
}
putchar('\n');
}
}
printf("%f", a);
return 0;
}
Якщо матриця нормальна, то до елементи нижче головної діагоналі будуть зведені до нуля правильно.
Залишилось тільки придумати як добути корені.
Проблема в тому що матриця універсальна, тому і алгоритм для кожного розміру буде різний, наприклад:
2x3
[00] x = ([02] - 00000 - [01]y)/[00]
[11] y = ([12] - [10]x - 00000)/[11]
3x4
[00] x = ([03] - 00000 - [01]y - [02]z)/[00]
[11] y = ([13] - [10]x - 00000 - [12]z)/[11]
[22] z = ([23] - [20]x - [21]y - 00000)/[22]
4x5
[00] x = ([04] - 00000 - [11]y - [12]z - [13]w)/[00]
[11] y = ([14] - [10]x - 00000 - [12]z - [13]w)/[11]
[22] z = ([24] - [20]x - [21]y - 00000 - [23]w)/[22]
[33] w = ([34] - [30]x - [31]y - [32]z - 00000)/[33]
Можна як варіант сказати що максимальний розмір рядків і стовпчиків там 10x10, написати довгий алгоритм для знаходження 10 коренів, а при підстановці зайві просто будуть дорівнювати нулю, вивести можна буде лише ті що будуть дорівнювати кількості рядків.
Але може є ліпші варіанти? Які ідеї?