我正在尝试制作一个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
为什么它不起作用?错误在哪里?
您的实现接近高斯。但是,有些零件坏了。让我们试着命名它们:
- 高斯是一种递归方法,从某种意义上说,每一步都取决于前面的步骤。因此,在不更新
A
的情况下从A
组装T
是不可行的解决方案:我建议就地工作,但您也可以参考组装方程右侧的T
- 当您从
j = 1
和i = j + 1
开始时,您永远不会触摸T
的第一行解决方案:一种解决方案可以是最初将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