数值计算上机报告.docx

上传人:b****2 文档编号:2871407 上传时间:2023-05-04 格式:DOCX 页数:33 大小:246.97KB
下载 相关 举报
数值计算上机报告.docx_第1页
第1页 / 共33页
数值计算上机报告.docx_第2页
第2页 / 共33页
数值计算上机报告.docx_第3页
第3页 / 共33页
数值计算上机报告.docx_第4页
第4页 / 共33页
数值计算上机报告.docx_第5页
第5页 / 共33页
数值计算上机报告.docx_第6页
第6页 / 共33页
数值计算上机报告.docx_第7页
第7页 / 共33页
数值计算上机报告.docx_第8页
第8页 / 共33页
数值计算上机报告.docx_第9页
第9页 / 共33页
数值计算上机报告.docx_第10页
第10页 / 共33页
数值计算上机报告.docx_第11页
第11页 / 共33页
数值计算上机报告.docx_第12页
第12页 / 共33页
数值计算上机报告.docx_第13页
第13页 / 共33页
数值计算上机报告.docx_第14页
第14页 / 共33页
数值计算上机报告.docx_第15页
第15页 / 共33页
数值计算上机报告.docx_第16页
第16页 / 共33页
数值计算上机报告.docx_第17页
第17页 / 共33页
数值计算上机报告.docx_第18页
第18页 / 共33页
数值计算上机报告.docx_第19页
第19页 / 共33页
数值计算上机报告.docx_第20页
第20页 / 共33页
亲,该文档总共33页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

数值计算上机报告.docx

《数值计算上机报告.docx》由会员分享,可在线阅读,更多相关《数值计算上机报告.docx(33页珍藏版)》请在冰点文库上搜索。

数值计算上机报告.docx

数值计算上机报告

上海电力学院

 

现代数值计算上机实验

报告

 

院  系:

能源与机械工程学院

专业年级:

2014级动力机械140101班

学生姓名:

张焱儒

学号:

14101058

指导老师:

黄建雄

 

2015年1月4日

1.设

(1)由递推公式

,从

的几个近似值出发,计算

解:

I0=

=0.1823

计算I20编辑matlab命令如下:

I=0.1823

forn=1:

1:

20,

I=-5*I+1/n;

fprintf('%.1d%.4f\n',n,I);

end

结果:

(2)粗糙估计

,用

,计算

解:

I20=

使用复合中点公式进行积分,相应的matlab程序如下:

I=0;

forh=0:

0.001:

1,

m=h+0.0005;

I=I+0.001*m^20/(5+m);

fprintf('%.1d%.4f\n',m,I);

end

disp(I);

fork=1:

20,

n=21-k;

I=0.2*(1/n-I);

fprintf('%.1d%.4f\n',n,I);

end

disp(I)

结果:

程序结束时输出两个I值,第一个表示I20,第二个表示I0;

分别为I20=0.0082

I0=0.1823

(3)分析结果的可靠性及产生此现象的原因(重点分析原因)。

首先分析两种递推式的误差:

设第一递推式中开始时的误差为

,递推过程的舍入误差不计。

并记

则有

所此递推式不可靠。

而在第二种递推式中

,误差在缩小,所以此递推式是可靠的。

出现以上运行结果的主要原因是在构造递推式过程中,考虑舍入误差是否得到有效控制或是舍入误差的增长是否影响产生可靠的结果,即算法是否数值稳定。

2.求方程

的近似根,要求

,并比较计算量。

(1)在[0,1]上用二分法;

Matlab程序如下:

a=0;

b=1;

c=b-a;

n=0

whilec>0.0005,

x=(a+b)/2;

f=exp(x)+10*x-2;

iff>0,

b=x;

c=b-a;

elseiff<0,

a=x;

c=b-a;

else

x=x;

c=0;

end

n=n+1;

fprintf('%.1d%.4f%.4f\n',n,x,c);

end

结果如下:

解得到;x=0.0903

(2)取初值

,并用迭代

采用matlab进行迭代的程序如下:

x=0;

c=1;

n=0;

whilec>0.0005,

m=x;

m=(2-exp(m))/10;

c=abs(m-x);

x=m;

n=n+1;

fprintf('%.1d%.4f%.4f\n',n,x,c);

end

结果:

解得x=0.0905

(3)加速迭代的结果;

采用matlab进行迭代的程序如下:

x=0;

n=0;

a=0;

b=1;

whileabs(a-b)>0.0005,

n=n+1;

a=x;

y=(2-exp(x))/10;

z=(2-exp(y))/10;

x=x-(y-x)^2/(z-2*y+x);

b=x;

fprintf('%.1d%.4f%.4f\n',n,x,abs(a-b));

end

结果如下:

(4)取初值

,并用牛顿迭代法;

Matlab程序如下:

x=0;

a=1;

n=0;

whileabs(a)>0.0005,

n=n+1;

a=(exp(x)+10*x-2)/(exp(x)+10);

x=x-a;

fprintf('%.1d%.4f%.4f\n',n,x,abs(a));

end

运行结果:

(5)分析绝对误差:

迭代次数

二分法

代数式迭代

加速迭代

牛顿迭代

X(k)

Erroe

X(k)

Erroe

X(k)

Erroe

X(k)

Erroe

1

0.5000

0.5000

0.1000

0.1000

0.0905

0.0905

0.0909

0.0909

2

0.2500

0.2500

0.0895

0.0105

0.0905

0.0000

0.0905

0.0004

3

0.1250

0.1250

0.0906

0.0012

4

0.0625

0.0625

0.0905

0.0001

5

0.0938

0.0313

6

0.0781

0.0156

7

0.0859

0.0078

8

0.0898

0.0039

9

0.0918

0.0020

10

0.0908

0.0010

11

0.0903

0.0005

我们可以看到,在运算要求到同一精度的情况下,采用

(1)的二分法运算了11次,采用

(2)的方法运算了4次,采用(3)的加速迭代法运算了2次,采用(4)的牛顿迭代法也需运算2次。

也就是说牛顿的迭代的收敛速度与加速迭代速度都是超线性收敛的,而简单迭代法是线性收敛的。

而二分法收敛速度较慢,所以在工程上不经常使用。

3.钢水包使用次数多以后,钢包的容积增大,数据如下:

x

2

3

4

5

6

7

8

9

y

6.42

8.2

9.58

9.5

9.7

10

9.93

9.99

10

11

12

13

14

15

16

10.49

10.59

10.60

10.8

10.6

10.9

10.76

试从中找出使用次数和容积之间的关系,计算均方差。

(注:

增速减少,用何种模型)

设y=f(x)具有指数形式

(a>0,b<0)。

两边取对数:

记A=lna,B=b,并引入新变量z=lny,t=1/x。

引入新变量后的数据表如下

x

2

3

4

5

6

7

8

9

t=1/x

0.5000

0.3333

0.2500

0.2000

0.1667

0.1429

0.1250

0.1111

z=lny

1.8594

2.1041

2.2597

2.2513

2.2721

2.3026

2.2956

2.3016

10

11

12

13

14

15

16

0.1000

0.0909

0.0833

0.0769

0.0714

0.0667

0.0625

2.3504

2.3599

2.3609

2.3795

2.3609

2.3888

2.3758

解:

将使用次数x与体积y的关系用matlab采用如下程序绘制在二维坐标系:

x=[2345678910111213141516];

y=[6.428.29.589.59.7109.939.9910.4910.5910.6010.810.610.910.76];

plot(x,y,'b*-');

结果如下:

由数据点分布图可知,拟合曲线y=f(x)随着x的增加而上升,但上升速度由快到慢,当x趋于无穷大时,y趋于某个常数,故曲线有一水平渐进线。

根据上述特征很容易想到用Logistic模型来拟合该曲线。

设y=f(x)的形式为y=aeb/x(a>0,b<0),两边取对数,得lny=lna+b/x。

记A=lna,B=b,并引入新变量m=lny,n=1/x。

引入新变量后的数据表如下:

x

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

n=1/x

0.5000

0.3333

0.2500

0.2000

0.1667

0.1429

0.1250

0.1111

0.1000

0.0909

0.0833

0.0769

0.0714

0.0667

0.0625

m=lny

1.8594

2.1041

2.2597

2.2513

2.2721

2.3026

2.2956

2.3016

2.3504

2.3599

2.3609

2.3795

2.3609

2.3888

2.3758

Matlab拟合程序如下:

n=[0.50000.33330.25000.20000.16670.14290.12500.11110.10000.09090.08330.07690.07140.06670.0625];

m=[1.85942.10412.25972.25132.27212.30262.29562.30162.35042.35992.36092.37952.36092.38882.3758];

polyfit(n,m,1)

运行的结果:

由此可得A=2.4578B=-1.1107

a=eA=11.6791b=B=-1.1107

由此得到使用次数与容积的函数为

将统计表和函数用matlab绘制在同一坐标系内程序如下:

x1=[2345678910111213141516];

y1=[6.428.29.589.59.7109.939.9910.4910.5910.6010.810.610.910.76];

x=2:

1:

16;

y=11.679*exp(-1.1107*x.^(-1));

holdon;

plot(x,y,'ro-');

plot(x1,y1,'b*-');

结果如图:

计算均方差s,matlab程序如下:

y=[6.428.29.589.59.7109.939.9910.4910.5910.6010.810.610.910.76];

s=0;

forn=2:

1:

16,

a=abs(11.679*exp(-1.1107*n.^(-1))-y(n-1));

s=s+a.^2;

end

s=(s/15).^(1/2);

disp(s);

运算结果均方差S=0.2438

小结:

根据已给的条件计算函数是十分困难的,但通过对离散点的分析及变化规律找出其中的规律,并通过计算来得到实际的函数是十分有用的方法。

本题就是这样做的一个典型,在n=1/x和m=lny的基础上找到了它们之间的关系并通过这种关系来拟合原函数,并最终验证计算结果。

4.设

分析下列迭代法的收敛性,并求

的近似解及相应的迭代次数。

(1)JACOBI迭代;

程序:

functiony=jacobi(a,b,x0)

D=diag(diag(a));

U=-triu(a,1);

L=-tril(a,-1);

B=D\(L+U);

f=D\b;

y=B*x0+f;n=1;

whilenorm(y-x0)>1e-4

x0=y;

y=B*x0+f;n=n+1;

end

y

n

以文件名jacobi.m保存。

程序:

a=[4-10-100;-14-10-10;0-14-10-1;-10-14-10;0-10-14-1;00-10-14];

b=[05-25-26]';

x0=[000000]';

jacobi(a,b,x0);

运行结果为:

y=

1.0000

2.0000

1.0000

2.0000

1.0000

2.0000

n=

28

(2)GAUSS-SEIDEL迭代;

程序:

functiony=seidel(a,b,x0)

D=diag(diag(a));

U=-triu(a,1);

L=-tril(a,-1);

G=(D-L)\U;

f=(D-L)\b;

y=G*x0+f;n=1;

whilenorm(y-x0)>10^(-4)

x0=y;

y=G*x0+f;n=n+1;

end

y

n

以文件名deisel.m保存。

程序:

a=[4-10-100;-14-10-10;0-14-10-1;-10-14-10;0-10-14-1;00-10-14];

b=[05-25-26]';

x0=[000000]';

seidel(a,b,x0);

运行结果为:

y=

1.0000

2.0000

1.0000

2.0000

1.0000

2.0000

n=

15

(3)SOR迭代(

)。

程序:

functiony=sor(a,b,w,x0)

D=diag(diag(a));

U=-triu(a,1);

L=-tril(a,-1);

lw=(D-w*L)\((1-w)*D+w*U);

f=(D-w*L)\b*w;

y=lw*x0+f;n=1;

whilenorm(y-x0)>10^(-4)

x0=y;

y=lw*x0+f;n=n+1;

end

y

n

以文件名sor.m保存。

程序:

a=[4-10-100;-14-10-10;0-14-10-1;-10-14-10;0-10-14-1;00-10-14];

b=[05-25-26]';

x0=[000000]';

c=[1.3341.950.95];

fori=1:

3

w=c(i);

sor(a,b,w,x0);

end

运行结果分别为:

y=

1.0000

2.0000

1.0000

2.0000

1.0000

2.0000

n=

13

y=

1.0000

2.0000

1.0000

2.0000

1.0000

2.0000

n=

241

y=

1.0000

2.0000

1.0000

2.0000

1.0000

2.0000

n=

17

小结:

三种迭代法都是可以计算出结果,从收敛的角度来看雅可比迭代法,高斯--赛德尔迭代法迭代法都比较好,而超松弛迭代法(SOR)的迭代效果由于w的取值而有很大的变化。

迭代收敛的条件是迭代的迭代矩阵谱半径小于1。

5.用逆幂迭代法求

最接近于11的特征值和特征向量,准确到

解:

建立eigIPower函数的m文件。

function[t,y]=eigIPower(A,p,ep)

n=length(A);

B=A-p*eye(n);

v0=ones(n,1);

k=1;

v=B*v0;

whileabs(norm(v,inf)-norm(v0,inf))>ep

%norm(v-v0)>ep

k=k+1;

q=v;

u=v/norm(v,inf)

v=B*u;

v0=q;

end

t=1/norm(v,inf)+p

y=u

命令窗口中输入:

>>A=[631;321;111];eigIPower(A,11,0.001);

结果为:

特征值:

t=

11.0919

特征向量:

y=

0.3845

-1.0000

0.7306

小结:

逆幂迭代用来寻找最小的特征值,从以上程序可以看出迭代7次即达到了精度要求,证明了逆幂迭代是一种比较好的算法。

6.用经典R-K方法求解初值问题

(1)

解:

采用经典R-K公式计算的MATLAB程序如下:

y1=2;

y2=3;

forh=0:

0.01:

10,

k1=0.01*(-2*y1+y2+2*sin(h));

l1=0.01*(y1-2*y2+2*cos(h)-2*sin(h));

k2=0.01*(-2*(y1+0.5*k1)+(y2+0.5*l1)+2*sin(h+0.005));

l2=0.01*((y1+0.5*k1)-2*(y2+0.5*l1)+2*cos(h+0.005)-2*sin(h+0.005));

k3=0.01*(-2*(y1+0.5*k2)+(y2+0.5*l2)+2*sin(h+0.005));

l3=0.01*((y1+0.5*k2)-2*(y2+0.5*l2)+2*cos(h+0.005)-2*sin(h+0.005));

k4=0.01*(-2*(y1+k3)+(y2+l3)+2*sin(h+0.01));

l4=0.01*((y1+k3)-2*(y2+l3)+2*cos(h+0.01)-2*sin(h+0.01));

y1=y1+1/6*(k1+2*k2+2*k3+k4);

y2=y2+1/6*(l1+2*l2+2*l3+l4);

ifh==fix(h);

fprintf('%.1d%.4f%.4f\n',h,y1,y2);

else

end

end

结果如下所示:

(2)

和精确解

比较,分析结论。

程序:

functionydot=lorenzeq1(x,y)

ydot=[-2*y

(1)+y

(2)+2*sin(x);998*y

(1)-999*y

(2)+999*cos(x)-999*sin(x)];

以文件名lorenzeq1.m保存。

程序:

x=0:

10;

y1=2*exp(-x)+sin(x);

y2=2*exp(-x)+cos(x);

[x,y]=ode45('lorenzeq1',[0:

10],[2;3]);

fprintf('xy

(1)y1y

(2)y2\n')

forj=1:

length(y)

fprintf('%4d%.4f%.4f%.4f%.4f\n',x(j),y(j,1),y1(j),y(j,2),y2(j))

end

运行结果为:

xy

(1)y1y

(2)y2

02.00002.00003.00003.0000

11.57721.57721.27591.2761

21.18001.1800-0.1455-0.1455

30.24070.2407-0.8904-0.8904

4-0.7202-0.7202-0.6169-0.6170

5-0.9454-0.94540.29720.2971

6-0.2745-0.27450.96480.9651

70.65880.65880.75540.7557

80.99000.9900-0.1448-0.1448

90.41240.4124-0.9106-0.9109

10-0.5439-0.5439-0.8389-0.8390

小结:

经典R-K法是一种四阶的算法,具有很高的精度,这一点通过比较

(1)中的数值解和解析解就可以看得出来,在计算

(2)题时我们可以从数值稳定的相关理论判断此题运用经典R-K法是不稳定,不能够较好地收敛,因此需要改变算法进行计算。

7.用有限差分法求解边值问题(h=0.1):

.

《方法一》

程序为:

h=0.1;

n=(1-(-1))/h+1;

x

(1)=-1;x(n-1)=1;

y

(1)=1;y(n-1)=1;

fori=1:

n-1

x(i)=x

(1)+(i-1)*h;

q(i)=(1+x(i)^2);

B(i)=2/(h^2)+q(i);

end

fori=1:

n-2

C(i)=-1/(h^2);

end

H=diag(B)+diag(C,1)+diag(C,-1);

g

(1)=0+1/(h^2);

g(n-1)=0+1/(h^2);

fori=2:

n-2

g(i)=0;

end

y=H\g'

运行结果为:

y=

0.9027

0.8235

0.7592

0.7074

0.6661

0.6338

0.6095

0.5922

0.5814

0.5767

0.5778

0.5846

0.5974

0.6163

0.6420

0.6752

0.7167

0.7680

0.8308

0.9072

《方法二》

用有限差分法matlab程序如下:

h=0.1;

n=2/0.1-1;

g

(1)=1/(h.^2);

g(n)=1/(h^2);

fori=2:

1:

18,

g(i)=0;

end

g=[g

(1);g

(2);g(3);g(4);g(5);g(6);g(7);g(8);g(9);g(10);g(11);g(12);g(13);g(14);g(15);g(16);g(17);g(18);g(19)];

disp(g);

fori=1:

1:

19,

forj=1:

1:

19,

ifi==1,

H(1,1)=2/(h.^2)+(1+(-1+0.1*i).^2);

H(1,2)=-1/(h.^2);

elseifi==19,

H(19,18)=-1/(h.^2);

H(19,19)=2/(h.^2)+(1+(-1+0.1*i).^2);

else

ifj==i,

H(i,j)=2/(h.^2)+(1+(-1+0.1*i).^2);

elseifj==i-1,

H(i,i-1)=-1/(h.^2);

elseifj==i+1;

H(i,i+1)=-1/(h.^2);

else

H(i,j)=0;

end

end

end

end

disp(H);

y=H\g;

fori=1:

1:

19,

fprintf('%.4f%.4f\n',-1+0.1*i,y(i,1))

end

运算结果为:

H矩阵为:

Y在各点的近似值为:

X

Y

小结:

有限差分法是将微分方程离散化为差分方程进行求解,而求解差分方程就是解一个三对角矩阵线性方程组,从以上程序可以看出编程很容易实现用追赶法求解三对角矩阵线性方程组,且具有较高的精度。

 

8.拟合形如f(x)≈(a+bx)/(1+cx)的函数的一种快速方法是将最小二乘法用于下列问题:

f(x)(1+cx)≈(a+bx),试用这一方法拟合表4-4给出的中国人口数据。

(数值实验四)

表4-4

次序年份人口(亿)

a)19535.82

b)19646.95

c)198210.08

d)199011.34

e)200012.66

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

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2