Ваша реализация близка к Гауссу. Однако некоторые детали сломаны. Давайте попробуем назвать их:
- Гаусс является рекурсивным методом в том смысле, что каждый шаг зависит от предыдущих. Поэтому сборка
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