欧拉算法与改进的欧拉算法实例
改进的欧拉公式与精确解的变化规律

改进的欧拉公式与精确解的变化规律改进的欧拉公式是最常用的数值解法之一,它通过近似求解微分方程来得到数值解。
与精确解相比,改进的欧拉公式是通过将微分方程的导数从一个点近似为两个点的斜率来计算下一个点的数值解。
改进的欧拉公式的变化规律是随着步长的减小,数值解会更接近精确解。
这是因为当步长越小时,近似的斜率越接近真实的导数值,从而得到的数值解也更准确。
具体来说,改进的欧拉公式的变化规律可以描述为以下几点:1. 当步长减小时,数值解的误差也减小。
这意味着数值解更接近精确解。
2. 当步长趋近于零时,数值解逼近精确解。
这是因为在这种情况下,近似的斜率越来越接近真实的导数值,从而得到的数值解趋近于精确解。
3. 当步长增大时,数值解的误差也增大。
这是因为在这种情况下,近似的斜率与真实的导数值之间的差异会增大,导致数值解与精确解之间的差异也增大。
总之,改进的欧拉公式是一种数值解法,它可以通过近似求解微分方程来得到数值解。
随着步长的减小,数值解会更接近精确解。
在步长趋近于零的情况下,数值解逼近精确解。
当步长增大时,数值解的误差也增大。
进一步说明,改进的欧拉公式是欧拉公式的改进版,通过将微分方程的导数从一个点近似为两个点的斜率来提高数值解的准确性。
改进的欧拉公式可以写为以下形式:y_{n+1} = y_n + h \cdot \frac{f(x_n, y_n) + f(x_{n+1},y_{n+1})}{2}其中,y_n 是精确解在离散点 x_n 处的近似值,h 是步长,f(x_n, y_n) 是微分方程的导数。
改进的欧拉公式的准确度比欧拉公式更高,是因为它通过使用两个点的斜率的平均值来更准确地近似导数值。
改进的欧拉公式的变化规律可以归结为以下几点:1. 当步长 h 减小时,数值解的准确性提高。
这是因为较小的步长使得近似的斜率更接近真实的导数值,从而得到更精确的数值解。
2. 当步长 h 增大时,数值解的准确性降低。
这是因为较大的步长导致近似的斜率与真实的导数值之间的误差增加,从而导致数值解的误差变大。
四阶龙格库塔和向前欧拉方法和隐式欧拉法以及改进欧拉法教材

实验九欧拉方法信息与计算科学金融崔振威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;endh=(b-a)/n;x(1)=a;y(1)=y0;for i=1:nx(i+1)=x(i)+h;y(i+1)=y(i)+h*feval(f,x(i),y(i));endformat short欧拉方法(后项):function [x,y]=BAEuler(f,a,b,y0,n);%f:一阶常微分方程的一般表达式的右端函数%a:自变量的取值下限%b:自变量的取值上限%y0:函数的初值%n:积分的步数if nargin<5,n=50;endh=(b-a)/n;x(1)=a;y(1)=y0;for i=1:nx(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);endformat short梯形算法:function [I,step,h2] = CombineTraprl(f,a,b,eps)%f 被积函数%a,b 积分上下限%eps 精度%I 积分结果%step 积分的子区间数if(nargin ==3)eps=1.0e-4;endn=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)>epsn=n+1;h=(b-a)/n;I1=I2;I2=0;for i=0:n-1x=a+h*i;x1=x+h;I2=I2+(h/2)*(subs(sym(f),findsym(sym(f)),x)+subs(sym(f),findsym(sym(f)),x1));endendI=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;endh=(b-a)/n;x(1)=a;y(1)=y0; for i=1:nx(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; endformat 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+1K1 = 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; endformat short;p364-9.2.4欧拉方法(前项):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]=DEEuler('doty',0,2,1,20)可得到结果:x1 =0 0.1000 0.2000 0.3000 0.4000 0.5000 0.6000 0.70000.8000 0.9000 1.0000 1.1000 1.2000 1.3000 1.4000 1.50001.6000 1.7000 1.8000 1.90002.0000y1 =1.0000 0.9000 0.8110 0.7339 0.6695 0.6186 0.5817 0.55950.5526 0.5613 0.5862 0.6276 0.6858 0.7612 0.8541 0.96471.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.59340.5907 0.6034 0.6321 0.6771 0.7388 0.8175 0.9134 1.02691.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.75000.8000 0.8500 0.9000 0.9500 1.0000 1.0500 1.1000 1.15001.2000 1.2500 1.3000 1.3500 1.4000 1.4500 1.5000 1.55001.6000 1.6500 1.7000 1.7500 1.8000 1.8500 1.9000 1.95002.0000y1 =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.68050.7126 0.7490 0.7897 0.8347 0.8841 0.9379 0.9961 1.05881.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.70590.7388 0.7760 0.8175 0.8633 0.9134 0.9679 1.0269 1.09031.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步时近似解的值要接近于解析解,误差更小,结果更精确。
第五章:常微分方程数值解法第一节欧拉法

分别利用欧拉法和改进欧拉法求解微分方程组的数值解

分别利用欧拉法和改进欧拉法求解微分方程组的数值解欧拉法(Euler’s Method)和改进欧拉法(Improved Euler’s Method),是求解常微分方程数值解的两种常用方法。
它们都属于一阶精度的显式迭代算法。
首先,我们来介绍一下欧拉法。
欧拉法是一种简单的数值求解算法,它基于微分方程的定义,将微分方程转化为差分方程。
考虑一个一阶常微分方程 dy/dx = f(x, y),并给定初始条件 y(x0)= y0,我们希望求解在给定区间 [x0, xn] 上方程的数值解。
首先,我们将区间 [x0, xn] 平均分成 N 个小区间,每个小区间的长度为 h = (xn - x0) / N。
然后,我们可以使用以下的欧拉迭代公式计算数值解:y[i+1] = y[i] + h * f(x[i], y[i])其中,x[i] = x0 + i * h,y[i] 是在点 x[i] 处的数值解。
通过不断迭代上述公式,我们可以获得[x0, xn] 上微分方程的数值解。
欧拉法的优点在于简单易懂,计算速度较快。
然而,欧拉法的缺点是精度较低,误差随着步长h 的增大而增大。
为了提高精度,我们可以使用改进欧拉法。
改进欧拉法,也称为龙格–库塔算法(Runge-Kutta Method)或四阶龙格–库塔方法,是一种基于欧拉法的改进算法。
改进欧拉法使用了更多的近似取值,以减小误差。
与欧拉法类似,我们将区间 [x0, xn] 平均分成 N 个小区间,每个小区间的长度为 h = (xn - x0) / N。
然后,我们可以使用以下的公式计算数值解:k1 = h * f(x[i], y[i])k2 = h * f(x[i] + h/2, y[i] + k1/2)y[i+1] = y[i] + k2其中,k1 和 k2 是计算过程中的辅助变量。
通过不断迭代上述公式,我们可以获得 [x0, xn] 上微分方程的数值解。
改进欧拉法相对于欧拉法而言,计算精度更高。
Euler法与修正的Euler法局部截断误差Range-Kutta公式

Comparison with exact results
Temperature, θ(K)
1500
1000
500
0 0
-500
-1000
-1500
Exact solution
h=120 h=240
100
200
300
400
500
Tim e, t (sec)
h=480
Figure 4. Comparison of Euler’s method with exact solution for different step sizes 5
考虑形如
k
ynk ynk 1 h i fni i0
的 k步法,称为阿当姆斯(Adams)方法. k为显0式方法, 为隐k 式0方法,通常称为阿
当姆斯显式与隐式公式,也称Adams-Bashforth公式与Adam -Monlton公式.
22
阿当姆斯显式公式
kp
公式
c p1
1 1 yn1 yn h fn
y( xn ) f ( xn , yn )
y( xn )
d dx
f
( xn ,
yn )
0.5h[f(xn,yn)+f(xn+1, yn+hf(xn, yn))]
=hy’(xn)+0.5h2y”(xn)+0.5h2y'(xn) [fy’]n+
O局 故(h部修y3n)截正+1断 的= 误Eyun差l+er:h法yy(’具xddyn(x有y+(x1x)20n–))阶+fy精0n(+.xy15度0,=hy。2y)y(,”xxn)(–xnxy)n0+=OO((hh33))
向前欧拉法,向后欧拉法与改进欧拉法求解微分方程

向前欧拉法,向后欧拉法与改进欧拉法求解微分方程
向前欧拉法、向后欧拉法和改进欧拉法是求解微分方程的常用数值方法。
这些方法都是基于欧拉公式,即将微分方程中的导数用差分代替,从而将微分方程转化为差分方程,进而用数值方法求解。
向前欧拉法是一种简单的数值方法,它利用当前时刻的导数来估计下一时刻的解。
具体来说,假设微分方程为dy/dt=f(y,t),则向前欧拉法的迭代公式为:y_n+1=y_n+hf(y_n,t_n),其中h为时间步长。
这个公式可以看作是在当前时刻上做一个切线,然后用这个切线的斜率来估计下一时刻的解。
向后欧拉法是一种更加精确的数值方法,它利用下一时刻的导数来估计当前时刻的解。
具体来说,向后欧拉法的迭代公式为:
y_n+1=y_n+hf(y_n+1,t_n+1),其中h为时间步长。
这个公式可以看作是在下一时刻上做一个切线,然后用这个切线的斜率来估计当前时刻的解。
由于向后欧拉法需要解一个非线性方程,因此比向前欧拉法更加复杂。
改进欧拉法是向前欧拉法和向后欧拉法的结合,它利用当前时刻和下一时刻的导数来估计当前时刻的解。
具体来说,改进欧拉法的迭代公式为:y_n+1=y_n+(h/2)(f(y_n,t_n)+f(y_n+1,t_n+1)),其中h 为时间步长。
这个公式可以看作是在当前时刻和下一时刻上各做一个切线,然后将这两个切线的斜率取平均值来估计当前时刻的解。
改进欧拉法相对于向前欧拉法和向后欧拉法更加精确。
总的来说,向前欧拉法、向后欧拉法和改进欧拉法都是求解微分
方程的有力工具,使用时需要根据具体问题选择合适的方法。
第2讲(欧拉法续、局部截断误差相容性等)

2021/5/23
1
三种数值方法:
欧拉方法: yi1 yi h f ( xi , yi )
后退欧拉方法: yi1 yi h f ( xi1 , yi1 )
梯形方法:
1 yi1 yi 2 h [ f ( xi , yi ) f ( xi1 , yi1 )]
y(0) i1
Discrete operator
ODE operator
p 越大表示离散方程与原微分方程近似程度越高。
2021/5/23
9
对于欧拉方法,易见
yi1 yi h f ( xi , yi )
LTE y( xi1 ) y( xi ) h f ( xi , y( xi ))
y( xi1 ) y( xi ) h y( xi )
h LTE y( xi1 ) y( xi ) 2 f ( xi , y( xi )) f ( xi1, y( xi1 ))
y( xi1 )
y( xi )
h 2
[
y(
xi
)
y( xi1 )]
h y(
h3 6
y( xi )
h4 24
y(4) (1 )
h 2
2021/5/23
16
3. 收敛性(是算法有实际意义的理论基础)
当等距步长 h 0 时,若 xi [a, b], i 0, 1, n,
都有 yi y( xi ) ,则称原算法是收敛的,且
ei
yi y( xi )
称为整体截断误差。若
max i
ei
O (h p ),
则称原算法是 p (p≥1) 阶收敛的或具有 p 阶精度。
1,
2
Euler法和改进的Euler法实验报告

用Euler法和改进的Euler法求u' -5u(0 < t w,,(0)=1的数值解,步长h=0.1, 0.05,并比较两个算法的精度。
解:1) 当步长h=0.1 时编写程序如下所示clf clear clc%直接求解微分方程y=dsolve( 'Dy=-5*y' , 'y(0)=1' , 't' )%Euler 法h=0.1;t=0:h:1; n=length(t);u=zeros(1,n); u(1)=1;zbu(1,1)=t(1); zbu(2,1)=u(1);for i=2:nf=-5*u(i-1); u(i)=u(i-1)+h*f;zbu(1,i)=t(i); zbu(2,i)=u(i);endzbu%改进的Euler 法v=zeros(1,n);v0=zeros(1,n); v(1)=1;zbv(1,1)=t(1); zbv(2,1)=v(1);for i=2:n f=-5*v(i-1); v0(i)=v(i-1)+h*f; v(i)=v(i-1)+h/2*(f-5*v0(i)); zbv(1,i)=t(i); zbv(2,i)=v(i);end zbvplot(t,u, 'r*' , 'markersize' ,10)hold on,plot(t,v, 'r.' , 'markersize' ,20)hold on,ezplot(y,[0,1])hold on,title( 'Euler 法和改进的Euler 法比较(h=0.1 )),grid onlegend( 'Euler 法’,'?改进的Euler 法','解析解')%解真值h=0.1;t=O:h:1;n=len gth(t);for i=1: ny(i)=1/exp(5*t(i)); %通过第一部分程序直接解得的解析解zby(1,i)=t(i);zby(2,i)=y(i);endzby我们可以得到计算后的结果图像如图一所示EulBr法和改进的Eutgr法比较)0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.9 09 1图1 Euler法和改进的Euler法比较(h=0.1)同时,我们得到Euler法,改进的Euler法和解析解的在各点处数值分别如下所示:t坐标0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 欧拉 1.0000 0.5000 0.2500 0.1250 0.0625 0.0313 0.0156 0.0078 0.0039 0.0020 0.0010 改进欧拉 1.0000 0.6250 0.3906 0.2441 0.1526 0.0954 0.0596 0.0373 0.0233 0.0146 0.0091 真值 1.0000 0.6065 0.3679 0.2231 0.1353 0.0821 0.0498 0.0302 0.0183 0.0111 0.0067 表1 Euler法和改进的Euler法在各点数值比较(h=0.1)为了比较Euler法和改进的Euler法的算法精度,在这里我们利用相对误差的概念进行评判。
常微分方程作业欧拉法与改进欧拉法

P7731.利用改进欧拉方法计算下列初值问题,并画出近似解的草图:代码:%改进欧拉法function Euler(t0,y0,inv,h)n=round(inv(2)-inv(1))/h;t(1)=t0;y(1)=y0;for i=1:ny1(i+1)=y(i)+h*fun(t(i),y(i));t(i+1)=t(i)+h;y(i+1)=y(i)+1/2*h*(fun(t(i),y(i))+ fun(t(i+1),y1(i+1)))endplot(t,y,'*r')function y=fun(t,y);y=y+1;调用:Euler(0,3,[0,2],0.5)得到解析解:hold on;y=dsolve('Dy=y+1','(y(0)=3)','t');ezplot(y,[0,2])图像:代码:function Euler1(t0,y0,inv,h)n=round(inv(2)-inv(1))/h;t(1)=t0;y(1)=y0;for i=1:ny1(i+1)=y(i)+h*fun(t(i),y(i));t(i+1)=t(i)+h;y(i+1)=y(i)+1/2*h*(fun(t(i),y(i))+ fun(t(i+1),y1(i+1))) endplot(t,y,'*r')function y=fun(t,y);y=y^2-4*t;调用:Euler1(0,0.5,[0,2],0.2)图像:代码:function Euler2(t0,y0,inv,h)n=round(inv(2)-inv(1))/h;t(1)=t0;y(1)=y0;for i=1:ny1(i+1)=y(i)+h*fun(t(i),y(i));t(i+1)=t(i)+h;y(i+1)=y(i)+1/2*h*(fun(t(i),y(i))+ fun(t(i+1),y1(i+1))) endplot(t,y,'*r')function y=fun(t,y);y=(3-y)*(y+1);调用:Euler2(0,4,[0,5],1)得到解析解:hold on;y=dsolve('Dy=(3-y)*(y+1)','y(0)=4','t');ezplot(y)图像:代码:function Euler2(t0,y0,inv,h)n=round(inv(2)-inv(1))/h;t(1)=t0;y(1)=y0;for i=1:ny1(i+1)=y(i)+h*fun(t(i),y(i));t(i+1)=t(i)+h;y(i+1)=y(i)+1/2*h*(fun(t(i),y(i))+ fun(t(i+1),y1(i+1))) endplot(t,y,'*r')function y=fun(t,y);y=(3-y)*(y+1);调用:Euler2(0,4,[0,5],0.5)得到解析解:hold on;y=dsolve('Dy=(3-y)*(y+1)','y(0)=4','t');ezplot(y)图像:14.考虑满足初始条件(x(0),y(0))=(1,1)的下列方程组:选定时间步长 t=0.25,n=5.用改进欧拉方法求两个方程组的近似解;(1)代码:function Euler4(t0,int,n,h)t=t0;x(1)=int(1);y(1)=int(2);for i=1:nx1(i+1)=x(i)+h*xfun(t(i),x(i),y(i));y1(i+1)=y(i)+h*yfun(t(i),x(i),y(i));t(i+1)=t(i)+h;x(i+1)=x(i)+1/2*h*(xfun(t(i),x(i),y(i))+xfun(t(i+1),x1(i+1) ,y1(i+1)));y(i+1)=y(i)+1/2*h*(yfun(t(i),x(i),y(i))+yfun(t(i+1),x1(i+1) ,y1(i+1)));endplot(t,x,'o-r')hold onplot(t,y,'*-g')hold onplot(x,y)function x=xfun(t,x,y);x=y;function y=yfun(t,x,y);y=-2*x-3*y;调用函数:Euler4(0,[1,1],5,0.25)图像:(2)代码:function Euler5(t0,int,n,h)t=t0;x(1)=int(1);y(1)=int(2);for i=1:nx1(i+1)=x(i)+h*xfun(t(i),x(i),y(i));y1(i+1)=y(i)+h*yfun(t(i),x(i),y(i));t(i+1)=t(i)+h;x(i+1)=x(i)+1/2*h*(xfun(t(i),x(i),y(i))+xfun(t(i+1),x1(i+1) ,y1(i+1)));y(i+1)=y(i)+1/2*h*(yfun(t(i),x(i),y(i))+yfun(t(i+1),x1(i+1) ,y1(i+1)));endplot(t,x,'o-r')hold onplot(t,y,'*-g')hold onplot(x,y)function x=xfun(t,x,y);x=y+y^2;function y=yfun(t,x,y);y=-x+0.2*y-x*y+1.2*y^2;调用函数:Euler5(0,[1,1],5,0.25)图像:。
2013 第3章 数值积分算法

3.1.2 龙格-库塔法
3. 计算所有变量的第三个RK系数向量
k3
k4
x h k 0 1 1 0.1 0.1 0.0975 k k 3 13 A 10 12 k23 x20 2 k22 2 0.5 0 2 1.95 1.96125
3.1.2 龙格-库塔法
t0 0, x0 1
2 k1 f (0, x0 ) x0 1
h h h 2 k 2 f ( , x0 k1 ) ( x0 ) 0.9025 2 2 2 h h h 2 k3 f ( , x0 k 2 ) ( x0 0.9025 ) 0.9118 2 2 2
h t2 0.2 , x2 x1 (k1 2k2 2k3 k4 ) 0.8333 6
h t10 1 , x10 x9 (k1 2k 2 2k3 k 4 ) 0.5000 6
3.1.2 龙格-库塔法
四、矩阵分析法(RK4解状态方程)
二阶、单步、显式
3.1.2 龙格-库塔法
一、龙格-库塔(Runge-Kutta)积分算法思路 间接利用泰勒展开式。用在若干个点上函数值
f(t,y) 的线性组合来代替高阶导数项,既可以避免计
算高阶导数,又可以提高数值计算精度。
3.1.2 龙格-库塔法
二、二阶Runge-Kutta法
xn 1 xn hk2 k1 f (tn , xn ) h h k2 f (tn , xn k1 ) 2 2
显式算法:计算 xn+1 时,没有用到 tn 时刻以后的状态或输入。
欧拉法

欧拉法的MATLAB实现班级:123082--04 姓名:应业敏学号:20081001088摘要:在数学和计算机科学中,欧拉方法(Euler method)命名自它的发明者莱昂哈德·欧拉,是一种一阶数值方法,用以对给定初值的常微分方程(即初值问题)求解。
它是一种解决常微分方程数值积分的最基本的一类显型方法(Explicit method)。
欧拉法(euler method)是以流体质点流经流场中各空间点的运动即以流场作为描述对象研究流动的方法。
它不直接追究质点的运动过程,而是以充满运动液体质点的空间——流场为对象。
研究各时刻质点在流场中的变化规律。
将个别流体质点运动过程置之不理,而固守于流场各空间点。
通过观察在流动空间中的每一个空间点上运动要素随时间的变化,把足够多的空间点综合起来而得出的整个流体的运动情况。
基本思想:基本思想是迭代。
其中分为前进的EULER法、后退的EULER法、改进的EULER法。
所谓迭代,就是逐次替代,最后求出所要求的解,并达到一定的精度。
误差可以很容易的计算出来。
特点:单步,显式,一阶求导精度,截断误差贰阶缺点:欧拉法简单地取切线的端点作为下一步的起点进行计算,当步数增多时,误差会因积累而越来越大。
因此欧拉格式一般不用于实际计算。
改进欧拉格式:为提高精度,需要在欧拉格式的基础上进行改进。
采用区间两端的函数值的平均值作为直线方程的斜率。
改进欧拉法的精度为二阶。
算法为:微分方程的本质特征是方程中含有导数项,数值解法的第一步就是设法消除其导数值,这个过程称为离散化。
实现离散化的基本途径是用向前差商来近似代替导数,这就是欧拉算法实现的依据。
欧拉(Euler)算法是数值求解中最基本、最简单的方法,但其求解精度较低,一般不在工程中单独进行运算。
所谓数值求解,就是求问题的解y(x)在一系列点上的值y(xi)的近似值yi。
对于常微分方程:,x∈[a,b]y(a) = y0可以将区间[a,b]分成n段,那么方程在第x i点有y'(x i) = f(x i,y(x i)),再用向前差商近似代替导数则为:,在这里,h是步长,即相邻两个结点间的距离。
欧拉及改进的欧拉法求解常微分方程

生物信息技术0801徐聪U200812594
#include<stdio.h>
#include<math.h>
void f1(double *y,double *x,double *yy)
{
y[0]=2.0;
x[0]=0.0;
yy[0]=2.0;
f1(y,x,yy);
}
{
y[0]=2.0;
x[0]=0.0;
yy[0]=2.0;
for(int =1;i<=9;i++)
{
x[i]=x[i-1]+0.2;
y0[i]=y[i-1]+0.2*(y[i-1]-x[i-1]);
y[i]=y[i-1]+0.1*(y[i-1]-x[i-1]+y0[i-1]-x[i-1]);
yy[i]=x[i]+1+exp(x[i]);
printf("若x=%f,计算值是%f,真实值是%f,截断误差是%f\n ",x[i],y[i],yy[i],y[i]-yy[i]);
}
};
void f4(double *y,double *x,double *yy,double *y0)
{
y[0]=1.0;
x[0]=0.0;
yy[0]=1.0;
}
};
void f2(double *y,double *x,double *yy)
{
y[0]=1.0;
x[0]=0.0;
yy[0]=1.0;
for(int i=1;i<=9;i++)
欧拉法与改进欧拉法

一、目的1.通过本实验加深对欧拉法、改进欧拉法、龙格-库塔法、线性多步法的构造过程的理解;2.能对上述三种方法提出正确的算法描述编程实现,观察计算结果的改善情况。
二、内容与设计思想 自选常微分方程的初值问题,分别用欧拉法、改进欧拉法求解。
分别用以上两种方法求解常微分方程初值问题:2'()1,([0.0,1.4],0.1)(0)0.0y x y h y ⎧=+=⎨=⎩求解区间取步长三、使用环境操作系统:windons XP软件平台:VC 6.0四、核心代码及调试过程#include <stdio.h>#include <conio.h>#include <math.h>double f(double x,double y){return (1+y*y);}int main(){int i;double x,y,y0=1,dx=0.1;double xx[11];double euler[11],euler_2[11];double temp;double f(double x,double y);for (i=0;i<11;i++)xx[i]=i*dx;euler[0]=y0;for (i=1,x=0;i<11;i++,x+=dx)euler[i]=euler[i-1]+dx*f(x,euler[i-1]);euler_2[0]=y0;for (i=1,x=0;i<11;i++,x+=dx){printf("x=%lf\teluer=%lf\teuler_2=%lf\taccu=%lf\n",x,euler[i],euler_2[i],pow(1+x*x,1.0/3));getch();}temp=euler_2[i-1]+dx*f(x,euler_2[i-1]);euler_2[i]=euler_2[i-1]+dx*(f(x,euler_2[i-1])+f(x+dx,temp))/2; }#include <stdio.h>#include <math.h>#include <process.h>#define MAX_N 20double f(double x,double y){return (1+y*y);}void euler(double a,double b,double init_val,int n){int i;double h,x[MAX_N],y[MAX_N];h=(b-a)/n;x[0]=a;y[0]=init_val;printf("y[%0.lf]=%lf\t",x[0],y[0]);for (i=1;i<=n;i++){y[i]=y[i-1]+h*f(x[i-1],y[i-1]);x[i]=a+i*h;y[i]=y[i-1]+0.5*h*(f(x[i-1],y[i-1])+f(x[i],y[i]));printf("y[%0.2lf]=%lf\t",x[i],y[i]);if ((i+1)%3==0)printf("\n");}}void main(){double a=0.0,b=1.4,init_val=1.0;euler(a,b,init_val,5);}运行结果:五、总结通过编程学会了对欧拉法和改进欧拉法的运用六、附录。
matlab软件欧拉算法教程

改进Euler方法计算框图 开始
输入x0 , y0 , h, b
n 1
x1 x0 h y p y0 hf ( x0 , y0 ) yc y0 hf ( x1 , y p ) 1 y1 ( yc y p ) 2
输出x1 , y1
n n 1 x0 x1 , y0 y1
用三个点x n , x n p , x nq的斜率K 1 , K 2 , K 3 加权平均得出 平均斜率K 的近似值,计算格式具有
*
yn1 yn h(1 )K1 K2 K3
K1 , K2为二阶Runge-Kutta格式的表达式 如何预报K3?
在区间[xn ,xn+q ]已知两个斜率值K1,K2,对K1,K2加权 平均得出此区间的平均斜率,从而得到y(xn+q )的预报 值yn+q
Step 1: 将 K2 在 ( xn , yn ) 点作 Taylor 展开
K 2 f ( xn ph , yn phK1 ) f ( xn , yn ) phf x ( xn , yn ) phK1 f y ( xn , yn ) O( h2 )
y( xn ) phy( xn ) O(h2 )
ynq yn qh(1 )K1 K2
K 3 f ( x n q , yn q )
因此K 3为:
利用Taylor展开法选择参数p, q, , , ,使此计算格式 具有三阶精度这类格式统称为三阶Runge-Kutta格式
R-K法的常用公式
常用的三阶R-K方法.
经典R-K公式 每一步计算需 要四个函数值
注意的问题
Runge-Kutta法的主要运算在于计算 Ki 的值,即计算 f 的值。计算量与可达到的最高精度阶数的关系:
_改进欧拉方法范文

_改进欧拉方法范文改进欧拉方法的方法有很多,并且可以从多个方面进行改进。
在下面的文本中,将介绍三种常见的改进方法:改进的欧拉方法、修正的欧拉方法和改进的欧拉方法。
改进的欧拉方法(Improved Euler Method)是一种将欧拉方法进行改进的方法,它通过对函数的斜率进行线性插值来提高计算精度。
具体来说,改进的欧拉方法使用欧拉方法所计算出的斜率与下一个时间步上使用欧拉方法所计算出的斜率的平均值来计算下一个时间步的值。
改进的欧拉方法的迭代公式如下:y(i+1)=y(i)+(1/2)*h*(f(t(i),y(i))+f(t(i+1),y(i)+h*f(t(i),y(i ))))其中,i表示当前时间步,i+1表示下一个时间步,h表示时间步长,t(i)表示当前时间,t(i+1)表示下一个时间,y(i)表示在当前时间步处的函数值,y(i+1)表示下一个时间步处的函数值,f(t,y)表示在时间t处函数的斜率。
修正的欧拉方法(Modified Euler Method)是在改进的欧拉方法的基础上进行改进的方法,它通过对两个时间步使用欧拉方法所计算出的斜率的平均值来计算下一个时间步的值。
修正的欧拉方法的迭代公式如下:y(i+1)=y(i)+h*f(t(i)+1/2*h,y(i)+1/2*h*f(t(i),y(i)))其中,i表示当前时间步,i+1表示下一个时间步,h表示时间步长,t(i)表示当前时间,y(i)表示在当前时间步处的函数值,y(i+1)表示下一个时间步处的函数值,f(t,y)表示在时间t处函数的斜率。
改进的欧拉方法(Heun's method)是一种通过将两个时间步的斜率进行加权平均来计算下一个时间步的值的方法。
改进的欧拉方法的迭代公式如下:y(i+1)=y(i)+(1/2)*h*(f(t(i),y(i))+f(t(i+1),y(i)+h*f(t(i),y(i ))))其中,i表示当前时间步,i+1表示下一个时间步,h表示时间步长,t(i)表示当前时间,t(i+1)表示下一个时间,y(i)表示在当前时间步处的函数值,y(i+1)表示下一个时间步处的函数值,f(t,y)表示在时间t处函数的斜率。
用欧拉法、改进欧拉法、四阶龙格-库塔法解初值问题

常微分方程的数值解一、实验名称:用欧拉法、改进欧拉法、四阶龙格-库塔法解初值问题[])( b a, x ),(00⎪⎩⎪⎨⎧=∈=y x y y x f dx dy 要求输出:x ,真值,欧拉法,改进欧拉法,龙格库塔法二、算法:(1)欧拉法公式:),(1n n n n y x f h y y +=+(2)改进欧拉法公式:[]),(),(2111+++++=n n n n n n y x f y x f h y y (3)龙格—库塔法公式: ()⎪⎪⎪⎪⎪⎩⎪⎪⎪⎪⎪⎨⎧++=⎪⎭⎫ ⎝⎛++=⎪⎭⎫ ⎝⎛++==++++=+342312143211,2,212,21),()22(6hk y h x f k k h y h x f k k h y h x f k y x f k k k k k h y y n n n n n n n n n n 三、源程序(见附件)1. 常微分方程见f.m2. 欧拉法、改进欧拉法、龙格库塔法及真值对比见cwffc.m四、数值例子以讲义例9.2为例:⎪⎩⎪⎨⎧=-=1)0(2y y x y dxdy 在区间[0,1.5]上,取h=0.11.在命令窗口输入: cwffc(@f,1,0.1,0,1.5)、回车输出:欧拉法、改进欧拉法、龙格库塔法的计算结果及真值五、分析总结由以上的实例可以看出这三种方法的计算精度:龙格库塔>改进欧拉法>欧拉法,由于欧拉法采取的实际是左矩形公式,随着计算次数的增多,其误差越来越大,改进欧拉法较欧拉法的精度要高,而龙格库塔法具有收敛、稳定、计算过程中可以改变步长等优点。
六、操作手册1.双击启动matlab;2.在命令窗口依次输入cwffc(@fx,y0,h,a,b),回车(输入时给y0赋初始值,h赋步长,a赋左端点值,b赋右端点值,常微分方程的修改在f.m 中进行),即可输出真值和欧拉法、改进欧拉法、龙格库塔法的计算结果。
Euler法与改进Euler法

f ( xk1 , ~yk 1 ))
h yn1 yn 2 f ( xn , yn ) f ( xn1 , yn1 )]
作等价变换:
yn1
K
1
f
h yn 2 ( xn , yn
(K1 )
K
2
)
K
2
f (xn
h, yn hK1 )
y( x0 ) y0
第20页/共40页
二、改进的Euler法
第4页/共40页
常微分方程数值解法
初值问题数值解的提法
所谓数值解法,就是寻求解y( x)在一系列离散节点 a x0 x1 x2 xn xN b
上的近似值 y0 , y1, y2 , yn , yN 相邻两个节点的间距hn xn1 xn称为步长。 如不特别说明,总是假定hi h(i 0,1,2)为定数,
hf
(xn ,
y(xn ))
1 2
h2
y( )
yn
hf
(xn ,
yn )
1 2
h2
y( )
xn xn1
得Euler方法的局部截断误差公式为
Rn1
y( xn1)
第14页/共40页
结论:上式说明Euler公式的局部截断误差为 O(h2 ) 它的精度很差。 一般很少用它来求近似值,但是Euler法 却体现了数值方法的基本思想。
注意:这是“折线法”而非“切线法” y 除第一个点是曲线切线外,其他点不是!
Y=y(x)
第12页/共40页
a
x1χx0
χ1χ2
2
χ3
b
χ
五、Euler方法的误差估计
为简化分析,先考虑计算一步所产生的误差,即假设
欧拉公式的改进

改进欧拉法 /* modified Euler’s method */
§1 Euler’s Method
Step 1: 先用显式欧拉公式作预测,算出 yi+1 = yi + h f ( xi , yi )
Step 2: 再将 yi+1 代入隐式梯形公式的右边作校正,得到
yi +1
=
yi
+
h 2
Step 3: 将 yi+1 与 y( xi+1 ) 在 xi 点的泰勒展开作比较
yi+1 = yi + (1+ 2 )h y( xi ) + 2 ph2 y( xi ) + O(h3 )
y( xi+1 ) =
y( xi ) + hy( xi ) +
h2 2
y( xi ) + O(h3 )
Hey! Isn’t the leading term of the local
由于未知数tryui+n1c同atSio时enem出ersr现tohra在otfwE等eucl式earn’的smma两ekte边haod,goho不22dy能(x直i )?接得到,故 称为隐式 /* implicit */ 欧拉us公e o式f it,…而前者称为显式 /* explicit */ 欧拉公式。 一般先用显式计算一个初值,再迭代求解。
迭代法m,et其ho迭d *代/,收而敛前性面与的欧三拉种公算式法相都似是。单步法 /* single-step method */。
中点欧拉公式 /* midpoint formula */
中心差商近似导数
y( x2 ) y( x0 ) +
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目再现:
2. 当病人采取服用口服药或肌肉注射来治疗疾病时,药物虽然瞬间进入了体内,但它一般都集中与身体的某一部位,靠其表面与肌体接触而逐步被吸收。
假定身体系统是一个单房室系统,设t 时刻体内药物的总量为x(t),则x(t)满足:
问题分析:运用欧拉公式求微分方程的数值解。
微分方程为:
11dx ,(0)0dt
k t k De kx x -=-= 1,欧拉折线法:
设h=0.1,即n=201时,1k 0.6=,k 0.2=,D=200.MATLAB 程序如下所示:
clear
f=sym('0.6*200*exp(-1*0.6*t)-0.2*x ');
a=0; b=20;
h=0.1;
n=(b-a)/h+1;
t=0; x=0;
szj=[t,x];
for i=1:n-1
11dx ,(0)0
dt k t k De kx x -=-=10011100 ,(,)()k t k k k k k k k
t x x x h f t x x h k De kx t t h -++==⎧⎪=+=+-⎨⎪=+⎩
x=x+h*subs(f,{'t','x'},{t,x});
t=t+h;
szj=[szj;t,x];
end
szj ;
x=dsolve(‘Dx=120*exp(-0.6*t)-0.2*x’,'x(0)=0','t')
T=[0:0.1:20];
X=subs(x,T);
plot(szj(:,1),szj(:,2),'or-',T,X,’b-’)
输出结果为:
解析解:x=
其中红线代表的是数值解,蓝线代表的是解析解。
可见,数值解的误差还是比较小的。
二、改进的欧拉法:有公式:
[]11100(,)(,)2
()i i i i i i h x x f t x f t x x x t +++=+
+= 与欧拉公式结合使用,有
(0)1(1)
()111(,)
[(,)(,)],0,1,2 (2)
i i i i k k i i i i i i x x hf t x h x x f t x f t x k +++++=+=++= 设h=0.1,即n=201时,1k 0.6=,k 0.2=,D=200.MATLAB 程序如下所示:
clear
f=sym('0.6*200*exp(-1*0.6*t)-0.2*x');
a=0; b=20;
h=0.1;
n=(b-a)/h+1;
t=0; x=0;
szj=[t,x];
for i=1:n-1
m=0;p=0;q=0;
m=x;
q=subs(f,{'t','x'},{t,m});
x=m+h*q;
if abs(p-x)>0.1
p=x;
x= m+h/2*(q+subs(f,{'t','x'},{t+h,x}));
end
t=t+h;
szj=[szj;t,x];
end
szj ;
x=dsolve('Dx=120*exp(-0.6*t)-0.2*x', 'x(0)=0','t')
T=[0:0.1:20];
X=subs(x,T);
plot(szj(:,1),szj(:,2),'or-',T,X,'b-')
可见,改进后的欧拉算法误差更小,极其精确,基本与原曲线重合。