我正在尝试创建一个程序,将方阵(n×n)作为输入,如果它是可逆的,LU 是否会使用高斯消元法分解矩阵。
这是我的问题:在类里面我们了解到最好更改行,以便您的主元始终是其列中的最大数字(绝对值)。例如,如果矩阵是 A = [1,2;3,4]
然后切换行它是 [3,4;1,2]
然后我们可以进行高斯消元。
我的代码适用于不需要行更改的矩阵,但对于需要行更改的矩阵则不需要。这是我的代码:
function newgauss(A)
[rows,columns]=size(A);
P=eye(rows,columns); %P is permutation matrix
if(det(A)==0) %% determinante is 0 means no single solution
disp('No solutions or infinite number of solutions')
return;
end
U=A;
L=eye(rows,columns);
pivot=1;
while(pivot<rows)
max=abs(U(pivot,pivot));
maxi=0;%%find maximum abs value in column pivot
for i=pivot+1:rows
if(abs(U(i,pivot))>max)
max=abs(U(i,pivot));
maxi=i;
end
end %%if needed then switch
if(maxi~=0)
temp=U(pivot,:);
U(pivot,:)=U(maxi,:);
U(maxi,:)=temp;
temp=P(pivot,:);
P(pivot,:)=P(maxi,:);
P(maxi,:)=temp;
end %%Grade the column pivot using gauss elimination
for i=pivot+1:rows
num=U(i,pivot)/U(pivot,pivot);
U(i,:)=U(i,:)-num*U(pivot,:);
L(i,pivot)=num;
end
pivot=pivot+1;
end
disp('PA is:');
disp(P*A);
disp('LU is:');
disp(L*U);
end
说明:因为我们要切换行,所以我们希望分解 P
(置换矩阵)次 A
,而不是原始的 A
我们有作为输入。
代码解释:
- 首先我检查矩阵是否可逆,如果不是,则停止。如果是,则枢轴为 (1,1)
- 我找到第 1 列中最大的数字,然后换行
- 使用高斯消元法对第 1 列进行评分,将点 (1,1) 以外的所有值都归零
- 轴心现在是 (2,2),找到第 2 列中的最大数字...冲洗,重复
最佳答案
据我所知,您的代码似乎运行良好,至少对于基本示例 A=[1,2;3,4]
或 A=[3,4; 1,2]
。将您的函数定义更改为:
function [L,U,P] = newgauss(A)
这样您就可以输出您的计算值(比使用 disp
好得多,但这也显示了正确的结果)。然后你会看到 P*A = L*U
。也许您期望 L*U
直接等于 A
?您还可以通过 Matlab 的 lu
确认您是正确的功能:
[L,U,P] = lu(A);
L*U
P*A
Permutation matrices是正交矩阵,所以 P−1 = PT。如果你想在你的代码中取回 A
,你可以这样做:
P'*L*U
类似地,将 Matlab 的 lu
与置换矩阵输出一起使用,您可以:
[L,U,P] = lu(A);
P'*L*U
关于algorithm - LU分解方阵matlab高斯消元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17776191/