Algorithm 基于matlab高斯消元法的平方矩阵LU分解
我正在尝试创建一个程序,以一个平方(n×n)矩阵作为输入,如果它是可逆的,LU将使用高斯消去法分解矩阵 这是我的问题:在课堂上,我们了解到最好是改变行,使您的轴始终是其列中最大的数字(绝对值)。例如,如果矩阵是Algorithm 基于matlab高斯消元法的平方矩阵LU分解,algorithm,matlab,linear-algebra,matrix-decomposition,Algorithm,Matlab,Linear Algebra,Matrix Decomposition,我正在尝试创建一个程序,以一个平方(n×n)矩阵作为输入,如果它是可逆的,LU将使用高斯消去法分解矩阵 这是我的问题:在课堂上,我们了解到最好是改变行,使您的轴始终是其列中最大的数字(绝对值)。例如,如果矩阵是A=[1,2;3,4],则切换行是[3,4;1,2],然后我们可以继续进行高斯消去 我的代码适用于不需要行更改的矩阵,但对于需要行更改的矩阵,则不需要。这是我的代码: function newgauss(A) [rows,columns]=size(A); P=eye(ro
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
函数newgauss(A)
[行、列]=大小(A);
P=眼(行、列);%P是置换矩阵
如果(det(A)=0)%%行列式为0,则表示没有单一解
disp('无解或无穷多解')
返回;
结束
U=A;
L=眼(行、列);
枢轴=1;
while(pivotmax)
最大值=绝对值(U(i,枢轴));
maxi=i;
结束
如果需要,结束%%,然后切换
if(maxi~=0)
温度=U(枢轴,:);
U(pivot,:)=U(maxi,:);
U(最大值:)=温度;
温度=P(枢轴,:);
P(pivot,:)=P(maxi,:);
P(maxi,:)=温度;
使用高斯消去法结束对柱轴的%%Grade
对于i=pivot+1:行
num=U(i,枢轴)/U(枢轴,枢轴);
U(i,:)=U(i,:)-num*U(pivot,:);
L(i,pivot)=num;
结束
枢轴=枢轴+1;
结束
disp(‘PA为:’);
disp(P*A);
disp(‘LU为:’);
disp(L*U);
结束
澄清:因为我们正在切换行,所以我们希望分解p
(排列矩阵)乘以A
,而不是原来作为输入的A
守则解释:
据我所知,您的代码似乎运行良好,至少对于基本示例
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的函数确认您的正确性:
[L,U,P] = lu(A);
L*U
P*A
是正交矩阵,所以p−1=磅。如果要在代码中返回A
,可以执行以下操作:
P'*L*U
[L,U,P] = lu(A);
P'*L*U
类似地,使用Matlab的lu
和置换矩阵输出,您可以执行以下操作:
P'*L*U
[L,U,P] = lu(A);
P'*L*U
(在检查行列式时,你也应该使用or,而不是使用
disp
,但他们可能不会教你这一点。)据我所知,你的代码似乎运行良好,至少对于基本示例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的函数确认您的正确性:
[L,U,P] = lu(A);
L*U
P*A
是正交矩阵,所以p−1=磅。如果要在代码中返回A
,可以执行以下操作:
P'*L*U
[L,U,P] = lu(A);
P'*L*U
类似地,使用Matlab的lu
和置换矩阵输出,您可以执行以下操作:
P'*L*U
[L,U,P] = lu(A);
P'*L*U
(在检查行列式时,您还应该使用or,而不是使用disp
的方式,但他们可能不会教您这一点。)注意,函数是使用LU分解本身来实现的,以计算行列式。。。(任何人:)
除此之外,本页末尾还有一个提示,建议使用而不是det
来测试矩阵奇异性:
使用abs(det(X))测试奇异性请注意,函数是使用LU分解本身来实现的,以计算行列式。。。(任何人:)
除此之外,本页末尾还有一个提示,建议使用而不是det
来测试矩阵奇异性:
使用abs(det(X))测试奇点,以供将来发现并需要有效解决方案的人员使用: 在创建置换矩阵
p
时,OP的代码不包含L
中切换元素的逻辑。与Matlab的lu(A)
函数输出相同的调整后代码为:
function [L,U,P] = newgauss(A)
[rows,columns]=size(A);
P=eye(rows,columns); %P is permutation matrix
tol = 1E-16; % I believe this is what matlab uses as a warning level
if( rcond(A) <= tol) %% bad condition number
error('Matrix is nearly singular')
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;
% change elements in L-----
if pivot >= 2
temp=L(pivot,1:pivot-1);
L(pivot,1:pivot-1)=L(maxi,1:pivot-1);
L(maxi,1:pivot-1)=temp;
end
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
end
函数[L,U,P]=newgauss(A)
[行、列]=大小(A);
P=眼(行、列);%P是置换矩阵
tol=1E-16;%我相信这就是matlab用来作为警告级别的东西
如果(rcond(A)=2
温度=L(枢轴,1:枢轴-1);
L(pivot,1:pivot-1)=L(maxi,1:pivot-1);
L(最大值,1:pivot-1)=温度;
结束
使用高斯消去法结束对柱轴的%%Grade
对于i=pivot+1:行
num=U(i,枢轴)/U(枢轴,枢轴);
U(i,:)=U(i,:)-num*U(pivot,:);
L(i,pivot)=num;
结束
枢轴=枢轴+1;
结束
结束
希望这能帮助将来遇到这种情况的人。对于将来发现这种情况并需要有效解决方案的人: 创建置换矩阵
p
时,OP的代码不包含L
中切换元素的逻辑。调整后的代码与Matlab的lu(A)
函数的输出相同:
function [L,U,P] = newgauss(A)
[rows,columns]=size(A);
P=eye(rows,columns); %P is permutation matrix
tol = 1E-16; % I believe this is what matlab uses as a warning level
if( rcond(A) <= tol) %% bad condition number
error('Matrix is nearly singular')
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;
% change elements in L-----
if pivot >= 2
temp=L(pivot,1:pivot-1);
L(pivot,1:pivot-1)=L(maxi,1:pivot-1);
L(maxi,1:pivot-1)=temp;
end
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
end
函数[L,U,P]=newgauss(A)
[行、列]=大小(A);
P=眼(行、列);%P是置换矩阵
tol=1E-16;%I