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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验九欧拉方法

信息与计算科学金融崔振威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:积分的步数

if nargin<5,n=50;

end

h=(b-a)/n;

x(1)=a;y(1)=y0;

for i=1:n

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

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

end

format short

欧拉方法(后项):

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

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

%a:自变量的取值下限

%b:自变量的取值上限

%y0:函数的初值

%n:积分的步数

if nargin<5,n=50;

end

h=(b-a)/n;

x(1)=a;y(1)=y0;

for i=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

format short

梯形算法:

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;

while abs(I2-I1)>eps

n=n+1;

h=(b-a)/n;

I1=I2;

I2=0;

for i=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:积分的步数

if nargin<5,n=50;

end

h=(b-a)/n;

x(1)=a;y(1)=y0; for i=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

format short

四阶龙格-库塔法:

function y = DELGKT4_lungkuta(f, h,a,b,y0,varvec) %f:一阶常微分方程的一般表达式的右端函数 %h:积分步长

%a :自变量的取值下限 %b:自变量的取值上限

%varvec :常微分方程的变量组 format long; N = (b-a)/h;

y = zeros(N+1,1); y(1) = y0; x = a:h:b;

var = findsym(f); for i=2:N+1

K1 = Funval(f,varvec,[x(i-1) y(i-1)]);%Funval 为程序所需要的函数 K2 = Funval(f,varvec,[x(i-1)+h/2 y(i-1)+K1*h/2]); K3 = Funval(f,varvec,[x(i-1)+h/2 y(i-1)+K2*h/2]); K4 = Funval(f,varvec,[x(i-1)+h y(i-1)+h*K3]); y(i) = y(i-1)+h*(K1+2*K2+2*K3+K4)/6; end

format short;

p364-9.2.4

欧拉方法(前项):

1、22)(,1)0(,2

2

'

+-+-==-=-t t e t y y y t y t

解:

执行20步时:

编写函数文件doty.m 如下: function f=doty(x,y); f=x^2-y;

在Matlab 命令窗口输入:

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

可得到结果:

x1 =

0 0.1000 0.2000 0.3000 0.4000 0.5000 0.6000 0.7000

0.8000 0.9000 1.0000 1.1000 1.2000 1.3000 1.4000 1.5000

1.6000 1.7000 1.8000 1.9000

2.0000

y1 =

1.0000 0.9000 0.8110 0.7339 0.6695 0.6186 0.5817 0.5595

0.5526 0.5613 0.5862 0.6276 0.6858 0.7612 0.8541 0.9647

1.0932 1.2399 1.4049 1.5884 1.7906

在Matlab 命令窗口输入:

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

求得解析解:

y3 =

1.0000 0.9052 0.8213 0.7492 0.6897 0.6435 0.6112 0.5934

0.5907 0.6034 0.6321 0.6771 0.7388 0.8175 0.9134 1.0269

1.1581 1.3073 1.4747 1.6604 1.8647

输入:

>> plot(x1,y1,'o');hold on

>> plot(x1,y3,'*');hold on

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

执行40步时:

在Matlab 命令窗口输入:

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

可得到结果:

x1 =

相关文档
最新文档