四阶龙格库塔和向前欧拉方法和隐式欧拉法以及改进欧拉法教材.docx

上传人:b****6 文档编号:14236308 上传时间:2023-06-21 格式:DOCX 页数:31 大小:444.75KB
下载 相关 举报
四阶龙格库塔和向前欧拉方法和隐式欧拉法以及改进欧拉法教材.docx_第1页
第1页 / 共31页
四阶龙格库塔和向前欧拉方法和隐式欧拉法以及改进欧拉法教材.docx_第2页
第2页 / 共31页
四阶龙格库塔和向前欧拉方法和隐式欧拉法以及改进欧拉法教材.docx_第3页
第3页 / 共31页
四阶龙格库塔和向前欧拉方法和隐式欧拉法以及改进欧拉法教材.docx_第4页
第4页 / 共31页
四阶龙格库塔和向前欧拉方法和隐式欧拉法以及改进欧拉法教材.docx_第5页
第5页 / 共31页
四阶龙格库塔和向前欧拉方法和隐式欧拉法以及改进欧拉法教材.docx_第6页
第6页 / 共31页
四阶龙格库塔和向前欧拉方法和隐式欧拉法以及改进欧拉法教材.docx_第7页
第7页 / 共31页
四阶龙格库塔和向前欧拉方法和隐式欧拉法以及改进欧拉法教材.docx_第8页
第8页 / 共31页
四阶龙格库塔和向前欧拉方法和隐式欧拉法以及改进欧拉法教材.docx_第9页
第9页 / 共31页
四阶龙格库塔和向前欧拉方法和隐式欧拉法以及改进欧拉法教材.docx_第10页
第10页 / 共31页
四阶龙格库塔和向前欧拉方法和隐式欧拉法以及改进欧拉法教材.docx_第11页
第11页 / 共31页
四阶龙格库塔和向前欧拉方法和隐式欧拉法以及改进欧拉法教材.docx_第12页
第12页 / 共31页
四阶龙格库塔和向前欧拉方法和隐式欧拉法以及改进欧拉法教材.docx_第13页
第13页 / 共31页
四阶龙格库塔和向前欧拉方法和隐式欧拉法以及改进欧拉法教材.docx_第14页
第14页 / 共31页
四阶龙格库塔和向前欧拉方法和隐式欧拉法以及改进欧拉法教材.docx_第15页
第15页 / 共31页
四阶龙格库塔和向前欧拉方法和隐式欧拉法以及改进欧拉法教材.docx_第16页
第16页 / 共31页
四阶龙格库塔和向前欧拉方法和隐式欧拉法以及改进欧拉法教材.docx_第17页
第17页 / 共31页
四阶龙格库塔和向前欧拉方法和隐式欧拉法以及改进欧拉法教材.docx_第18页
第18页 / 共31页
四阶龙格库塔和向前欧拉方法和隐式欧拉法以及改进欧拉法教材.docx_第19页
第19页 / 共31页
四阶龙格库塔和向前欧拉方法和隐式欧拉法以及改进欧拉法教材.docx_第20页
第20页 / 共31页
亲,该文档总共31页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

四阶龙格库塔和向前欧拉方法和隐式欧拉法以及改进欧拉法教材.docx

《四阶龙格库塔和向前欧拉方法和隐式欧拉法以及改进欧拉法教材.docx》由会员分享,可在线阅读,更多相关《四阶龙格库塔和向前欧拉方法和隐式欧拉法以及改进欧拉法教材.docx(31页珍藏版)》请在冰点文库上搜索。

四阶龙格库塔和向前欧拉方法和隐式欧拉法以及改进欧拉法教材.docx

四阶龙格库塔和向前欧拉方法和隐式欧拉法以及改进欧拉法教材

实验九欧拉方法

信息与计算科学金融崔振威201002034031

一、实验目的:

1、掌握欧拉算法设计及程序实现

二、实验内容:

1、p364-9.2.4、p386-9.5.6

三、实验要求:

主程序:

欧拉方法(前项):

function[x,y]=DEEuler(f,a,b,y0,n);

%f:

一阶常微分方程的一般表达式的右端函数

%a:

自变量的取值下限

%b:

自变量的取值上限

%y0:

函数的初值

%n:

积分的步数

ifnargin<5,n=50;

end

h=(b-a)/n;

x

(1)=a;y

(1)=y0;

fori=1:

n

x(i+1)=x(i)+h;

y(i+1)=y(i)+h*feval(f,x(i),y(i));

end

formatshort

欧拉方法(后项):

function[x,y]=BAEuler(f,a,b,y0,n);

%f:

一阶常微分方程的一般表达式的右端函数

%a:

自变量的取值下限

%b:

自变量的取值上限

%y0:

函数的初值

%n:

积分的步数

ifnargin<5,n=50;

end

h=(b-a)/n;

x

(1)=a;y

(1)=y0;

fori=1:

n

x(i+1)=x(i)+h;

y1=y(i)+h*feval(f,x(i),y(i));

y(i+1)=y(i)+h*feval(f,x(i+1),y1);

end

formatshort

梯形算法:

function[I,step,h2]=CombineTraprl(f,a,b,eps)

%f被积函数

%a,b积分上下限

%eps精度

%I积分结果

%step积分的子区间数

if(nargin==3)

eps=1.0e-4;

end

n=1;

h=(b-a)/2;

I1=0;

I2=(subs(sym(f),findsym(sym(f)),a)+subs(sym(f),findsym(sym(f)),b))/h;

whileabs(I2-I1)>eps

n=n+1;

h=(b-a)/n;

I1=I2;

I2=0;

fori=0:

n-1

x=a+h*i;

x1=x+h;

I2=I2+(h/2)*(subs(sym(f),findsym(sym(f)),x)+subs(sym(f),findsym(sym(f)),x1));

end

end

I=I2;

step=n;

h2=(b-a)/n;

改进欧拉方法:

function[x,y]=MoEuler(f,a,b,y0,n);

%f:

一阶常微分方程的一般表达式的右端函数

%a:

自变量的取值下限

%b:

自变量的取值上限

%y0:

函数的初值

%n:

积分的步数

ifnargin<5,n=50;

end

h=(b-a)/n;

x

(1)=a;y

(1)=y0;

fori=1:

n

x(i+1)=x(i)+h;

y1=y(i)+h*feval(f,x(i),y(i));

y2=y(i)+h*feval(f,x(i+1),y1);

y(i+1)=(y1+y2)/2;

end

formatshort

四阶龙格-库塔法:

functiony=DELGKT4_lungkuta(f,h,a,b,y0,varvec)

%f:

一阶常微分方程的一般表达式的右端函数

%h:

积分步长

%a:

自变量的取值下限

%b:

自变量的取值上限

%varvec:

常微分方程的变量组

formatlong;

N=(b-a)/h;

y=zeros(N+1,1);

y

(1)=y0;

x=a:

h:

b;

var=findsym(f);

fori=2:

N+1

K1=Funval(f,varvec,[x(i-1)y(i-1)]);%Funval为程序所需要的函数

K2=Funval(f,varvec,[x(i-1)+h/2y(i-1)+K1*h/2]);

K3=Funval(f,varvec,[x(i-1)+h/2y(i-1)+K2*h/2]);

K4=Funval(f,varvec,[x(i-1)+hy(i-1)+h*K3]);

y(i)=y(i-1)+h*(K1+2*K2+2*K3+K4)/6;

end

formatshort;

p364-9.2.4

欧拉方法(前项):

1、

解:

执行20步时:

编写函数文件doty.m如下:

functionf=doty(x,y);

f=x^2-y;

在Matlab命令窗口输入:

>>[x1,y1]=DEEuler('doty',0,2,1,20)

可得到结果:

x1=

00.10000.20000.30000.40000.50000.60000.70000.80000.90001.00001.10001.20001.30001.40001.50001.60001.70001.80001.90002.0000

y1=

1.00000.90000.81100.73390.66950.61860.58170.55950.55260.56130.58620.62760.68580.76120.85410.96471.09321.23991.40491.58841.7906

在Matlab命令窗口输入:

>>y3=-exp(-x1)+x1.^2-2*x1+2

求得解析解:

y3=

1.00000.90520.82130.74920.68970.64350.61120.59340.59070.60340.63210.67710.73880.81750.91341.02691.15811.30731.47471.66041.8647

输入:

>>plot(x1,y1,'o');holdon

>>plot(x1,y3,'*');holdon

可得近似值与解析解的图像比较:

执行40步时:

在Matlab命令窗口输入:

>>[x1,y1]=DEEuler('doty',0,2,1,40)

可得到结果:

x1=

00.05000.10000.15000.20000.25000.30000.35000.40000.45000.50000.55000.60000.65000.70000.75000.80000.85000.90000.95001.00001.05001.10001.15001.20001.25001.30001.35001.40001.45001.50001.55001.60001.65001.70001.75001.80001.85001.90001.95002.0000

y1=

1.00000.95000.90260.85800.81620.77740.74170.70910.67980.65380.63120.61210.59670.58480.57670.57240.57190.57530.58260.59400.60940.62900.65260.68050.71260.74900.78970.83470.88410.93790.99611.05881.12601.19771.27391.35471.44011.53011.62471.72401.8279

在Matlab命令窗口输入:

>>y3=-exp(-x1)+x1.^2-2*x1+2

求得解析解:

y3=

1.00000.95130.90520.86180.82130.78370.74920.71780.68970.66490.64350.62560.61120.60050.59340.59010.59070.59510.60340.61580.63210.65260.67710.70590.73880.77600.81750.86330.91340.96791.02691.09031.15811.23051.30731.38871.47471.56531.66041.76021.8647

输入:

>>plot(x1,y1,'o');holdon

>>plot(x1,y3,'*');holdon

可得近似值与解析解的图像比较:

从上面结果可以看出,执行40步时近似解的值要接近于解析解,误差更小,结果更精确。

5、

解:

执行20步时:

编写函数文件doty.m如下:

functionf=doty(x,y);

f=2*x*y^2;

在Matlab命令窗口输入:

>>[x1,y1]=DEEuler('doty',0,2,1,20)

可得到结果:

x1=

00.10000.20000.30000.40000.50000.60000.70000.80000.90001.00001.10001.20001.30001.40001.50001.60001.70001.80001.90002.0000

y1=

1.0e+176*

0.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00006.4573

在Matlab命令窗口输入:

>>y3=1./(1-x1.^2)

求得解析解:

y3=

1.0e+015*

0.00000.00000.00000.00000.00000.00000.00000.00000.00000.00004.5036-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000

输入:

>>plot(x1,y1,'o');holdon

>>plot(x1,y3,'*');holdon

可得近似值与解析解的图像比较:

执行40步时:

在Matlab命令窗口输入:

>>[x1,y1]=DEEuler('doty',0,2,1,40)

可得到结果:

x1=

0.00000.05000.10000.15000.20000.25000.30000.35000.40000.45000.50000.55000.60000.65000.70000.75000.80000.85000.90000.95001.00001.0500

1.10001.15001.20001.25001.30001.35001.40001.45001.50001.55001.60001.65001.70001.75001.80001.85001.90001.95002.0000

y1=

1.0e+224*

0.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00003.6893InfInfInfInfInfInfInfInfInf在Matlab命令窗口输入:

>>y3=1./(1-x1.^2)

求得解析解:

y3=

1.0e+015*

0.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000-2.2518-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000

输入:

>>plot(x1,y1,'o');holdon

>>plot(x1,y3,'*');holdon

可得近似值与解析解的图像比较:

 

欧拉方法(后项):

1、

解:

执行20步时:

编写函数文件doty.m如下:

functionf=doty(x,y);

f=x^2-y;

在Matlab命令窗口输入:

>>[x1,y1]=BAEuler('doty',0,2,1,20)

可得到结果:

x1=

0.00000.10000.20000.30000.40000.50000.60000.70000.80000.90001.00001.10001.20001.30001.40001.50001.60001.70001.80001.90002.0000

y1=

1.00000.91100.83290.76650.71270.67190.64490.63230.63450.65200.68520.73450.80030.88290.98251.09951.23411.38641.55671.74521.9520

在Matlab命令窗口输入:

>>y3=-exp(-x1)+x1.^2-2*x1+2

求得解析解:

y3=

1.00000.90520.82130.74920.68970.64350.61120.59340.59070.60340.63210.67710.73880.81750.91341.02691.15811.30731.47471.66041.8647

输入:

>>plot(x1,y1,'o');holdon

>>plot(x1,y3,'*');holdon

可得近似值与解析解的图像比较:

执行40步时:

在Matlab命令窗口输入:

>>[x1,y1]=BAEuler('doty',0,2,1,40)

可得到结果:

x1=

00.05000.10000.15000.20000.25000.30000.35000.40000.45000.50000.55000.60000.65000.70000.75000.80000.85000.90000.95001.00001.05001.10001.15001.20001.25001.30001.35001.40001.45001.50001.55001.60001.65001.70001.75001.80001.85001.90001.95002.0000

y1=

1.00000.95260.90790.86580.82670.79040.75720.72720.70030.67680.65660.63990.62680.61720.61140.60920.61090.61640.62580.63920.65660.67800.70350.73320.76710.80520.84750.89420.94511.00051.06021.12431.19291.26601.34351.42561.51221.60341.69921.79961.9046

在Matlab命令窗口输入:

>>y3=-exp(-x1)+x1.^2-2*x1+2

求得解析解:

y3=

1.00000.95130.90520.86180.82130.78370.74920.71780.68970.66490.64350.62560.61120.60050.59340.59010.59070.59510.60340.61580.63210.65260.67710.70590.73880.77600.81750.86330.91340.96791.02691.09031.15811.23051.30731.38871.47471.56531.66041.76021.864

输入:

>>plot(x1,y1,'o');holdon

>>plot(x1,y3,'*');holdon

可得近似值与解析解的图像比较:

从上面结果可以看出,执行40步时近似解的值要接近于解析解,误差更小,结果更精确。

但是后项欧拉要比前项接近解析解。

5、

解:

执行20步时:

编写函数文件doty.m如下:

functionf=doty(x,y);

f=2*x*y^2;

在Matlab命令窗口输入:

>>[x1,y1]=BAEuler('doty',0,2,1,20)

可得到结果:

x1=

0.00000.10000.20000.30000.40000.50000.60000.70000.80000.90001.00001.10001.20001.30001.40001.50001.60001.70001.80001.90002.0000

y1=

1.0e+119*

0.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00004.0544InfInfInfInfInfInfInf

在Matlab命令窗口输入:

>>y3=1./(1-x1.^2)

求得解析解:

y3=

1.0e+015*

0.00000.00000.00000.00000.00000.00000.00000.00000.00000.00004.5036-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000

输入:

>>plot(x1,y1,'o');holdon

>>plot(x1,y3,'*');holdon

可得近似值与解析解的图像比较:

执行40步时:

在Matlab命令窗口输入:

>>[x1,y1]=BAEuler('doty',0,2,1,40)

可得到结果:

x1=

00.05000.10000.15000.20000.25000.30000.35000.40000.45000.50000.55000.60000.65000.70000.75000.80000.85000.90000.95001.00001.05001.10001.15001.20001.25001.30001.35001.40001.45001.50001.55001.60001.65001.70001.75001.80001.85001.90001.95002.0000

y1=

1.0e+195*

0.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00001.0834InfInfInfInfInfInfInfInfInfInfInfInfInfInfInfInfInf

在Matlab命令窗口输入:

>>y3=1./(1-x1.^2)

求得解析解:

y3=

1.0e+015*

0.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000-2.2518-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000-0.0000

输入:

>>plot(x1,y1,'o');holdon

>>plot(x1,y3,'*');holdon

可得近似值与解析解的图像比较:

 

梯形算法:

1、

解:

在matlab窗口中输入:

>>[I,step,h2]=CombineTraprl('-exp(-x1)+x1^2-2*x1+2',0,2)

可得结果:

I=

1.8032

step=

29

h2=

0.0690

由此可以看出,梯形算法求得的结果比执行20步的欧拉算法要接近解析解,但执行40步的近似解要比梯形算法精确。

5、

解:

在matlab窗口中输入:

>>[I,step,h2]=CombineTraprl('1/(1-x^2)',0,2)

无法得出结果,程序报

Warning:

Dividebyzero.

错误

 

改进欧拉方法:

1、

解:

执行20步时:

编写函数文件doty.m如下:

functionf=doty(x,y);

f=x^2-y;

在Matlab命令窗口输入:

>>[x1,y1]=MoEuler('doty',0,2,1,20)

可得到结果:

x1=

0.00000.10000.20000.30000.40000.50000.60000.70000.80000.90001.00001.10001.20001.30001.40001.50001.60001.70001.80001.90002.0000

y1=

1.00000.90550.82190.75010.

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

当前位置:首页 > 农林牧渔 > 水产渔业

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

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