1.高斯消去法
有一般方程:Ax=b;
![](https://i-blog.csdnimg.cn/blog_migrate/2fdc92d8f9d95c480f8b293c05e4c5fb.png)
正常思路消元到最后,可以求出 ,回带之前的方程,可以解出
.
![](https://i-blog.csdnimg.cn/blog_migrate/899886dc9c6c371e31e61650844f70fe.png)
但是一旦数据规模大了,那么便很麻烦,很难求解。
Gauss消元法的本质是将 矩阵A分解为 L* U .L是一下三角矩阵,U是一上三角矩阵.
A为未知数的初始矩阵,消元的过程可以用矩阵L来替代,
消到最后有
最后的就是图2.
令 . 则
由于最后得到的矩阵 是上三角矩阵,把
记为
, 可得
, 所以我们只需要求解L矩阵,U矩阵就可以了。
2.LU分解
将系数矩阵A转变成等价两个矩阵L和U的乘积 ,其中L和U分别是单位下三角矩阵和上三角矩阵。当A的所有顺序主子式都不为0时,矩阵A可以分解为A=LU(所有顺序主子式不为0,矩阵不一定不可以进行LU分解)。其中L是下三角矩阵,U是上三角矩阵。
Doolittle直接分解法
例题:
求得的L矩阵,U矩阵
LU分解的代码如下:
% 输入矩阵x=[A,b]; Ax=b;
A=[1 2 3;2 2 8;-3 -10 -2];b=[0;-4;-11];
%x=[A,b];
n=length(A);%A的行数
%LU分解
U=zeros(n);L=eye(n,n);
% 共n次循环,每一次循环先求出U的这一行的全部数据,求出L的这一列的全部数据
for i=1:n
%求出U的这一行的数据
row=i;
for col=row:n
sum=0;
%U第row行第col列
for k=1:row-1
sum=sum+L(row,k)*U(k,col);
end
U(row,col)=A(row,col)-sum;
end
%求出L的这一列的全部数据
col=i;
%第col列第row行
for row=col+1:n
sum=0;
for k=1:col-1
sum=sum+L(row,k)*U(k,col);
end
L(row,col)=(A(row,col)-sum)/U(col,col);
end
end
L
U
3.高斯消元法的回带
L矩阵,U矩阵已经求解完毕,
令
,求解X。
- 解 Ly=b. 对 i=1来说,
. 当i>=2,
- 解 Ux=y U的求解不再赘述
解Ly=b,Ux=y的代码如下:
for t=2:n %解Lx=b
b(t)=b(t)-L(t,1:t-1)*b(1:t-1);
end
b(n)=b(n)/U(n,n); %解Ux=b
for t=1:n-1;
k=n-t;b(k)=(b(k)-U(k,k+1:n)*b(k+1:n))/U(k,k);
end
x=b; %方程Ax=b的解即为x
总的代码如下:
clc;clear all;
% 输入矩阵x=[A,b]; Ax=b;
A=[1 2 3;2 2 8;-3 -10 -2];b=[0;-4;-11];
%x=[A,b];
n=length(A);%A的行数
%LU分解
U=zeros(n);L=eye(n,n);
% 共n次循环,每一次循环先求出U的这一行的全部数据,求出L的这一列的全部数据
for i=1:n
%求出U的这一行的数据
row=i;
for col=row:n
sum=0;
%U第row行第col列
for k=1:row-1
sum=sum+L(row,k)*U(k,col);
end
U(row,col)=A(row,col)-sum;
end
%求出L的这一列的全部数据
col=i;
%第col列第row行
for row=col+1:n
sum=0;
for k=1:col-1
sum=sum+L(row,k)*U(k,col);
end
L(row,col)=(A(row,col)-sum)/U(col,col);
end
end
L
U
%LU分解完成
%求U*x=(L^-1)*b
y=zeros(n,1);
y(1)=b(1);
for i=2:n %解Lx=b
y(i)=b(i)-L(i,1:i-1)*y(1:i-1);
end
x=zeros(n,1);
x(n)=y(n)/U(n,n);
%b(n)=b(n)/U(n,n); %解Ux=b
for i=1:n-1;
k=n-i;
x(k)=(y(k)-U(k,k+1:n)*x(k+1:n))/U(k,k);
end
x %方程Ax=b的解即为x