数值分析报告常微分方程的数值解法

发布于:2021-09-28 19:56:19

常微分方程的数值解法
一、

实验目的:

目的与要求:通过实验,熟悉常微分方程的数值解法的基本原理。掌握向前欧拉法、向后 欧拉法、梯形法、改进欧拉法及三阶、四阶龙格-库塔法等基本算法。

二、 实验内容:
在下列方法中:向前欧拉法、向后欧拉法、梯形法、改进欧拉法及三阶、四阶龙格-库塔法 选择不同的三种算法求下面方程的数值解,并与准确解比较。

? y′ = x 2 + x ? y ? ,0 < x < 1 ? ? y ( 0) = 0 ?

以上步长取 0.1.
三、 实验要求:
1.编程实现。2.可以自拟实验题,要求同上。

四、 实验程序及结果:
1. 求原函数
DSolve[{y'[x]==x^2+x-y[x],y[0]==0},y[x],x] 求得:

2. 向前欧拉法 x[0]=0;y[0]=0;h=0.1; f[x_]:= ;

x[n_]:=n*h; f[u_,v_]:=u2+u-v; K1[n_]:=f[x[n-1],y[n-1]]; y[n_]:=y[n-1]+h*K1[n]; Table[{n,x[n],y[n],f[x[n]],f[x[n]]-y[n]},{n,0,10}]//N; Print["\nn,x[n],y[n],f[x[n]],f[x[n]]-y[n]\n"," ",MatrixForm[Table[{n,x[n],y[n],f[x[n]],f[x[n]]-y[n]},{n,0,10}]//N]] Data1=Table[{x[n],f[x[n]]},{n,0,10}]//N; Data2=Table[{x[n],y[n]},{n,0,10}]//N; A0=Plot[f[x],{x,0,1},PlotStyle→{Red,Thick}]; A1=Graphics[{PointSize[0.02],Red,Point[Data1]}]; A2=ListLinePlot[Data2,PlotStyle→{Red,Dashed}]; A3=Graphics[{PointSize[0.02],Blue,Point[Data2]}]; Show[A0,A1,A2,A3,PlotRange→All]
wilyes11 收集 博客(与学*无关):http://blog.sina.com.cn/u/1810231802

0.6 0.5 0.4 0.3 0.2 0.1

0.2

0.4

0.6

0.8

1.0

3. 改进欧拉法 f[x_,y_]:=x2+x-y; f[x_]:= ;

xy:={{0,1}}; h=0.1; Do[xn=xy[[n]][[1]];yn=xy[[n]][[2]]; k1=f[xn,yn];k2=f[xn+h,yn+h*k1]; d=(k1+k2)*h/2 ; Print[n," ","x",n,"=",xn+h," ","y",n,"=",yn+d," ","f(x",n,")=",f[xn+h]," ","f(x",n,")-y(x",n,")=",f[xn+h]-(yn+d)]; xy=Append[xy,{xn+h,yn+d}],{n,1,10}]; A1=Graphics[{PointSize[0.02],Red,Point[xy]}]; A2=ListLinePlot[xy,PlotStyle→Dashed]; → A3=Plot[f[x],{x,0,1},PlotStyle→{Red,Thick}]; → Show[A3,A2,A1]
wilyes11 收集 博客(与学*无关):http://blog.sina.com.cn/u/1810231802

0.6 0.5 0.4 0.3 0.2 0.1

0.2

0.4

0.6

0.8

1.0

4. 四阶龙格-库塔法 f[x_,y_]:=x2+x-y; f[x_]:= ;;

y0=1;a=0;b=1;n=10; h=(b-a)/n; xx=Table[a+(i-1)h,{i,1,n+1}]//N; y=Table[0,{i,1,n+1}]; y[[1]]=y0//N; For[i=2,i?n+1,i++, ? a1=h f[xx[[i-1]],y[[i-1]]]; a2=h f[xx[[i-1]]+h/2,y[[i-1]]+a1/2]; a3=h f[xx[[i-1]]+h/2,y[[i-1]]+a2/2]; a4=h f[xx[[i-1]]+h,y[[i-1]]+a3]; y[[i]]=y[[i-1]]+1/6 (a1+2a2+2a3+a4); Print[i-1," ","x",i-1,"=",xx[[i]]," ","y",i-1,"=",y[[i]],"
wilyes11 收集 博客(与学*无关):http://blog.sina.com.cn/u/1810231802

","f(x",i-1,")=",f[xx[[i]]]," ","f(x",n,")-y(x",n,")=",f[xx[[i]]]-y[[i]]];] data=Table[{xx[[i]],y[[i]]},{i,1,n+1}]; A1=Graphics[{PointSize[0.02],Blue,Point[data]}]; A2=ListLinePlot[data]; A3=Plot[f[x],{x,0,1},PlotStyle→{Red,Thick}]; → Show[A3,A2,A1]

0.6 0.5 0.4 0.3 0.2 0.1

0.2

0.4

0.6

0.8

1.0

五、实验总结:
本次实验是为了熟悉常微分方程的数值解法的基本原理。掌握向前欧拉法、向 后欧拉法、梯形法、改进欧拉法及三阶、四阶龙格-库塔法等基本算法。 对同一个方程求数值解, 我采用了向前欧拉法、 改进欧拉法和四阶龙格-库塔法, 了解了不同算法的编程难度和运算效率。本次实验中又犯了粗心的错误,少打了一 个“]” ,使程序不能正确运行,花了不少时间查错。

wilyes11 收集 博客(与学*无关):http://blog.sina.com.cn/u/1810231802


相关推荐

最新更新

猜你喜欢