Algorithm 基于matlab高斯消元法的平方矩阵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

我正在尝试创建一个程序,以一个平方(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
函数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

守则解释:

  • 首先我检查矩阵是否可逆,如果不是,停止。如果是,则枢轴为(1,1)
  • 我在第1列中找到最大的数字,并切换行
  • 使用高斯消去法为列1评分,将除点(1,1)外的所有点都归零
  • Pivot现在是(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的函数确认您的正确性:

    [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