@kornietsbk

Почему вычисление треугольной матрицы методом Гаусса-Жордана работает через раз?

Программа вычисляет треугольную матрицу выше второго порядка(в дальнейшем по диагонали будем вычисляться диагональ ).
Обработку нулей на диагонали реализую потом. Матрица заполняется таким образ, что нулей нигде не возникает.
Вычисление матрицы точнее тогда, когда матрица меньшего порядка или когда матрица заполнена "удобными" для расчета числами.
Иногда значение элемента матрицы = -0, а иногда не происходит вычитание
Подскажите, как сделать, чтобы работало как нужно?
#include <iostream>
#include <time.h>


int main(){
    srand(time(nullptr));

    float** mtrx;
    int power;
    std::cout<<"Enter power: ";
    std::cin>>power;


    mtrx = new float*[power];
    for(int i = 0; i < power; i++){
        mtrx[i] = new float[power];
        for(int j = 0; j < power; j++){
            mtrx[i][j] = rand()%10 + 1;
        }
    }
    std::cout<<"Matrix:"<<std::endl;
    for(int i = 0; i < power; i++){
        for(int j = 0; j < power; j++){
            std::cout<<mtrx[i][j]<<" ";
        }
        std::cout<<std::endl;
    }
    std::cout<<std::endl<<std::endl;


    for(int col = 0; col < power-1; col++){
        for(int str = power-1; str>0; str--){
            if(mtrx[str][col] != 0.0){
                if(str - 1 >= 0 && mtrx[str-1][col] != 0){
                    float coeff = mtrx[str][col]/mtrx[str-1][col];
                    std::cout<<"Coeff: "<<coeff<<std::endl;
                    for(int col_num = 0; col_num < power ;col_num++){
                        mtrx[str - 1][col_num] *= coeff;
                    }
                    for(int col_num = col;col_num <str; col_num++){
                        mtrx[str][col_num] -= mtrx[str-1][col_num];
                    }
                }
            }
            
    }


    




    for(int i = 0; i < power; i++){
        for(int j = 0; j < power; j++){
            std::cout<<mtrx[i][j]<<" ";
        }
        std::cout<<std::endl;
    }


    return 0;
}
<code lang="cpp">

</code>
  • Вопрос задан
  • 235 просмотров
Пригласить эксперта
Ответы на вопрос 1
hint000
@hint000
у админа три руки
Всего пара замечаний.
Во-первых, в строке if(str - 1 >= 0 && mtrx[str-1][col] != 0){ можно невозбранно выкинуть str - 1 >= 0, это условие у вас всегда выполняется, потому что двумя строками выше условие выполнения цикла: str>0;
Во-вторых, используйте double вместо float и результаты работы программы чудесным образом улучшатся.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы