实验九欧拉方法
信息与计算科学金融崔振威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 =
0 0.0500 0.1000 0.1500 0.2000 0.2500 0.3000 0.3500 0.4000 0.4500 0.5000 0.5500 0.6000 0.6500 0.7000 0.7500
0.8000 0.8500 0.9000 0.9500 1.0000 1.0500 1.1000 1.1500
1.2000 1.2500 1.3000 1.3500 1.4000 1.4500 1.5000 1.5500
1.6000 1.6500 1.7000 1.7500 1.8000 1.8500 1.9000 1.9500
2.0000
y1 =
1.0000 0.9500 0.9026 0.8580 0.8162 0.7774 0.7417 0.7091 0.6798 0.6538 0.6312 0.6121 0.5967 0.5848 0.5767 0.5724 0.5719 0.5753 0.5826 0.5940 0.6094 0.6290 0.6526 0.6805
0.7126 0.7490 0.7897 0.8347 0.8841 0.9379 0.9961 1.0588
1.1260 1.1977 1.2739 1.3547 1.4401 1.5301 1.6247 1.7240 1.8279
在Matlab 命令窗口输入:
>> y3=-exp(-x1)+x1.^2-2*x1+2
求得解析解:
y3 =
1.0000 0.9513 0.9052 0.8618 0.8213 0.7837 0.7492 0.7178 0.6897 0.6649 0.6435 0.6256 0.6112 0.6005 0.5934 0.5901 0.5907 0.5951 0.6034 0.6158 0.6321 0.6526 0.6771 0.7059
0.7388 0.7760 0.8175 0.8633 0.9134 0.9679 1.0269 1.0903
1.1581 1.2305 1.3073 1.3887 1.4747 1.5653 1.6604 1.7602 1.8647
输入:
>> plot(x1,y1,'o');hold on
>> plot(x1,y3,'*');hold on
可得近似值与解析解的图像比较:
从上面结果可以看出,执行40步时近似解的值要接近于解析解,误差更小,结果更精确。
5、)1/(1)(,1)0(,222't t y y ty y -=== 解:
执行20步时:
编写函数文件doty.m 如下: function f=doty(x,y); f=2*x*y^2;
在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.0e+176 *
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 6.4573
在Matlab 命令窗口输入: >> y3=1./(1-x1.^2)
求得解析解:
y3 =
1.0e+015 *
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 4.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');hold on
>> plot(x1,y3,'*');hold on
可得近似值与解析解的图像比较:
执行40步时:
在Matlab 命令窗口输入:
>> [x1,y1]=DEEuler('doty',0,2,1,40)
可得到结果:
x1 =
0.0000 0.0500 0.1000 0.1500 0.2000 0.2500 0.3000 0.3500 0.4000 0.4500 0.5000 0.5500 0.6000 0.6500 0.7000 0.7500
0.8000 0.8500 0.9000 0.9500 1.0000 1.0500
1.1000 1.1500 1.2000 1.2500 1.3000 1.3500 1.4000 1.4500 1.5000 1.5500 1.6000 1.6500 1.7000 1.7500 1.8000 1.8500 1.9000 1.9500
2.0000
y1 =
1.0e+224 *
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 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 3.6893 Inf Inf Inf Inf Inf Inf Inf Inf Inf 在Matlab 命令窗口输入: >> y3=1./(1-x1.^2) 求得解析解: y3 =
1.0e+015 *
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 -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');hold on >> plot(x1,y3,'*');hold on
可得近似值与解析解的图像比较:
欧拉方法(后项):
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]=BAEuler('doty',0,2,1,20)
可得到结果:
x1 =
0.0000 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.9110 0.8329 0.7665 0.7127 0.6719 0.6449 0.6323
0.6345 0.6520 0.6852 0.7345 0.8003 0.8829 0.9825 1.0995
1.2341 1.3864 1.5567 1.7452 1.9520
在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]=BAEuler('doty',0,2,1,40)
可得到结果:
x1 =
0 0.0500 0.1000 0.1500 0.2000 0.2500 0.3000 0.3500 0.4000 0.4500 0.5000 0.5500 0.6000 0.6500 0.7000 0.7500
0.8000 0.8500 0.9000 0.9500 1.0000 1.0500 1.1000 1.1500
1.2000 1.2500 1.3000 1.3500 1.4000 1.4500 1.5000 1.5500
1.6000 1.6500 1.7000 1.7500 1.8000 1.8500 1.9000 1.9500
2.0000
y1 =
1.0000 0.9526 0.9079 0.8658 0.8267 0.7904 0.7572 0.7272 0.7003 0.6768 0.6566 0.6399 0.6268 0.6172 0.6114 0.6092 0.6109 0.6164 0.6258 0.6392 0.6566 0.6780 0.7035 0.7332
0.7671 0.8052 0.8475 0.8942 0.9451 1.0005 1.0602 1.1243
1.1929 1.2660 1.3435 1.4256 1.5122 1.6034 1.6992 1.7996 1.9046
在Matlab 命令窗口输入:
>> y3=-exp(-x1)+x1.^2-2*x1+2
求得解析解:
y3 =
1.0000 0.9513 0.9052 0.8618 0.8213 0.7837 0.7492 0.7178
0.6897 0.6649 0.6435 0.6256 0.6112 0.6005 0.5934 0.5901 0.5907 0.5951 0.6034 0.6158 0.6321 0.6526 0.6771 0.7059 0.7388 0.7760 0.8175 0.8633 0.9134 0.9679 1.0269 1.0903 1.1581 1.2305 1.3073 1.3887 1.4747 1.5653 1.6604 1.7602 1.864 输入:
>> plot(x1,y1,'o');hold on
>> plot(x1,y3,'*');hold on
可得近似值与解析解的图像比较:
从上面结果可以看出,执行40步时近似解的值要接近于解析解,误差更小,结果更精确。但是后项欧拉要比前项接近解析解。
5、)1/(1)(,1)0(,22
2
'
t t y y ty y -=== 解:
执行20步时:
编写函数文件doty.m 如下: function f=doty(x,y); f=2*x*y^2;
在Matlab 命令窗口输入: >> [x1,y1]=BAEuler('doty',0,2,1,20) 可得到结果:
x1 =
0.0000 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.0e+119 *
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 4.0544 Inf Inf Inf Inf Inf Inf Inf
在Matlab 命令窗口输入:
>> y3=1./(1-x1.^2)
求得解析解:
y3 =
1.0e+015 *
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 4.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');hold on
>> plot(x1,y3,'*');hold on
可得近似值与解析解的图像比较:
执行40步时:
在Matlab 命令窗口输入:
>> [x1,y1]=BAEuler('doty',0,2,1,40)
可得到结果:
x1 =
0 0.0500 0.1000 0.1500 0.2000 0.2500 0.3000 0.3500
0.4000 0.4500 0.5000 0.5500 0.6000 0.6500 0.7000 0.7500
0.8000 0.8500 0.9000 0.9500 1.0000 1.0500 1.1000 1.1500
1.2000 1.2500 1.3000 1.3500 1.4000 1.4500 1.5000 1.5500
1.6000 1.6500 1.7000 1.7500 1.8000 1.8500 1.9000 1.9500
2.0000
y1 =
1.0e+195 *
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 0.0000 0.0000 0.0000 1.0834
Inf Inf Inf Inf Inf Inf Inf Inf Inf Inf Inf Inf Inf Inf Inf Inf Inf
在Matlab 命令窗口输入:
>> y3=1./(1-x1.^2)
求得解析解:
y3 =
1.0e+015 *
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 -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');hold on
>> plot(x1,y3,'*');hold on
可得近似值与解析解的图像比较:
梯形算法:
1、22)(,1)0(,22'+-+-==-=-t t e t y y y t y t 解:
在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、)1/(1)(,1)0(,22
2
'
t t y y ty y -=== 解:
在matlab 窗口中输入:
>> [I,step,h2] = CombineTraprl('1/(1-x^2)',0,2)
无法得出结果,程序报 Warning: Divide by zero. 错误
改进欧拉方法:
1、22)(,1)0(,22'+-+-==-=-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]=MoEuler('doty',0,2,1,20) 可得到结果:
x1 =
0.0000 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.9055 0.8219 0.7501 0.6909 0.6450 0.6130 0.5954 0.5929 0.6059 0.6348 0.6800 0.7418 0.8207 0.9167 1.0304 1.1617 1.3111 1.4786 1.6644 1.8687 在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]=MoEuler('doty',0,2,1,40)
可得到结果:
x1 =
0.0000 0.0500 0.1000 0.1500 0.2000 0.2500 0.3000 0.3500 0.4000 0.4500 0.5000 0.5500 0.6000 0.6500 0.7000 0.7500
0.8000 0.8500 0.9000 0.9500 1.0000 1.0500 1.1000 1.1500
1.2000 1.2500 1.3000 1.3500 1.4000 1.4500 1.5000 1.5500
1.6000 1.6500 1.7000 1.7500 1.8000 1.8500 1.9000 1.9500
2.0000
y1 =
1.0000 0.9513 0.9052 0.8619 0.8214 0.7839 0.7494 0.7181 0.6900 0.6652 0.6438 0.6260 0.6116 0.6009 0.5939 0.5907 0.5912 0.5957 0.6040 0.6164 0.6328 0.6532 0.6778 0.7066
0.7395 0.7768 0.8182 0.8641 0.9142 0.9688 1.0277 1.0911
1.1590 1.2313 1.3082 1.3897
1.4756 1.5662 1.6614 1.7612 1.8657
在Matlab 命令窗口输入:
>> y3=-exp(-x1)+x1.^2-2*x1+2
求得解析解:
y3 =
1.0000 0.9513 0.9052 0.8618 0.8213 0.7837 0.7492 0.7178 0.6897 0.6649 0.6435 0.6256 0.6112 0.6005 0.5934 0.5901
0.5907 0.5951 0.6034 0.6158 0.6321 0.6526 0.6771 0.7059 0.7388 0.7760 0.8175 0.8633 0.9134 0.9679 1.0269 1.0903 1.1581 1.2305 1.3073 1.3887 1.4747 1.5653 1.6604 1.7602 1.8647 输入:
>> plot(x1,y1,'o');hold on
>> plot(x1,y3,'*');hold on
可得近似值与解析解的图像比较:
从上面结果可以看出,改进的欧拉法更接近于解析解,并且执行40步时近似解的值要接近于解析解,误差更小,结果更精确。
5、)1/(1)(,1)0(,22
2
'
t t y y ty y -=== 解:
执行20步时:
编写函数文件doty.m 如下: function f=doty(x,y); f=2*x*y^2;
在Matlab 命令窗口输入: >> [x1,y1]=MoEuler('doty',0,2,1,20) 可得到结果: x1 =
0.0000 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.0e+113 *
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 3.6181 Inf Inf Inf Inf Inf Inf
在Matlab 命令窗口输入:
>> y3=1./(1-x1.^2)
求得解析解:
y3 =
1.0e+015 *
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 4.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');hold on
>> plot(x1,y3,'*');hold on
可得近似值与解析解的图像比较:
执行40步时:
在Matlab 命令窗口输入:
>> [x1,y1]=MoEuler('doty',0,2,1,40)
可得到结果:
x1 =
0.0000 0.0500 0.1000 0.1500 0.2000 0.2500 0.3000 0.3500
0.4000 0.4500 0.5000 0.5500 0.6000 0.6500 0.7000 0.7500
0.8000 0.8500 0.9000 0.9500 1.0000 1.0500 1.1000 1.1500
1.2000 1.2500 1.3000 1.3500 1.4000 1.4500 1.5000 1.5500
1.6000 1.6500 1.7000 1.7500 1.8000 1.8500 1.9000 1.9500
2.0000
y1 =
1.0e+102 *
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 0.0000 0.0000 0.0000 0.0000
2.1796 Inf Inf Inf Inf Inf Inf Inf
Inf Inf Inf Inf Inf Inf Inf Inf Inf 在Matlab 命令窗口输入:
>> y3=1./(1-x1.^2)
求得解析解:
y3 =
1.0e+015 *
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 -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');hold on
>> plot(x1,y3,'*');hold on
可得近似值与解析解的图像比较:
四阶龙格-库塔法
1、22)(,1)0(,22'+-+-==-=-t t e t y y y t y t 解:
执行20步时:
在matlab 窗口中输入: >> syms x y; >> z=x^2-y
>> y= DELGKT4_lungkuta(z,0.1,0,2,1,[x y])
可以得出下面结果: y = 1.0000 0.9052 0.8213 0.7492 0.6897 0.6435 0.6112 0.5934 0.5907 0.6034
《计算机数学基础(2)》辅导六 第14章常微分方程的数值解法 一、重点内容 1.欧拉公式: (k=0,1,2,…,n-1) 局部截断误差是O(h2)。 2. 改进欧拉公式: 或表示成: 平均形式: 局部截断误差是O(h3)。 3. 四阶龙格――库塔法公式: 其中κ1=f(x k,y k);κ2=f(x k+ 0.5h,y k+ 0.5 hκ1);κ3=f(x k+ 0.5 h,y k+ 0.5 hκ2); κ4=f(x k+h,y k+hκ3) 局部截断误差是O(h5)。
二、实例 例1用欧拉法解初值问题 取步长h=0.2。计算过程保留4位小数。 解h=0.2,f(x,y)=-y-xy2。首先建立欧拉迭代格式 =0.2y k(4-x k y k) (k=0,1,2) 当k=0,x1=0.2时,已知x0=0,y0=1,有 y(0.2)≈y1=0.2×1(4-0×1)=0.8 当k=1,x2=0.4时,已知x1=0.2,y1=0.8,有 y(0.4)≈y2=0.2×0.8×(4-0.2×0.8)=0.6144 当k=2,x3=0.6时,已知x2=0.4,y2=0.6144,有 y(0.6)≈y3=0.2×0.6144×(4-0.4×0.6144)=0.4613 例2 用欧拉预报-校正公式求解初值问题 取步长h=0.2,计算y(1.2),y(1.4)的近似值,小数点后至少保留5位。 解步长h=0.2,此时f(x,y)=-y-y2sin x 欧拉预报-校正公式为: 有迭代格式:
当k=0,x0=1,y0=1时,x1=1.2,有 =y0(0.8-0.2y0sin x0)=1×(0.8-0.2×1sin1)=0.63171 y(1.2)≈y1 =1×(0.9-0.1×1×sin1)-0.1(0.63171+0.631712sin1.2)=0.71549 当k=1,x1=1.2,y1=0.71549时,x2=1.4,有 =y1(0.8-0.2y1sin x1)=0.71549×(0.8-0.2×0.71549sin1.2) =0.47697 y(1.4)≈y2 =0.71549×(0.9-0.1×0.71549×sin1.2) -0.1(0.47697+0.476972sin1.4) =0.52611 例3写出用四阶龙格――库塔法求解初值问题 的计算公式,取步长h=0.2计算y(0.4)的近似值。至少保留四位小数。 解此处f(x,y)=8-3y,四阶龙格――库塔法公式为 其中κ1=f(x k,y k);κ2=f(x k+ 0.5h,y k+ 0.5 hκ1);κ3=f(x k+ 0.5 h,y k+ 0.5 hκ2);
龙格库塔方法matlab实现~ function ff=rk(yy,x0,y0,h,a,b)%yy为y的导函数,x0,y0,为初值,h为步长,a,b为区间 c=(b-a)/h+1;i1=1; %c为迭代步数;i1为迭代步数累加值 y=y0;z=zeros(c,6); %z生成c行,5列的零矩阵存放结果; %每行存放c次迭代结果,每列分别存放k1~k4及y的结果 for x=a:h:b if i1<=c k1=feval(yy,x,y); k2=feval(yy,x+h/2,y+(h*k1)/2); k3=feval(yy,x+h/2,y+(h*k2)/2); k4=feval(yy,x+h,y+h*k3); y=y+(h/6)*(k1+2*k2+2*k3+k4); z(i1,1)=x;z(i1,2)=k1;z(i1,3)=k2;z(i1,4)=k3;z(i1,5)=k4;z(i1,6)=y; i1=i1+1; end end fprintf(‘结果矩阵,第一列为x(n),第二列~第五列为k1~k4,第六列为y(n+1)的结果') z %在命令框输入下列语句 %yy=inline('x+y'); %>> rk(yy,0,1,0.2,0,1) %将得到结果 %结果矩阵,第一列为x(n),第二列~第五列为k1~k4第六列为y(n+1)的结果 %z = % 0 1.0000 1.2000 1.2200 1.4440 1.2428 % 0.2000 1.4428 1.6871 1.7115 1.9851 1.5836 % 0.4000 1.9836 2.2820 2.3118 2.6460 2.0442 % 0.6000 2.6442 3.0086 3.0451 3.4532 2.6510 % 0.8000 3.4510 3.8961 3.9407 4.4392 3.4365 % 1.0000 4.4365 4.9802 5.0345 5.6434 4.4401
实验九欧拉方法 信息与计算科学金融崔振威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
龙格库塔法 龙格库塔法是常用于模拟常微分方程的解的重要的一类隐式或显式迭代法。这些技术由数学家C. Runge和M.W. Kutta于1900年左右发明。由于此算法精度高,采取措施对误差进行抑制,所以其实现原理也较复杂。 龙格库塔法是一种在工程上应用广泛的高精度单步算法,可以应用在物理、工程、控制、动力学中,如模糊控制、弹道分析以及分析光纤特性等,在系统仿真中得到广泛应用。 龙格库塔法源自于相应的泰勒级数方法,在每一插值节点用泰勒级数展开,其截断误差阶数也是,根据可省略更高阶的导数计算, 这种方法可构造任意阶数的龙格库塔法。其中4 阶龙格库塔法是最常用的一种方法。因为它相当精确、稳定、容易编程。在计算中一般不必使用高阶方法, 因为附加的计算误差可由增加精度来弥补。如果需要较高的精度, 可采取减小步长的方法即可。4 阶龙格库塔法的精度类似4 阶泰勒级数法的精度。 1、初值问题 对于一阶常微分方程的初值问题 根据常微分方程的理论可知,此初值问题的解在区间[a,b]上存在,且唯一。 2、离散化
取步长h=(b-a)/n,将区间[a , b]分成n个子区间: a=<=b 在其中任意两点的曲线段上,根据积分中值定理,一段光滑曲 线上至少有一点,它的斜率与整段曲线的平均斜率相同, 得=y’() (0<<1) 其中,= 可以将上式改写成y()=y()+h*K (2.1) 其中K为平均斜率,K=f() 公式(2.1)表明,如果能够确定平均斜率K,就可以根据(2.1)式得到y()的值。 欧拉法和龙格库塔法就是用不同方法确定不同精度的平均斜率K,从而求得y()的近似值。 3、Euler法 欧拉法虽然精度低,但它是最简单的一种显式单步法,也是龙 格库塔法的基础。 首先,令、为y() 及y()的近似值,并且令平均斜 率K=f(),即以点的斜率作为平均斜率K,便得到欧拉公式=+h* f() (3.1) 4、改进的欧拉法 此种方法是取、两点的斜率的平均值作为平均斜率K, 即K= ,其中、均为y()以及y()的近似值,就得到 改进后的欧拉公式(4.1)
函数功能编辑本段回目录 ode是专门用于解微分方程的功能函数,他有ode23,ode45,ode23s等等,采用的是Runge-Kutta算法。ode45表示采用四阶,五阶runge-kutta单步算法,截断误差为(Δx)3。解决的是Nonstiff(非刚性)的常微分方程.是解决数值解问题的首选方法,若长时间没结果,应该就是刚性的,换用ode23来解. 使用方法编辑本段回目录 [T,Y] = ode45(odefun,tspan,y0) odefun 是函数句柄,可以是函数文件名,匿名函数句柄或内联函数名 tspan 是区间[t0 tf] 或者一系列散点[t0,t1,...,tf] y0 是初始值向量 T 返回列向量的时间点 Y 返回对应T的求解列向量 [T,Y] = ode45(odefun,tspan,y0,options) options 是求解参数设置,可以用odeset在计算前设定误差,输出参数,事件等 [T,Y,TE,YE,IE] =ode45(odefun,tspan,y0,options) 在设置了事件参数后的对应输出 TE 事件发生时间 YE 事件解决时间 IE 事件消失时间 sol =ode45(odefun,[t0 tf],y0...) sol 结构体输出结果 应用举例编辑本段回目录 1 求解一阶常微分方程
程序: 一阶常微分方程 odefun=@(t,y) (y+3*t)/t^2; %定义函数 tspan=[1 4]; %求解区间 y0=-2; %初值 [t,y]=ode45(odefun,tspan,y0); plot(t,y) %作图 title('t^2y''=y+3t,y(1)=-2,1 习题九 1. 取步长h = 0.1,分别用欧拉法与改进的欧拉法解下列初值问题 (1);(2) 准确解:(1);(2); 欧拉法:,,, 改进的欧拉法:,,, 2. 用四阶标准龙格—库塔法解第1题中的初值问题,比较各法解的精度。,,, 3. 用欧拉法计算下列积分在点处的近似值。 0.5000,1.1420,2.5011,7.2450 4. 求下列差分格式局部截断误差的首项,并指出其阶数。 (1),2 (2),3; (3),4 (4),4 5.用Euler法解初值问题取步长h=0.1,计算到x=0.3(保留到小数点后4位). 解: 直接将Eulerr法应用于本题,得到 由于,直接代入计算,得到 6.用改进Euler法和梯形法解初值问题取步长 h=0.1,计算到x=0.5,并与准确解相比较. 解:用改进Euler法求解公式,得 计算结果见下表 用梯形法求解公式,得 解得 精确解为 7.证明中点公式(7.3.9)是二阶的,并求其局部截断误差主项. 证明根据局部截断误差定义,得 将右端Taylor展开,得 故方法是二阶的,且局部截断误差主项是上式右端含h3的项。 8.用四阶R-K方法求解初值问题取步长 h=0.2. 解直接用四阶R-K方法 其中 计算结果如表所示: 9.对于初值问题 解因f'(y)=-100,故由绝对稳定区间要求(1)用Euler法解时, (2)用梯形法解时,绝对稳定区间为,由因f 对y是线性的,故不用迭代,对h仍无限制。(3)用四阶R-K方法时, 10. (1) 用Euler法求解,步长h应取在什么范围内计算才稳定?(2) 若用梯形法求解,对步长h有无限制? (3) 若用四阶R-K方法求解,步长h如何选取? 龙格-库塔法(Runge-Kutta) 数值分析中,龙格-库塔法(Runge-Kutta)是用于模拟常微分方程的解的重要的一类隐式或显式迭代法。这些技术由数学家卡尔·龙格和马丁·威尔海姆·库塔于1900年左右发明。 经典四阶龙格库塔法 龙格库塔法的家族中的一个成员如此常用,以至于经常被称为“RK4”或者就是“龙格库塔法”。令初值问题表述如下。 则,对于该问题的RK4由如下方程给出: 其中 这样,下一个值(yn+1)由现在的值(yn)加上时间间隔(h)和一个估算的斜率的乘积决定。该斜率是以下斜率的加权平均: k1是时间段开始时的斜率; k2是时间段中点的斜率,通过欧拉法采用斜率k1来决定y在点tn + h/2的值; k3也是中点的斜率,但是这次采用斜率k2决定y值; k4是时间段终点的斜率,其y值用k3决定。 当四个斜率取平均时,中点的斜率有更大的权值: RK4法是四阶方法,也就是说每步的误差是h5阶,而总积累误差为h4阶。 注意上述公式对于标量或者向量函数(y可以是向量)都适用。 显式龙格库塔法 显示龙格-库塔法是上述RK4法的一个推广。它由下式给出 其中 (注意:上述方程在不同著述中由不同但却等价的定义)。 要给定一个特定的方法,必须提供整数s (阶段数),以及系数aij (对于1 ≤ j < i ≤ s), bi (对于i = 1, 2, ..., s)和ci (对于i = 2, 3, ..., s)。这些数据通常排列在一个助记工具中,称为龙格库塔表: c2 a21 c3 a31 a32 cs as1 as2 as,s ? 1 b1 b2 bs ? 1 bs 龙格库塔法是自洽的,如果 如果要求方法有精度p则还有相应的条件,也就是要求舍入误差为O(hp+1)时的条件。这些可以从舍入误差本身的定义中导出。例如,一个2阶精度的2段方法要求b1 + b2 = 1, b2c2 = 1/2, 以及b2a21 = 1/2。数值计算方法复习题9
龙格-库塔法
计算方法及答案汇总