Gauss消去法、列主元素消去法及LU分解法的MATLAB实现
去年的时候写的,整理一下发上来Gauss消去法代码:function x=Gauss_elimination(A,b)tic[rows,~]=size(A);aug_mat=[A,b];for i=1:rowsif aug_mat(i,i)~=0coefficient=aug_mat(:,i);aug_mat(i,:)=aug_mat(i,:)./aug_mat(i,i);coefficient=
去年的时候写的,整理一下发上来
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=[11]
LU分解法
第一部分:矩阵LU分解
function [L,U]=LU(A)
[rows,~]=size(A);
temp_mat=A;
L=zeros(rows);
for i=1:rows
coefficient=temp_mat(:,i);
coefficient=coefficient./coefficient(i);
coefficient(1:i)=0;
L(:,i)=coefficient;
temp_mat=-coefficient*temp_mat(i,:)+temp_mat;
end
U=temp_mat;
L(eye(rows)==1)=1;
end
第二部分:依据LU矩阵求解线性方程组
function x=LUsolve(L,U,b)
[rows,~]=size(L);
aug_mat=[L,b];
for i=1:rows
aug_mat(i,:)=aug_mat(i,:)./aug_mat(i,i);
coefficient=-aug_mat(:,i);
coefficient(1:i)=0;
aug_mat=coefficient*aug_mat(i,:)+aug_mat;
end
aug_mat=[U,aug_mat(:,rows+1:end)];
for i=rows:-1:1
aug_mat(i,:)=aug_mat(i,:)./aug_mat(i,i);
coefficient=-aug_mat(:,i);
coefficient(i:end)=0;
aug_mat=coefficient*aug_mat(i,:)+aug_mat;
end
x=aug_mat(:,rows+1:end);
end
使用方法:以问题(1)为例
A=[2,2,3;4,7,7;-2,4,5];
b=[3;1;-7];
[L,U]=LU(A)
x=LUsolve(L,U,b)
求解结果:
L
=
[
1
0
0
2
1
0
−
1
2
1
]
U
=
[
2
2
3
0
3
1
0
0
6
]
x
=
[
2
−
2
1
]
L=\begin{bmatrix} 1 &0 & 0\\ 2 &1 &0\\ -1 &2 & 1\\ \end{bmatrix} U=\begin{bmatrix} 2 & 2 & 3\\ 0 & 3 & 1\\ 0 & 0 & 6\\ \end{bmatrix} x=\begin{bmatrix} 2\\ -2\\ 1 \end{bmatrix}
L=⎣⎡12−1012001⎦⎤U=⎣⎡200230316⎦⎤x=⎣⎡2−21⎦⎤
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)