1 Востаннє редагувалося Ярослав (14.11.2012 16:16:53)

Тема: Зведення до нуля всіх елементів n x n матриці нижче головної діагоналі

Пишу програмку для вирішення матриці методом Гауса.
Метод використовую із цієї теми.
Множимо елементи які необхідно звести до нуля, на таке число а, щоб при додаванні відповідного члену попереднього рядка вийшов 0.
Хочу зробити програму універсальною, тому використовую наступну функцію:

    
for(i = 1; i < row; i++){ //Змінну i використовуємо для визначення рядка, над яким зараз працюємо
        for(j = 0; j < i; j++){ //Змінну j використовуємо для позначення головної діагоналі
            a = - (double) (matrix[j][j] / matrix[i][j]); 
            for(k = 0; k < col; k++){//Цикл призначений для проходження всього рядка
                matrix[i][k] = ( matrix[i][k] * a ) + matrix[i-1][k];
            }
            matrix[i][j] = fabs(matrix[i][j]);//Використовуємо модуль для члену, який зводиться до нуля
        }
    }

http://replace.org.ua/misc.php?action=pun_attachment&amp;item=43&amp;download=0
row - рядки
col - колонки
Перший член другого рядка правильно зводиться до нуля, перший член третього рядка теж, а от після зведення другого члена третього рядка до нуля отримуємо наступний вивід:

Step 1: Leading all members under main diagonal to null
1.00000 2.00000 3.00000 4.00000
0.00000 0.50000 1.00000 1.50000
0.60000 0.00000 0.60000 1.20000
-1.30000 -1.25000 0.00000 -1.25000
-2.500000Press any key to continue...

При чому після зведення другого члена третього рядка до нуля a = 0.60000.

В прикладі матриця 4 х 4
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
Що не так із функцією?

Post's attachments

matrix v2.JPG 9.11 kb, 293 downloads since 2012-11-14 

2

Re: Зведення до нуля всіх елементів n x n матриці нижче головної діагоналі

А можна повний текст програми? В шматку коду нічого не побачив.

3 Востаннє редагувалося Ярослав (14.11.2012 23:22:53)

Re: Зведення до нуля всіх елементів n x n матриці нижче головної діагоналі

#include <stdio.h>
#include <math.h>

main()
{
    int i, j, k, 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];

    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");
        
    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[i-1][k];
            }
            matrix[i][j] = fabs(matrix[i][j]);
        }
    }
    
    for(i = 0; i < row; i++){
        for(j = 0; j < col; j++)
            printf("%.5f ", matrix[i][j]);
        putchar('\n');
    }
    printf("%f", a);
    return 0;
}

Якщо щось не ясно в самому принципі підрахунку - звертайтесь - я поясню.

4

Re: Зведення до нуля всіх елементів n x n матриці нижче головної діагоналі

не

matrix[i][k] = ( matrix[i][k] * a ) + matrix[i-1][k];

а

matrix[i][k] = matrix[i][k] * a + matrix[j][k];

матрицю краще брати щось типу:

1 2 3 4
2 3 4 1
3 4 1 2
4 1 2 3

5 Востаннє редагувалося Ярослав (16.11.2012 17:25:06)

Re: Зведення до нуля всіх елементів n x n матриці нижче головної діагоналі

Протестував на 3 х 3 матриці
1 5 8
3 4 1
2 8 7
Працює коректно.