数值分析实验报告汇总.docx

上传人:b****8 文档编号:9158284 上传时间:2023-02-03 格式:DOCX 页数:20 大小:71.10KB
下载 相关 举报
数值分析实验报告汇总.docx_第1页
第1页 / 共20页
数值分析实验报告汇总.docx_第2页
第2页 / 共20页
数值分析实验报告汇总.docx_第3页
第3页 / 共20页
数值分析实验报告汇总.docx_第4页
第4页 / 共20页
数值分析实验报告汇总.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

数值分析实验报告汇总.docx

《数值分析实验报告汇总.docx》由会员分享,可在线阅读,更多相关《数值分析实验报告汇总.docx(20页珍藏版)》请在冰豆网上搜索。

数值分析实验报告汇总.docx

数值分析实验报告汇总

 

《数值分析》

实验报告

 

班级:

姓名:

学号:

指导老师:

 

实验基本要求

一、上机前的准备工作

1、复习和掌握与本次实验有关的教学内容。

2、根据本次实验要求,在纸上编写算法及上机的程序,并经过人工模拟运行检验,减少不必要的错误,提高上机效率。

切忌不编程序、不作人工检查就进行程序输入,这只能使上机调试的难度增加,甚至可能带来学习自信心的下降,影响后续课程的学习。

二、上机实验步骤

1、启动开发环境;

2、建立源程序文件,输入源程序;

3、编译产生目标程序,连接生成可执行程序,运行程序,输出结果;

4、对数值计算结果进行误差分析,讨论数值算法的收敛性与稳定性;

5、整理实验报告。

三、实验报告

实验报告是记录实验工作全过程的技术文档,实验报告的撰写是科学技术工作的一个组成部分。

《数值分析》实验报告包括下列要求:

1、实验原理;

2、实验内容和要求;

3、数值算法描述,包括数据输入、数据处理和数据输出;

4、算法的实现

(1)给出具体的计算实例,

(2)经调试正确的源程序清单,

(3)对具体的数值例子给出数值结果;

5、计算结果的误差分析,算法的收敛性与稳定性的讨论;

6、实验心得。

实验一、误差分析

一、实验目的

1、通过上机编程,复习巩固以前所学程序设计语言及上机操作指令;

2、通过上机计算,了解误差、绝对误差、误差界、相对误差界的有关概念;

3、通过上机计算,了解舍入误差所引起的数值不稳定性。

二、实验原理

误差问题是数值分析的基础,又是数值分析中一个困难的课题。

在实际计算中,如果选用了不同的算法,由于舍入误差的影响,将会得到截然不同的结果。

因此,选取算法时注重分析舍入误差的影响,在实际计算中是十分重要的。

同时,由于在数值求解过程中用有限的过程代替无限的过程会产生截断误差,因此算法的好坏会影响到数值结果的精度。

三、实验任务

,计算定积分

.

算法1:

利用递推公式

.

算法2:

利用递推公式

.

注意到

.

思考:

从计算结果看,哪个算法是不稳定的,哪个算法是稳定的。

四、实验源程序及结果

算法1

functiony1(i)

formatlong

y1=zeros(1,21);

y1

(1)=0.182322;

fori=1:

1:

20

y1(i+1)=1/i-5*y1(i);

end

y1(1:

21)

ans=

1.0e+007*

Columns1through4

0.0000000182322000.0000000088390000.0000000058050000.000000004308333

Columns5through8

0.0000000034583330.0000000027083330.000000003125000-0.000000001339286

Columns9through12

0.000000019196429-0.0000000848710320.000000434355159-0.000002162684885

Columns13through16

0.000010821757756-0.0000541010964740.000270512625226-0.001352556459463

Columns17through20

0.006762788547315-0.0338139368542210.169069689826659-0.845348443870135

Column21

4.226742224350675

算法2

functiony2(i)

formatlong

y2=zeros(1,21);

y2(21)=0.008730;

fori=21:

-1:

2

y2(i-1)=0.2/(i-1)-0.2*y2(i);

end

y2(1:

21)

ans=

Columns1through4

.0883********

Columns5through8

0.0343063295549800.0284683522251020.0243249055411550.021232615151370

Columns9through12

0.0188369242431500.0169264898953620.0153675505231920.014071338293132

Columns13through16

0.0129766418676730.0120398675847140.0112292335050020.010520499141658

Columns17through20

0.0098975042917100.0093360079532160.0088755157894740.008254000000000

Column21

0.008730000000000

从结果看算法2比较稳定,算法1不稳定。

实验二、插值法

一、实验目的

1、理解插值的基本概念,掌握各种插值方法,包括拉格朗日插值和牛顿插值等,注意其不同特点;

2、通过实验进一步理解并掌握各种插值的基本算法。

二、实验原理

插值法是函数逼近的一种重要方法,它是数值积分、微分方程数值解等数值计算的基础与工具,其中多项式插值是最常用和最基本的方法。

拉格朗日插值多项式的优点是表达式简单明确,形式对称,便于记忆,它的缺点是如果想要增加插值节点,公式必须整个改变,这就增加了计算工作量。

而牛顿插值多项式对此做了改进,当增加一个节点时只需在原牛顿插值多项式基础上增加一项,此时原有的项无需改变,从而达到节省计算次数、节约存储单元、应用较少节点达到应有精度的目的。

三、实验任务

1、已知函数表

0.561600.562800.564010.56521

0.827410.826590.825770.82495

用二次拉格朗日插值多项式求

时的函数近似值。

2、已知函数表

0.40.550.650.80.9

0.410750.578150.696750.888111.02652

用牛顿插值多项式求

四、实验源程序及结果

1、二次拉格朗日插值

function[y,R]=lagranzi(X,Y,x,M)

formatlong

x=0.5635;

M=2;

X=[0.56160,0.56280,0.56401,0.56521];

Y=[0.82741,0.82659,0.82577,0.82495];

n=length(X);

m=length(x);

fori=1:

m

z=x(i);s=0.0;

fork=1:

n

p=1.0;

q1=1.0;

c1=1.0;

forj=1:

n

ifj~=k

p=p*(z-X(j))/(X(k)-X(j));

end

q1=abs(q1*(z-X(j)));

c1=c1*j;

end

s=p*Y(k)+s;

end

y(i)=s;

end

R=M.*q1./c1;

ans=

0.826115663864318

2、牛顿插值多项式求

(1)

function[y,R]=newcz(X,Y,x,M)

M=3;

X=[0.4,0.55,0.65,0.8,0.9];

Y=[0.41075,0.57815,0.69675,0.88811,1.02652];

x1=0.596;

n=length(X);

m=length(x1);

fort=1:

m

z=x1(t);

A=zeros(n,n);

A(:

1)=Y';

s=0.0;

p=1.0;

q1=1.0;

c1=1.0;

forj=2:

n

fori=j:

n

A(i,j)=(A(i,j-1)-A(i-1,j-1))./(X(i)-X(i-j+1));

end

q1=abs(q1.*(z-X(j-1)));

c1=c1.*j;

end

C=A(n,n);

q1=abs(q1.*(z-X(n)));

fork=(n-1):

-1:

1

C=conv(C,poly(X(k)));

d=length(C);

C(d)=C(d)+A(k,k);

end

y(k)=polyval(C,z);

end

R=M.*q1./c1;

ans=

0.631917508079616

(2)

function[y,R]=newcz4(X,Y,x,M)

M=4;

X=[0.4,0.55,0.65,0.8,0.9];

Y=[0.41075,0.57815,0.69675,0.88811,1.02652];

x1=0.895;

n=length(X);

m=length(x1);

fort=1:

m

z=x1(t);

A=zeros(n,n);

A(:

1)=Y';

s=0.0;

p=1.0;

q1=1.0;

c1=1.0;

forj=2:

n

fori=j:

n

A(i,j)=(A(i,j-1)-A(i-1,j-1))./(X(i)-X(i-j+1));

end

q1=abs(q1.*(z-X(j-1)));

c1=c1.*j;

end

C=A(n,n);

q1=abs(q1.*(z-X(n)));

fork=(n-1):

-1:

1

C=conv(C,poly(X(k)));

d=length(C);

C(d)=C(d)+A(k,k);

end

y(k)=polyval(C,z);

end

R=M.*q1./c1;

ans=

1.019367566810000

实验三、解线性方程组的直接法

一、实验目的

1、了解求线性方程组的直接法的有关理论和方法;

2、会编制列主元消去法、LU分解法的程序;

3、通过实际计算,进一步了解各种方法的优缺点,选择合适的数值方法。

二、实验原理

解线性方程组的直接法是指经过有限步运算后能求得方程组精确解的方法。

但由于实际计算中舍入误差是客观存在的,因而使用这类方法也只能得到近似解。

目前较实用的直接法是古老的高斯消去法的变形,即主元素消去法及矩阵的三角分解法。

引进选主元的技巧是为了控制计算过程中舍入误差的增长,减少舍入误差的影响。

一般说来,列主元消去法及列主元三角分解法是数值稳定的算法,它具有精确度较高、计算量不大和算法组织容易等优点,是目前计算机上解中、小型稠密矩阵方程组可靠而有效的常用方法。

三、实验任务

1、用列主元高斯消去法求解方程组

.

2、用矩阵直接三角分解法求解方程组

,其中

四、实验源程序及结果

1、用列主元高斯消去法求解方程组

function[RA,RB,n,X]=liezhu(A,b)

B=[Ab];n=length(b);RA=rank(A);

RB=rank(B);zhica=RB-RA;

ifzhica>0,

disp('请注意:

因为RA~=RB,所以此方程组无解.')

return

end

ifRA==RB

ifRA==n

disp('请注意:

因为RA=RB=n,所以此方程组有唯一解.')

X=zeros(n,1);C=zeros(1,n+1);

forp=1:

n-1

[Y,j]=max(abs(B(p:

n,p)));C=B(p,:

);

B(p,:

)=B(j+p-1,:

);B(j+p-1,:

)=C;

fork=p+1:

n

m=B(k,p)/B(p,p);

B(k,p:

n+1)=B(k,p:

n+1)-m*B(p,p:

n+1);

end

end

b=B(1:

n,n+1);A=B(1:

n,1:

n);X(n)=b(n)/A(n,n);

forq=n-1:

-1:

1X(q)=(b(q)-sum(A(q,q+1:

n)*X(q+1:

n)))/A(q,q);

end

else

disp('请注意:

因为RA=RB

end

end

A=[0.1012.3043.555;-1.3473.7124.623;-2.8351.0725.643];

b=[1.183;2.137;3.035];

[RA,RB,n,X]=liezhu(A,b)

结果是:

请注意:

因为RA=RB=n,所以此方程组有唯一解.

RA=

3

RB=

3

n=

3

X=

-0.398233768741719

0.013795065997272

0.335144241514824

2、用矩阵直接三角分解法求解方程组

function[X,Y]=LUjfcz(A,b)

[n,n]=size(A);

X=zeros(n,1);

Y=zeros(n,1);

C=zeros(1,n);

r=1:

n;

forp=1:

n-1

[max1,j]=max(abs(A(p:

n,p)));

C=A(p,:

);

A(p,:

)=A(j+p-1,:

);

A(j+p-1,:

)=C;

g=r(p);

r(p)=r(j+p-1);

r(j+p-1)=g;

ifA(p,p)==0

disp('A是奇异阵,方程组无唯一解');

break;

end

fork=p+1:

n

H=A(k,p)/A(p,p);

A(k,p)=H;

A(k,p+1:

n)=A(k,p+1:

n)-H*A(p,p+1:

n);

end

end

Y

(1)=b(r

(1));

fork=2:

n

Y(k)=b(r(k))-A(k,1:

k-1)*Y(1:

k-1);

end

X(n)=Y(n)/A(n,n);

fori=n-1:

-1:

1

X(i)=(Y(i)-A(i,i+1:

n)*X(i+1:

n))/A(i,i);

end

end

A=[12-128;547-2;-3795;6-12-83];

b=[27;4;11;49];

[X,Y]=LUjfcz(A,b)

结果是:

X=

3.000000000000000

-2.000000000000000

1.000000000000000

5.000000000000000

Y=

49.000000000000000

-36.833333333333336

29.357142857142858

46.237745098039213

实验四、解线性方程组的迭代法

一、实验目的

1、熟悉迭代法的有关理论和方法;

2、会编制雅可比迭代法、高斯-塞德尔迭代法的程序;

3、注意所用方法的收敛性及其收敛速度问题。

二、实验原理

解线性方程组的迭代法是用某种极限过程去逐步逼近线性方程组精确解的方法,即是从一个初始向量

出发,按照一定的迭代格式产生一个向量序列

,使其收敛到方程组

的解。

迭代法的优点是所需计算机存储单元少,程序设计简单,原始系数矩阵在计算过程中始终不变等。

但迭代法存在收敛性及收敛速度问题。

迭代法是解大型稀疏矩阵方程组的重要方法。

三、实验任务

1、用雅可比迭代法解方程组

.

注意:

若用高斯-塞德尔迭代法则发散。

2、用高斯-塞德尔迭代法解方程组

.

注意:

若用雅可比迭代法则发散。

三、实验源程序及结果

1、用雅可比迭代法解方程组

functionX=jacdd(A,b,X0,P,wucha,max1)

[nm]=size(A);

fork=1:

max1

forj=1:

m

X(j)=(b(j)-A(j,[1:

j-1,j+1:

m])*X0([1:

j-1,j+1:

m]))/A(j,j);

end

djwcX=norm(X'-X0,P);xdwcX=djwcX/(norm(X',P)+eps);X0=X';

if(djwcX

disp('请注意:

雅可比迭代收敛,此方程组的精确解jX和近似解X如下:

')

return

end

end

if(djwcX>wucha)&(xdwcX>wucha)

disp('请注意:

雅可比迭代次数已经超过最大迭代次数max1')

end

A=[12-2;111;221];

b=[7;2;5];

X0=[000]';

X=jacdd(A,b,X0,inf,0.001,100)

结果是:

请注意:

雅可比迭代收敛,此方程组的精确解jX和近似解X如下:

X=

12-1

2、用高斯-塞德尔迭代法解方程组

functionX=gsdddy(A,b,X0,P,wucha,max1)

D=diag(diag(A));U=-triu(A,1);L=-tril(A,-1);dD=det(D);

ifdD==0

disp('请注意:

因为对角矩阵D奇异,所以此方程组无解.')

else

disp('请注意:

因为对角矩阵D非奇异,所以此方程组有解.')

iD=inv(D-L);B2=iD*U;f2=iD*b;jX=A\b;X=X0;

[nm]=size(A);

fork=1:

max1

X1=B2*X+f2;djwcX=norm(X1-X,P);

xdwcX=djwcX/(norm(X,P)+eps);

if(djwcX

return

else

k,X1',k=k+1;X=X1;

end

end

if(djwcX

disp('请注意:

高斯-塞德尔迭代收敛,此A的分解矩阵D,U,L和方程组的精确解jX和近似解X如下:

')

else

disp('请注意:

高斯-塞德尔迭代的结果没有达到给定的精度,并且迭代次数已经超过最大迭代次数max1,方程组的精确解jX和迭代向量X如下:

')

X=X';jX=jX'

end

end

X=X';D,U,L,jX=jX'

A=[10.90.9;0.910.9;0.90.91];

b=[1.9;2.0;1.7];

X0=[000]';

X=gsdddy(A,b,X0,inf,0.001,100)

结果是:

X=

0.9985

2.0118

-1.0093

 

实验心得

此次实验,不仅将课本学到的算法理论知识运用到了实验中,还复习了有关MATLAB软件的相关知识和用法,以及线性代数里矩阵的相关内容。

通过实验,我对误差产生原因及如何分析误差有了一定的了解。

学会运用插值法来求解近似值,了解到用拉格朗日插值和牛顿插值法的区别。

知道用高斯消元法、列主元高斯消元法和LU直接三角形分解求解线性方程组的直接方法,并对三者之间的差别有了更深刻的认识。

掌握了雅可比迭代法和高斯-塞德尔迭代法的计算机实现过程以及两者各自的适用范围。

总的来说,此次实验不但学到了新的知识,而且对以前的内容进行了复习回顾。

我明白了,学过的知识并不是考过了就扔了,而是要不断巩固记忆,并在学习新知识时,灵活运用,加深理解,掌握方法。

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

当前位置:首页 > 高等教育 > 理学

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

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