Матрица: уменьшение Гаусса - PullRequest
1 голос
/ 10 апреля 2020

Я пытаюсь заставить работать функцию MATLAB, которая принимает в качестве входных данных матрицу и возвращает триангулированную матрицу. Это функция:

function T = gauss_method(A)

    [row, col] = size(A);

    T = zeros(size(A));

    for j = 1:col-1
        perno = A(j,j);

        for i = j+1:row
            mult = A(i,j) / perno;
            for x=i:col
                T(i,:) = A(i,:) - mult * A(j,:);
            end
        end
    end

Ввод:

A = [3  1 -1   0;
     0  7 -3   0;
     0 -3  9  -2;
     0  0  4 -10];

Ввод:

0         0         0         0
0    7.0000   -3.0000         0
0         0    7.7143   -2.0000
0    1.3333         0   -9.1111

Почему это не работает? Где ошибки?

1 Ответ

2 голосов
/ 11 апреля 2020

Ваша реализация близка к Гауссу. Однако некоторые детали сломаны. Давайте попробуем назвать их:

  • Гаусс является рекурсивным методом в том смысле, что каждый шаг зависит от предыдущих. Поэтому сборка T из A без обновления A не может работать. Решение: Я предлагаю работать на месте, но вы также можете сослаться на T справа от вашего уравнения сборки.
  • Вы никогда не трогаете первую строку T как вы начинаете с j = 1 и i = j + 1. Решение: Одним из решений может быть первоначальное копирование первой строки с A в T или вместо этого работа на месте.
  • Вы берете элемент поворота (perno) из диагональный элемент. Однако не сказано, что все A(i,i) ~= 0. При делении на pernot вы вводите потенциальное деление на 0. Решение: Вы можете вообще избежать деления при реализации Гаусса. Просто масштабируйте другую линию. В конце концов, речь идет о приведении A к форме треугольника с помощью любой формы линейной комбинации.
  • Говоря о Гауссе, я лично имею в виду решение системы линейных уравнений A * x = b. Предложение: Возможно, вы захотите включить это, предоставив своей функции необязательный аргумент b и преобразовав его вместе с A.
  • Интервал довольно нарушен, но, надеюсь, это будет исправлено с выдающимся редактированием вашего вопроса. Предложение: Никогда не используйте вкладки для отступов.

Одно предложение, как исправить вашу реализацию, приближаясь к текущей версии:

function A = gauss_method(A)
    [row, col] = size(A);
    for j = 1:col-1
        perno = A(j,j);
        for i = j+1:row
            % alternative w/o division:
            %  A(i,:) = perno * A(i,:) - A(i,j) * A(j,:);

            % alternative w/ division:
            if A(i,j) ~= 0
                mult = perno / A(i,j);
                A(i,:) = mult * A(i,:) - A(j,:);
            end
        end
    end
end

Вывод:

>> gauss_method(A)

ans =

    3.0000    1.0000   -1.0000         0
         0    7.0000   -3.0000         0
         0         0  -18.0000    4.6667
         0         0         0   40.3333
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...