Gauss消去法列主元素消去法及LU分解法的MATLAB实现

Posted slandarer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gauss消去法列主元素消去法及LU分解法的MATLAB实现相关的知识,希望对你有一定的参考价值。

去年的时候写的,整理一下发上来

Gauss消去法

代码:

function x=Gauss_elimination(A,b)
tic
[rows,~]=size(A);
aug_mat=[A,b];
for i=1:rows
    if aug_mat(i,i)~=0
        coefficient=aug_mat(:,i);
        aug_mat(i,:)=aug_mat(i,:)./aug_mat(i,i);
        coefficient=-coefficient;
        coefficient(i)=0;
        aug_mat=coefficient*aug_mat(i,:)+aug_mat;
    else
        aug_mat(:,rows+1:end)=nan;
        break
    end
end
x=aug_mat(:,rows+1:end);
toc
end

实例:
A = [ 2 2 3 4 7 7 − 2 4 5 ] b = [ 3 1 − 7 ] (1) A=\\begin{bmatrix} 2 & 2 & 3 \\\\ 4 & 7 & 7 \\\\ -2 & 4 & 5 \\end{bmatrix} b=\\begin{bmatrix} 3\\\\ 1 \\\\ -7 \\end{bmatrix} \\tag{1} A=242274375b=317(1)
A = [ 2 2 3 4 7 7 − 2 4 5 ] b = [ 1 0 0 0 1 0 0 0 1 ] (2) A=\\begin{bmatrix} 2 & 2 & 3 \\\\ 4 & 7 & 7 \\\\ -2 & 4 & 5 \\end{bmatrix} b=\\begin{bmatrix} 1 & 0 & 0 \\\\ 0 & 1 & 0 \\\\ 0 & 0 & 1 \\end{bmatrix} \\tag{2} A=242274375b=100010001(2)
A = [ 0 1 1 1 ] b = [ 1 2 ] (3) A=\\begin{bmatrix} 0 & 1 \\\\ 1 & 1 \\end{bmatrix} b=\\begin{bmatrix} 1 \\\\ 2 \\end{bmatrix} \\tag{3} A=[0111]b=[12](3)
A = [ 0.0001 1 1 1 ] b = [ 1 2 ] (3) A=\\begin{bmatrix} 0.0001 & 1 \\\\ 1 & 1 \\end{bmatrix} b=\\begin{bmatrix} 1 \\\\ 2 \\end{bmatrix} \\tag{3} A=[0.0001111]b=[12](3)
实例代码:

A1=[2,2,3;4,7,7;-2,4,5];
b1=[3;1;-7];
x1=Gauss_elimination(A1,b1)

A2=[2,2,3;4,7,7;-2,4,5];
b2=eye(3);
x2=Gauss_elimination(A2,b2)

A3=[0,1;1,1];
b3=[1;2];
x3=Gauss_elimination(A3,b3)

A4=[0.0001,1;1,1];
b4=[1;2];
x4=Gauss_elimination(A4,b4)

实例运行结果:
历时 0.001997 秒。
x 1 = [ 2 − 2 1 ] x1=\\begin{bmatrix} 2\\\\ -2\\\\ 1 \\end{bmatrix} x1=221
历时 0.002637 秒。
x 2 = [ 0.1944 0.0556 − 0.1944 − 0.9444 0.4444 − 0.0556 0.8333 − 0.3333 0.1667 ] x2=\\begin{bmatrix} 0.1944 & 0.0556 & -0.1944\\\\ -0.9444 &0.4444 &-0.0556\\\\ 0.8333 &-0.3333&0.1667\\\\ \\end{bmatrix} x2=0.19440.94440.83330.05560.44440.33330.19440.05560.1667
历时 0.000716 秒。
x 3 = [ N a N N a N ] x3=\\begin{bmatrix} NaN\\\\ NaN \\end{bmatrix} x3=[NaNNaN]
历时 0.001793 秒。
x 4 = [ 1.0001 0.9999 ] x4=\\begin{bmatrix} 1.0001\\\\ 0.9999 \\end{bmatrix} x4=[1.00010.9999]
我们发现gauss消去法并不能应对主对角线在过程中出现0的情况,如x3结果,因此我们在之后给出列主元素消去法及LU分解法代码。

列主元素消去法

代码:

function x=principal_element(A,b)
tic
[rows,~]=size(A);
aug_mat=[A,b];
for i=1:rows
    temp_list=aug_mat(:,i);
    temp_list(1:max(1,i-1))=0;
    [~,exchange_pos]=max(abs(temp_list));
    aug_mat([i,exchange_pos],:)=aug_mat([exchange_pos,i],:);
    coefficient=aug_mat(:,i);
    coefficient=-coefficient./coefficient(i);
    coefficient(i)=0;
    aug_mat=coefficient*aug_mat(i,:)+aug_mat;
end
divisor=aug_mat((1:rows)+(0:rows:(rows*(rows-1))))';
aug_mat=aug_mat./divisor;
x=aug_mat(:,rows+1:end);
toc
end

我们发现列主元消去法能够解决x3的情况:

A3=[0,1;1,1];
b3=[1;2];
x3=principal_element(A3,b3)

历时 0.020405 秒。
x 3 = [ 1 1 ] x3=\\begin{bmatrix} 1\\\\ 1 \\end{bmatrix} x3=以上是关于Gauss消去法列主元素消去法及LU分解法的MATLAB实现的主要内容,如果未能解决你的问题,请参考以下文章

Matlab数值微分

高斯消去法与矩阵三角分解法(LU分解)

《数值分析》-- 高斯消去法与矩阵三角分解法(LU分解)

C# 列主元素(Gauss)消去法 计算一元多次方程组

# 零基础入门矩阵

Gauss列主元消去法函数