线性方程组与MATLAB应用.docx

上传人:b****5 文档编号:2907538 上传时间:2022-11-16 格式:DOCX 页数:12 大小:16.22KB
下载 相关 举报
线性方程组与MATLAB应用.docx_第1页
第1页 / 共12页
线性方程组与MATLAB应用.docx_第2页
第2页 / 共12页
线性方程组与MATLAB应用.docx_第3页
第3页 / 共12页
线性方程组与MATLAB应用.docx_第4页
第4页 / 共12页
线性方程组与MATLAB应用.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

线性方程组与MATLAB应用.docx

《线性方程组与MATLAB应用.docx》由会员分享,可在线阅读,更多相关《线性方程组与MATLAB应用.docx(12页珍藏版)》请在冰豆网上搜索。

线性方程组与MATLAB应用.docx

线性方程组与MATLAB应用

实验5线性方程组与MATLAB应用

一、实验名称:

线性方程组与MATLAB应用。

二、实验目的:

理解线性方程组直接法与迭代法思想,掌握常用算法的设计,掌握用MATLAB实现的数值解法。

三、实验要求:

1、编写列主元消去法程序,并举例子。

编写LU分解法程序,并举例子。

对两种算法作出对比。

利用MATLAB函数“\”计算上面例子。

2、编写Jacobi或Gauss-Seidel迭代法程序,并举例子。

编写SOR迭代法程序,并举例子选择较佳的松弛因子。

对比说明两种迭代法的收敛速度。

3、谈一谈你对线性方程组直接法与迭代法的理解。

四、实验内容:

1、利用列主元法解方程:

gaussh.m文件为:

functionx=gauss(a,b)

%%判断是否可以求出解

temp1=size(a);temp2=size(b);

iftemp1

(1)~=temp1

(2)|temp1

(1)~=temp2

(1)|temp2

(2)~=1|det(a)==0

error('矩阵或向量的大小不对应或矩阵为奇异矩阵')

return;

end

%%化为三角矩阵过程

leng=temp1

(1);

fori=1:

leng-1

pos=i;num=abs(a(i,i));

forj=i+1:

leng

ifabs(a(j,i))>num

num=abs(a(j,i));

pos=j;

end

end

ifpos~=i

fork=i:

leng

temp=a(i,k);

a(i,k)=a(pos,k);

a(pos,k)=temp;

end

temp=b(pos);

b(pos)=b(i);

b(i)=temp;

end

forj=i+1:

leng

temp=a(j,i)/a(i,i);

forh=i:

leng

a(j,h)=a(j,h)-a(i,h)*temp;

end

b(j)=b(j)-temp*b(i);

end

end

%%进行回代

x(leng)=b(leng)/a(leng,leng);

ifleng>1

fori=leng-1:

-1:

1

x(i)=b(i);

forj=i+1:

leng;

x(i)=x(i)-a(i,j)*x(j);

end

x(i)=x(i)/a(i,i);

end

end

x=x';

控制命令为:

>>clear

>>a=[123;252;315];b=[141820]';

>>gaussh(a,b)

ans=

1.0000

2.0000

3.0000

利用LU列主元法解方程

mylu.m文件内容为:

function[l,u,p]=mylu(a)

siz=size(a);

ifsiz

(1)~=siz

(2)

error('矩阵非为方阵')

return

end

ifdet(a)==0

error('矩阵不能被三角分解')

end

si=siz

(1);

u=a;p=eye(si);l=eye(si);

fori=1:

si

forj=i:

si

t(j)=u(j,i);

fork=1:

i-1

t(j)=t(j)-u(j,k)*u(k,i);

end

end

pos=i;ma=abs(t(i));

forj=i+1:

si

ifma

ma=abs(t(j));

pos=j;

end

end

ifpos~=i

forj=1:

si

temp=u(i,j);

u(i,j)=u(pos,j);

u(pos,j)=temp;

end

forj=1:

si

temp=p(i,j);

p(i,j)=p(pos,j);

p(pos,j)=temp;

end

temp=t(pos);

t(pos)=t(i);

t(i)=temp;

end

u(i,i)=t(i);

forj=i+1:

si

u(j,i)=t(j)/t(i);

end

forj=i+1:

si

fork=1:

i-1

u(i,j)=u(i,j)-u(i,k)*u(k,j);

end

end

end

l=tril(u,-1)+eye(si);

u=triu(u,0);

控制命令为:

a=[123;252;315];b=[141820]';

>>[l,u,p]=mylu(a)

l=

1.000000

0.66671.00000

0.33330.38461.0000

u=

3.00001.00005.0000

04.3333-1.3333

001.8462

p=

001

010

100

>>p*b

ans=

20

18

14

y=l\ans

y=

20.0000

4.6667

5.5385

>>x=u\y

x=

1.0000

2.0000

3.0000

利用‘\’直接求解为:

>x=a\b

x=

1.0000

2.0000

3.0000

2、用Jacobi解方程:

…………①

Jacobi.m文件为:

function[x,n]=jacobi(a,b,E)

temp1=size(a);temp2=size(b);

iftemp1

(1)~=temp1

(2)|temp1

(1)~=temp2

(1)|temp2

(2)~=1|det(a)==0

error('矩阵或向量的大小不对应或矩阵为奇异矩阵')

return;

end

%%化为三角矩阵过程

leng=temp1

(1);N=-tril(a,-1)-triu(a,1);M=a+N;

t=1;

fori=1:

leng

t=t*M(i,i);

end

ift==0

error('对角元素都为零!

')

end

x=zeros(leng,1);

t=0;x=zeros(leng,1);

x2=N*x+b;

fori=1:

leng

x1=x2(i)/M(i,i);

t=t+(x1-x(i))^2;

x(i)=x1;

end

e=E^2;

n=1;

whilet>e

t=0;

x2=N*x+b;

fori=1:

leng

x1=x2(i)/M(i,i);

t=t+(x1-x(i))^2;

x(i)=x1;

end

n=n+1;

ift>1000

break;

error('不收敛')

end

end

控制窗口命令为:

a=[8-32;411-1;6312];b=[203336]';

>>[x,n]=jacobi(a,b,0.001)

x=

3.0003

1.9999

0.9997

n=

9

用Gauss-Seidel迭代法解方程①

Gauss_seidel.m文件内容为:

function[x,n]=gauss_seidel(a,b,E)

temp1=size(a);temp2=size(b);

iftemp1

(1)~=temp1

(2)|temp1

(1)~=temp2

(1)|temp2

(2)~=1|det(a)==0

error('矩阵或向量的大小不对应或矩阵为奇异矩阵')

return;

end

%%化为三角矩阵过程

leng=temp1

(1);N=-tril(a,-1)-triu(a,1);M=a+N;

t=1;

fori=1:

leng

t=t*M(i,i);

end

ift==0

error('对角元素都为零!

')

end

x=zeros(leng,1);

t=0;x1=zeros(leng,1);

fori=1:

leng

forj=1:

leng

ifj

x(i)=N(i,j)*x(j)+x(i);

end

ifj>i

x(i)=N(i,j)*x1(j)+x(i);

end

end

x(i)=(x(i)+b(i))/M(i,i);

end

fori=1:

leng

t=t+(x1(i)-x(i))^2;

end

e=E^2;

n=1;

whilet>e

t=0;

x1=x;

x=zeros(leng,1);

fori=1:

leng

forj=1:

leng

ifj

x(i)=N(i,j)*x(j)+x(i);

end

ifj>i

x(i)=N(i,j)*x1(j)+x(i);

end

end

x(i)=(x(i)+b(i))/M(i,i);

t=t+(x1(i)-x(i))^2;

end

n=n+1;

ift>1000

break;

error('不收敛')

end

end

控制命令窗口命令符为:

a=[8-32;411-1;6312];b=[203336]';

>>[x,n]=gauss_seidel(a,b,0.001)

x=

2.9998

2.0001

1.0001

n=

5

用SOR迭代法解法方程①

SOR.m文件为

function[x,n]=SOR(a,b,E,p)

temp1=size(a);temp2=size(b);

iftemp1

(1)~=temp1

(2)|temp1

(1)~=temp2

(1)|temp2

(2)~=1|det(a)==0

error('矩阵或向量的大小不对应或矩阵为奇异矩阵')

return;

end

%%化为三角矩阵过程

leng=temp1

(1);N=-tril(a,-1)-triu(a,1);M=a+N;N=-a;

t=1;

fori=1:

leng

t=t*M(i,i);

end

ift==0

error('对角元素都为零!

')

end

x=zeros(leng,1);

t=0;x1=zeros(leng,1);

fori=1:

leng

forj=1:

leng

ifj

x(i)=N(i,j)*x(j)+x(i);

end

ifj>=i

x(i)=N(i,j)*x1(j)+x(i);

end

end

x(i)=x1(i)+(x(i)+b(i))/M(i,i)*p;

end

fori=1:

leng

t=t+(x1(i)-x(i))^2;

end

e=E^2;

n=1;

whilet>e

t=0;

x1=x;

x=zeros(leng,1);

fori=1:

leng

temp=0;

forj=1:

leng

ifj

x(i)=N(i,j)*x(j)+x(i);

end

ifj>=i

x(i)=N(i,j)*x1(j)+x(i);

end

end

x(i)=x1(i)+(x(i)+b(i))/M(i,i)*p;

t=t+(x1(i)-x(i))^2;

end

n=n+1;

ift>1000

break;

error('不收敛')

end

end

控制命令窗口命令为:

当松弛因子p=1.3时

[x,n]=SOR(a,b,0.001,1.3)

x=

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 其它模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1