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=⎣⎡24−2274375⎦⎤b=⎣⎡31−7⎦⎤(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=⎣⎡24−2274375⎦⎤b=⎣⎡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=⎣⎡2−21⎦⎤
历时 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.1944−0.94440.83330.05560.4444−0.3333−0.1944−0.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实现的主要内容,如果未能解决你的问题,请参考以下文章