矩阵:高斯归约



我正在尝试制作一个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 = 1i = 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

相关内容

  • 没有找到相关文章