algorithm - LU分解方阵matlab高斯消元

标签 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(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)
  2. 我找到第 1 列中最大的数字,然后换行
  3. 使用高斯消元法对第 1 列进行评分,将点 (1,1) 以外的所有值都归零
  4. 轴心现在是 (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

(您还应该使用 errorwarning 而不是您如何使用 disp 检查行列式,但他们可能不会教这些。)

关于algorithm - LU分解方阵matlab高斯消元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17776191/

相关文章:

database - 从数据库表增量导出记录

MATLAB/Opencv : Converting 24 bit RGB image to 16 bit gray

matrix - 基于 GF 的矩阵编程库

r - 递归矩阵的快速叉积

java - 为简单的支持 vector 机计算拉格朗日乘数

algorithm - 在没有任何负前缀的图中找到最短路径

sql - 将每行的值除以该列的 SUM

javascript - 如何在javascript中建立计数和说出问题

matlab - 灰度共现特征与方程不匹配

python - 为什么 RGB 图像上的 python cv2.resize 函数给出的结果与 MATLAB imresize 函数不同?