线性方程组求解Matlab程序Word格式文档下载.docx
《线性方程组求解Matlab程序Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《线性方程组求解Matlab程序Word格式文档下载.docx(31页珍藏版)》请在冰豆网上搜索。
1%回代
b(k)=b(k)—a(k,j)*x(j);
x(k)=b(k)/a(k,k);
Example:
〉〉A=[1.0170—0.00920.0095;
—0。
00920.99030.0136;
0.00950.01360.9898];
〉〉b=[101]'
;
>
〉x=DelGauss(A,b)
x=
0。
9739
—0。
0047
1。
0010
列主元Gauss消去法:
functionx=detGauss(a,b)
%Gauss列主元消去法
[n,m]=size(a);
det=1;
x=zeros(n,1);
n-1
amax=0;
%选主元
fori=k:
ifabs(a(i,k))>
amax
amax=abs(a(i,k));
r=i;
ifamax〈1e-10
return;
ifr>
k%交换两行
forj=k:
z=a(k,j);
a(k,j)=a(r,j);
a(r,j)=z;
z=b(k);
b(k)=b(r);
b(r)=z;
det=—det;
fori=k+1:
n%进行消元
m=a(i,k)/a(k,k);
a(i,j)=a(i,j)-m*a(k,j);
det=det*a(k,k);
det=det*a(n,n);
forj=k+1:
b(k)=b(k)-a(k,j)*x(j);
x(k)=b(k)/a(k,k);
Example:
〉x=detGauss(A,b)
0.9739
-0。
Gauss-Jordan消去法:
functionx=GaussJacobi(a,b)
%Gauss-Jacobi消去法
[n,m]=size(a);
x=zeros(n,1);
amax=0;
fori=k:
amax=abs(a(i,k));
ifamax<
1e-10
ifr〉k%交换两行
forj=k:
a(k,j)=a(r,j);
a(r,j)=z;
z=b(k);
b(k)=b(r);
%进行消元
b(k)=b(k)/a(k,k);
a(k,j)=a(k,j)/a(k,k);
fori=1:
ifi~=k
a(i,j)=a(i,j)-a(i,k)*a(k,j);
b(i)=b(i)—a(i,k)*b(k);
x(i)=b(i);
〉〉x=GaussJacobi(A,b)
1.0010
LU分解法:
function[l,u]=lu(a)
%LU分解
n=length(a);
l=eye(n);
u=zeros(n);
fori=1:
u(1,i)=a(1,i);
fori=2:
l(i,1)=a(i,1)/u(1,1);
forr=2:
%%%%
fori=r:
uu=0;
fork=1:
r—1
uu=uu+l(r,k)*u(k,i);
u(r,i)=a(r,i)-uu;
%%%%
fori=r+1:
ll=0;
r-1
ll=ll+l(i,k)*u(k,r);
l(i,r)=(a(i,r)—ll)/u(r,r);
%%%%
End
functionx=lusolv(a,b)
%LU分解求解线性方程组aX=b
iflength(a)~=length(b)
error('
Errorininputing!
'
)
n=length(a);
[l,u]=lu(a);
y
(1)=b
(1);
fori=2:
z=0;
i—1
z=z+l(i,k)*y(k);
y(i)=b(i)-z;
x(n)=y(n)/u(n,n);
fori=n—1:
—1:
1
fork=i+1:
z=z+u(i,k)*x(k);
x(i)=(y(i)-z)/u(i,i);
〉x=lusolv(A,b)
9739—0.00471.0010
对称正定矩阵之Cholesky分解法:
functionL=Cholesky(A)
%对对称正定矩阵A进行Cholesky分解
n=length(A);
L=zeros(n);
fork=1:
delta=A(k,k);
forj=1:
k—1
delta=delta—L(k,j)^2;
ifdelta〈1e—10
return;
L(k,k)=sqrt(delta);
L(i,k)=A(i,k);
k-1
L(i,k)=L(i,k)-L(i,j)*L(k,j);
L(i,k)=L(i,k)/L(k,k);
functionx=Chol_Solve(A,b)
%利用对称正定矩阵之Cholesky分解求解线性方程组Ax=b
n=length(b);
l=Cholesky(A);
x=ones(1,n);
y=ones(1,n);
fori=1:
z=0;
fork=1:
i-1
y(i)=(b(i)-z)/l(i,i);
fori=n:
-1:
fork=i+1:
z=z+l(k,i)*x(k);
x(i)=(y(i)—z)/l(i,i);
〉〉a=[9—3630;
-36192-180;
30-180180];
〉〉b=[111]’;
〉x=Chol_Solve(a,b)
83331。
08330。
7833
对称正定矩阵之LDL’分解法:
function[L,D]=LDL_Factor(A)
%对称正定矩阵A进行LDL'
分解
n=length(A);
L=eye(n);
D=zeros(n);
d=zeros(1,n);
T=zeros(n);
d(k)=A(k,k);
d(k)=d(k)—L(k,j)*T(k,j);
ifabs(d(k))〈1e-10
T(i,k)=A(i,k);
forj=1:
T(i,k)=T(i,k)—T(i,j)*L(k,j);
L(i,k)=T(i,k)/d(k);
D=diag(d);
functionx=LDL_Solve(A,b)
%利用对对称正定矩阵A进行LDL'
分解法求解线性方程组Ax=b
[l,d]=LDL_Factor(A);
y
(1)=b
(1);
z=z+l(i,k)*y(k);
y(i)=b(i)-z;
x(n)=y(n)/d(n,n);
fori=n—1:
z=z+l(k,i)*x(k);
x(i)=y(i)/d(i,i)—z;
〉x=LDL_Solve(a,b)
2。
迭代法
Richardson迭代法:
function[x,n]=richason(A,b,x0,eps,M)
%Richardson法求解线性方程组Ax=b
%方程组系数矩阵:
A
%方程组之常数向量:
b
%迭代初始向量:
X0
%e解的精度控制:
eps
%迭代步数控制:
M
%返回值线性方程组的解:
x
%返回值迭代步数:
if(nargin==3)
eps=1。
0e-6;
M=200;
elseif(nargin==4)
I=eye(size(A));
x1=x0;
x=(I-A)*x0+b;
n=1;
while(norm(x-x1)〉eps)
x1=x;
x=(I-A)*x1+b;
n=n+1;
if(n>
=M)
disp('
Warning:
迭代次数太多,现在退出!
);
〉>
A=[1.0170-0。
00920.0095;
00920.99030。
0136;
0。
00950。
01360.9898];
〉b=[101]’;
x0=[000]’;
〉[x,n]=richason(A,b,x0)
—0.0047
n=
5
Jacobi迭代法:
function[x,n]=jacobi(A,b,x0,eps,varargin)
ifnargin==3
eps=1.0e—6;
elseifnargin〈3
error
elseifnargin==5
M=varargin{1};
end
D=dia