我尝试编写一个使用高斯消除进行LU分割的程序。我的程序将矩阵A分成A = LR,其中L,R是三角矩阵。这非常有效。设Ax = b是方程组。我对程序的输入是(A,b),我想要完成的操作是将上三角矩阵R应用于b,就像我们在学校用来解决使用高斯消元法的系统一样。那部分似乎没有用。
有人可以给我一个提示,说明它不起作用吗?
function [ x ] = Gauss( A,b )
n=length(b);
for j=1:n-1
if A(j,j)==0
break;
end;
for i=j+1:n
A(i,j)=A(i,j)/A(j,j);
b(j)=b(i)-A(i,j)*b(j)
for k=j+1:n
A(i,k)=A(i,k)-A(i,j)*A(j,k);
end
end
end
b
end
答案 0 :(得分:1)
你说你的代码正确地创建了A的上三角矩阵,但它并没有。让我举个例子。
让A和b成为
A =
3 2 3 4
4 3 2 1
1 0 4 0
0 5 0 3
b =
2
4
6
7
如果我们按原样运行您的代码并查看A和b,我们就会
A =
3.0000 2.0000 3.0000 4.0000
1.3333 0.3333 -2.0000 -4.3333
0.3333 -2.0000 -1.0000 -10.0000
0 15.0000 -30.0000 -232.0000
b =
7.0000
-203.0000
187.0000
7.0000
既不是三角矩阵,也不是我们预期的b。但是,如果我们稍微修改你的程序:
function [ x ] = Gauss( A,b )
n=length(b);
for j=1:n-1
if A(j,j)==0
break;
end;
for i=j+1:n
f=A(i,j)/A(j,j); %%Save the proportion between the rows in a
%%different variable outside the matrix, or
%%you will loose the value that was originally there
b(i)=b(i)-f*b(j); %%The operation has to be done in the row you are currently working
for k=1:n %%You have to make the operation in the full row,
%%not only in the remaining columns, also you can
%%make this without a for loop using `:`
%%indexing, but if you dont know about it,
%%leave as it is, it works
A(i,k)=A(i,k)-f*A(j,k);
end
end
end
A
b
end
你得到这个结果
A =
3.0000 2.0000 3.0000 4.0000
0 0.3333 -2.0000 -4.3333
0 0 -1.0000 -10.0000
0 0 0 -232.0000
b =
2.0000
1.3333
8.0000
227.0000
这是一个上三角矩阵,我们想要的是b。希望你能从这里拿走它,作为参考,接下来的步骤应该是这样的
A =
1.0000 0.6667 1.0000 1.3333
0 1.0000 -6.0000 -13.0000
0 0 1.0000 10.0000
0 0 0 1.0000
b =
0.6667
4.0000
-8.0000
-0.9784
然后
A =
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
b =
-1.1379
1.9871
1.7845
-0.9784
其中A已经是一个单位矩阵,这意味着b已经是我们的答案,我们可以证实这一点
A\b
ans=
-1.1379
1.9871
1.7845
-0.9784