二阶龙格-库塔

合集下载

龙格-库塔方法(Runge-Kutta)

龙格-库塔方法(Runge-Kutta)

龙格-库塔方法〔Runge-Kutta〕3.2 Runge-Kutta法3.2.1 显式Runge-Kutta法的一般形式上节已给出与初值问题(1.2.1)等价的积分形式(3.2.1)只要对右端积分用不同的数值求积公式近似就可得到不同的求解初值问题(1.2.1)的数值方法,假设用显式单步法(3.2.2)当,即数值求积用左矩形公式,它就是Euler法(3.1.2),方法只有一阶精度,假设取(3.2.3)就是改良Euler法,这时数值求积公式是梯形公式的一种近似,计算时要用二个右端函数f的值,但方法是二阶精度的.假设要得到更高阶的公式,则求积分时必须用更多的f值,根据数值积分公式,可将(3.2.1)右端积分表示为注意,右端f中还不能直接得到,需要像改良Euler法(3.1.11)一样,用前面已算得的f值表示为(3.2.3),一般情况可将(3.2.2)的 表示为(3.2.4)其中这里均为待定常数,公式(3.2.2),(3.2.4)称为r级的显式Runge-Kutta法,简称R-K方法.它每步计算r个f值(即由前面(i-1)个已算出的表示,故公式是显式的.例),而ki如当r=2时,公式可表示为(3.2.5) 其中.改良Euler 法(3.1.11)就是一个二级显式R-K 方法.参数取不同的值,可得到不同公式.3.2.2 二、三级显式R-K 方法对r=2的显式R-K 方法(3.2.5),要求选择参数,使公式的精度阶p 尽量高,由局部截断误差定义11122211()()[(,())(,)]n n n n n n n T y x y x h c f x y x c f x a h y b hk ++=--+++ (3.2.6)令,对(3.2.6)式在处按Taylor 公式展开,由于将上述结果代入(3.2.6)得要使公式(3.2.5)具有的阶p=2,即,必须(3.2.7)即由此三式求的解不唯一.因r=2,由〔3.2.5〕式可知,于是有解(3.2.8)它说明使(3.2.5)具有二阶的方法很多,只要都可得到二阶精度R-K方法.假设取,则,则得改良Euler法(3.1.11),假设取,则得,此时(3.2.5)为(3.2.9)其中称为中点公式.改良的Euler法(3.1.11)及中点公式(3.2.9)是两个常用的二级R-K方法,注意二级R-K方法只能到达二阶,而不可能到达三阶.因为r=2只有4个参数,要到达p=3则在(3.2.6)的展开式中要增加3项,即增加三个方程,加上(3.2.7)的三个方程,共计六个方程求4个待定参数,验证得出是无解的.当然r=2,p=2的R-K方法(3.2.5)当取其他数时,也可得到其他公式,但系数较复杂,一般不再给出.对r=3的情形,要计算三个k值,即其中将按二元函数在处按Taylor公式展开,然后代入局部截断误差表达式,可得可得三阶方法,其系数共有8个,所应满足的方程为(3.2.10)这是8个未知数6个方程的方程组,解也是不唯一的,通常.一种常见的三级三阶R-K方法是下面的三级Kutta方法:(3.2.11)附:R-K 的三级Kutta 方法程序如下function y = DELGKT3_kuta(f, h,a,b,y0,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)]);K2 = Funval(f,varvec,[x(i-1)+h/2 y(i-1)+K1*h/2]); K3 = Funval(f,varvec,[x(i-1)+h y(i-1)-h*K1+K2*2*h]);y(i) = y(i-1)+h*(K1+4*K2+K3)/6; %满足c1+c2+c3=1,(1/6 4/6 1/6)endformat short; 3.2.3 四阶R-K 方法及步长的自动选择利用二元函数Taylor 展开式可以确定(3.2.4)中r=4,p=4的R-K 方法,其迭代公式为111223344()n n y y h c k c k c k c k +=++++其中1(,)n n k f x y =,2221(,(,))n n n n k f x a h y b hf x y =++,而33311322(,)n n k f x a h y b hk b hk =+++ 44411422433(,)n n k f x a h y b hk b hk b hk =++++共计13个参数待定,Taylor 展开分析局部截断误差,使得精度到达四阶,即误差为5()O h 。

龙格-库塔方法基本原理3

龙格-库塔方法基本原理3
a2c2h2 fx b21c2h2 ff y O(h3)
2020/4/7
15
令 y(xi1) yi1 对应项的系数相等,得到
c1 c2 1 ,
a2c2
1 2
,
b21c2
1 2
这里有 4 个未知 数,3 个方程。
存在无穷多个解。所有满足上式的格式统称为2阶 龙格 - 库塔格式。
2020/4/7
称为P阶龙格-库塔方法。
其中ai,bij,ci为待定参数,要求上式yi+1在点(xi,yi)处作 Tailor展开,通过相同项的系数确定参数。
2020/4/7
9
Runge-Kutta方法的推导思想
对于常微分方程的初值问题
y f (x, y) a x b
y(a)
y0
的解y=y(x),在区间[xi, xi+1]上使用微分中值定理,有
hf (xi 2
,
yi
1 2
K1 )
K3 hf (xi h, yi K1 2K 2 )
2020/4/7
22
四阶(经典)龙格—库塔法
如果需要再提高精度,用类似上述的处理 方法,只需在区间[xi,xi+1]上用四个点处的斜 率加权平均作为平均斜率K*的近似值,构成一 系列四阶龙格—库塔公式。具有四阶精度,即 局部截断误差是O(h5)。
f x(xi , yi ) f (xi , yi ) f y (xi , yi ) O(h3 )
类似地,若取前P+1项作为y(xi+1)的近似值,便得到
yi1
yi
hyi
h2 2!
yi
hP P!
yi(P)
P阶泰勒方法
其中 yi f , yi f (xi , yi )x f x ff y

python龙格库塔法求解二阶方程

python龙格库塔法求解二阶方程

Python是一种高级编程语言,广泛应用于科学计算和工程领域。

而在科学计算中,求解二阶常微分方程是一个常见的问题。

龙格库塔法(Runge-Kutta method)是一种常用的数值求解方法,可以用来求解常微分方程的初值问题。

在Python中,我们可以利用其强大的数值计算库来实现龙格库塔法求解二阶常微分方程。

在本文中,我们将介绍如何使用Python中的龙格库塔法来求解二阶常微分方程。

文章将从以下几个方面展开讲解:1. 二阶常微分方程的基本概念2. 龙格库塔法的原理与公式推导3. Python中如何实现龙格库塔法求解二阶常微分方程4. 一个具体的求解例子及代码实现5. 总结与展望一、二阶常微分方程的基本概念二阶常微分方程是指具有形如y''(t) = f(t, y, y')(t)的形式,其中t是自变量,y是未知函数,f是已知函数。

求解二阶常微分方程的目标是找到一个满足方程的函数y(t)。

通常情况下,需要给出该方程的初值条件,即y(0)和y'(0),以求得方程的具体解。

二、龙格库塔法的原理与公式推导龙格库塔法是一种数值求解常微分方程初值问题的方法,通过迭代计算来逼近方程的解。

它的基本思想是将微分方程的解按照一定的步长进行逼近,然后利用逼近值来计算下一个逼近值,直到达到所需的精度。

龙格库塔法的一般形式为:k1 = h * f(tn, yn)k2 = h * f(tn + 1/2 * h, yn + 1/2 * k1)k3 = h * f(tn + 1/2 * h, yn + 1/2 * k2)k4 = h * f(tn + h, yn + k3)yn+1 = yn + 1/6 * (k1 + 2*k2 + 2*k3 + k4)其中,h是步长,t是自变量,y是未知函数,f是已知函数,k1、k2、k3、k4是中间变量。

三、Python中如何实现龙格库塔法求解二阶常微分方程在Python中,可以利用其强大的数值计算库来实现龙格库塔法求解二阶常微分方程。

龙格-库塔方法

龙格-库塔方法
§6.2.2 龙格-库塔方法
一、Taylor展开法

y′ = f ( x, y)
y( x0 ) =
y0
(1)
在[a,b]上有解 y( x),将y( xn+1 )在xn处泰勒展开
y( xn+1 )
=
y( xn ) +
hy′( xn ) +
h2 2!
y′′( xn ) +
h3 3!
y′′′( xn ) +
k4 = f ( xn + h, yn + hk1 − hk2 + hk3 )
为了分析经典R-K公式的计算量和计算精度, 将四阶经典R-K公式与一阶显式Euler公式及二阶改 进的Euler公式相比较。一般说来,公式的级数越 大,计算右端项 f 的次数越多,计算量越大。在 同样步长的情况下,Euler方法每步只计算一个函 数值,而经典方法要计算4个函数值。四阶R-K法的
0.5 0.397312
改进Euler法 h=0.05
0.095123 0.181193 0.259085 0.329563 0.393337
经典R-K法 h=0.1 0.09516250 0.18126910 0.25918158 0.32967971 0.39346906
准确解
y(xn )
0.09516258 0.18126925 0.25918178 0.32967995 0.39346934
h 2 k1 )
k3
=
f (xn
+
3 4
h,
yn
+
3 4 hk2 )
四阶龙格—库塔公式有:
古典公式:
yn+1 = k1 = f k2 = f

龙格库塔求解二阶常微分方程

龙格库塔求解二阶常微分方程

龙格库塔求解二阶常微分方程一、前言在数学领域中,常微分方程是一种非常重要的数学工具。

它可以用来描述许多自然现象,如物理学、化学、生物学等。

而龙格库塔法是一种求解常微分方程的方法之一。

本文将介绍如何使用龙格库塔法求解二阶常微分方程。

二、什么是二阶常微分方程二阶常微分方程是指形如y''+p(t)y'+q(t)y=f(t)的方程,其中y表示未知函数,p(t)、q(t)和f(t)都是已知函数。

通常情况下,我们需要找到一个特定的y函数来满足这个方程。

三、什么是龙格库塔法龙格库塔法是一种数值求解常微分方程的方法。

它基于欧拉方法,但更准确和稳定。

欧拉方法使用线性逼近来估计未知函数值,而龙格库塔法使用高阶多项式逼近来更准确地估计未知函数值。

四、龙格库塔法的基本思想1. 将时间区间[0,T]平均分成N个小区间;2. 在每个小区间内进行递推计算,直到得到所有时间点上的y值;3. 每次递推计算都使用龙格库塔公式来估算y的值。

五、龙格库塔法的公式对于二阶常微分方程y''+p(t)y'+q(t)y=f(t),我们可以使用以下公式来递推计算:1. k1=h*y'(t)l1=h*f(t)-p(t)*k1/2-q(t)*y(t);2. k2=h*(y'(t)+l1/2)l2=h*f(t+h/2)-p(t+h/2)*k2/2-q(t+h/2)*(y(t)+k1/2);3. k3=h*(y'(t)+l2/2)l3=h*f(t+h/2)-p(t+h/2)*k3/2-q(t+h/2)*(y(t)+k2/2);4. k4=h*(y'(t)+l3)l4=h*f(t+h)-p(t+h)*k4-q(t+h)*(y(t)+k3);其中,h表示时间步长,t表示当前时间点,f表示已知函数,p和q都是已知常数。

通过这些公式,我们可以得到下一个时间点上的y值。

六、龙格库塔法的实现为了更好地理解龙格库塔法,我们可以看一下具体的实现过程。

龙格-库塔(Runge-Kutta)法

龙格-库塔(Runge-Kutta)法
数值计算方法
龙格-库塔(Runge-Kutta)法 1.1 龙格-库塔(Runge-Kutta)法的基本思想
Euler公式可改写成
yi1 yi hK1 K1 f ( xi , yi )
则yi+1的表达式y(xi+1)与的Taylor展开式的前两项 完全相同,即局部截断误差为 O(h 2 ) 。
为了进一步提高精度,设除 xi p 外再增加一点
xiq xi qh ( p q 1)
并用三个点 xi ,xi p , xiq 的斜率k1,k2,k3加权平均
得出平均斜率k*的近似值,这时计算格式具有形式:
yi1 yi h(1 )k1 k2 k3
k1 f (xi , yi ) k2 f (xi ph, yi phk1 )
格式。
若取 1 0 ,则 2 法的计算公式为
1,
p
1 2
,此时二阶龙格-库塔
ky1i
1
f
yi hk2 ( xi , yi )
k
2
h
f
(
x
i
1
,
yi
2
2 k1 )
i 0,1,2, n 1
此计算公式称为变形的二阶龙格—库塔法。式中
x 1 i 2
为区间
xi , xi1
的中点。
1.3 三阶龙格-库塔法
拉法,将 xi p 视为 xi1,即可得
k2 f (xi ph, yi phk1 ) 对常微分方程初值问题(7.1)式的解 y=y(x),根据微 分中值定理,存在点 (xi , xi1 ) ,使得
也即
y(xi1 ) y(xi ) y( )( xi1 xi )
y( xi1 ) y( xi ) hK

龙格库塔法

龙格库塔法
§9-3
一、高阶泰勒法
假设初值问题
龙格—库塔法 龙格 库塔法
dy = f (t , y ) dt y (a) = α 的解y (t)及f (t , y )足够光滑.
将y (ti +1 )在ti处作n阶泰勒展开, 得
a≤t ≤b
(1)
y′′(ti ) 2 y ( n ) (ti ) n y ( n +1) (ξ i ) n +1 y (ti +1 ) = y (ti ) + y′(ti )h + h +L+ h + h n! 2! (n + 1)! 其中, ti < ξ i < ti +1.
2
i
i
1
3
i
i
2
4
i
i
3
i +1
i
6123 Nhomakorabea4
作业 教材P198 习题3
(2)
(3)
首先将y (ti +1 )在ti处展成幂级数 h2 y (ti +1 ) = y (ti ) + hy′(ti ) + y′′(ti ) + O(h 3 ) 2 将 y′(t ) = f (t , y (t )) y′′(t ) = f t′(t , y (t )) + f y (t , y (t )) f (t , y (t )) 代入上式, 得 h2 y (ti +1 ) = y (ti ) + hf + ( f t + ff y ) + O(h 3 ) (3) 2 其中f , f t , f y′分别表示相应函数在点(ti , y (ti ))处的函数值.

二阶微分方程龙格库塔法

二阶微分方程龙格库塔法

二阶微分方程龙格库塔法
1.什么是二阶微分方程?
二阶微分方程是指二阶导数出现的方程,其通用形式为
y''+P(x)y'+Q(x)y=F(x),其中P(x)、Q(x)、F(x)均为已知函数,y是所求函数。

2.为什么要用龙格库塔法?
求解二阶微分方程是数学、物理等领域中常见的问题,然而大多数情况下无法直接解题,所以需要使用数值方法。

龙格库塔法是一种数值方法,被广泛应用于求解微分方程,其优点是精度高、计算速度快。

3.龙格库塔法的原理
龙格库塔法是一种迭代方法,将微分方程看作初值问题,从初始点出发,采用一定的步长h,在每个点上用插值公式逼近y(x+h),以此求得y(x+h)的近似值,一步步逼近所要求的精度。

4.龙格库塔法的步骤
(1)确定步长h和积分区间[a,b]。

(2)用初值y(x0)=y0,y'(x0)=y'0求出y(x0+h)的近似值。

(3)根据龙格库塔公式求得y(x0+2h)的近似值。

(4)对于连续求解的情况,重复以上步骤,直到求得所需的精度或者达到指定的终点。

5.龙格库塔公式
龙格库塔法的精度与所采用的公式有关,一般采用二阶或四阶的龙格库塔公式。

二阶龙格库塔公式为:
y0=y(x0)
k1=h*f(x0,y0)
k2=h*f(x0+h,y0+k1)
y(x0+2h)=y0+1/2(k1+k2)
其中,f(x,y)是待求函数。

6.总结
龙格库塔法是求解微分方程的一种常用数值方法,可以高精度、高效地解决二阶微分方程的问题。

该方法所需的计算量较小,易于编写程序实现,在实际应用中具有广泛的用途。

微分方程的数值解法与近似求解技巧

微分方程的数值解法与近似求解技巧

微分方程的数值解法与近似求解技巧微分方程是数学中的重要概念,广泛应用于物理、工程、经济等领域。

在实际问题中,我们常常遇到无法直接求解的微分方程,这时候就需要借助数值解法和近似求解技巧来解决。

本文将介绍微分方程的数值解法和近似求解技巧,帮助读者更好地理解和应用这些方法。

一、数值解法1. 欧拉法欧拉法是最基础的数值解法之一,通过离散化微分方程,将其转化为差分方程,从而得到近似解。

欧拉法的基本思想是将微分方程中的导数用差商代替,然后通过迭代逼近真实解。

以一阶常微分方程为例,欧拉法的迭代公式如下:\[y_{n+1} = y_n + hf(x_n, y_n)\]其中,\(y_n\)表示第n个点的近似解,\(x_n\)表示对应的自变量的取值,h为步长,\(f(x_n, y_n)\)表示微分方程中的导数。

2. 改进的欧拉法改进的欧拉法是对欧拉法的改进,通过使用两个近似解的平均值来计算下一个点的近似解,从而提高了数值解的精度。

改进的欧拉法的迭代公式如下:\[y_{n+1} = y_n + \frac{h}{2}(f(x_n, y_n) + f(x_{n+1}, y_n + hf(x_n, y_n)))\]3. 二阶龙格-库塔法龙格-库塔法是一种常用的数值解法,通过计算多个近似解的加权平均值来提高数值解的精度。

其中,二阶龙格-库塔法是最简单的一种。

二阶龙格-库塔法的迭代公式如下:\[k_1 = hf(x_n, y_n)\]\[k_2 = hf(x_n + \frac{h}{2}, y_n + \frac{k_1}{2})\]\[y_{n+1} = y_n + k_2\]二、近似求解技巧1. 线性化方法线性化方法是一种常用的近似求解技巧,通过将非线性微分方程线性化,然后使用线性方程的求解方法来得到近似解。

以二阶线性微分方程为例,线性化方法的基本思想是将非线性项进行线性化处理,然后使用线性微分方程的求解方法来得到近似解。

龙格-库塔方法

龙格-库塔方法

8.2 龙格-库塔方法8.2.1 二阶龙格-库塔方法常微分方程初值问题:做在点的泰勒展开:这里。

取,就有(8.11) 截断可得到近似值的计算公式,即欧拉公式:若取,式(8.11)可写成:或(8.12)截断可得到近似值的计算公式:或上式为二阶方法,一般优于一阶的欧拉公式(8.2),但是在计算时,需要计算在点的值,因此,此法不可取。

龙格-库塔设想用在点和值的线性组合逼近式(8.12)的主体,即用(8.13)逼近得到数值公式:(8.14)或更一般地写成对式(8.13)在点泰勒展开得到:将上式与式(8.12)比较,知当满足时有最好的逼近效果,此时式(8.13)-式(8.14)。

这是4个未知数的3个方程,显然方程组有无数组解。

若取,则有二阶龙格-库塔公式,也称为改进欧拉公式:(8.15)若取,则得另一种形式的二阶龙格-库塔公式,也称中点公式:(8.16)从公式建立过程中可看到,二阶龙格-库塔公式的局部截断误差仍为,是二阶精度的计算公式。

类似地,可建立高阶的龙格-库塔公式,同时可知四阶龙格-库塔公式的局部截断误差为,是四阶精度的计算公式。

欧拉法是低精度的方法,适合于方程的解或其导数有间断的情况以及精度要求不高的情况,当解需要高精度时,必须用高阶的龙格-库塔等方法。

四阶龙格-库塔方法应用面较广,具有自动起步和便于改变步长的优点,但计算量比一般方法略大。

为了保证方法的收敛性,有时需要步长取得较小,因此,不适于解病态方程。

8.2.2 四阶龙格-库塔公式下面列出常用的三阶、四阶龙格-库塔计算公式。

三阶龙格-库塔公式(1)(8.17)(2)(8.18)(3)(8.19)四阶龙格-库塔公式(1)(8.20)(2)(8.21)例8.3用四阶龙格-库塔公式(8.20)解初值问题:解:取步长,计算公式为:计算结果列表8.3中。

表8.3 计算结果8.2.3 步长的自适应欧拉方法和龙格-库塔方法在计算时仅用到前一步的值,我们称这样的方法为单步法。

龙格-库塔方法-文档资料

龙格-库塔方法-文档资料
3
c3a 2b32
c3a3 1
6
; 2
O (h4)
常见的2种三阶方法:
库塔三阶方法
h yn1yn6(k14k2k3)
k1
f(xn,yn);
k2
hh f(xn2,yn2k1)
k 3 f(x n h ,y n h k 1 2 h k 2 ) •5
四级方法:N = 4
局部截断误差 O ( h 5 )
可见误差随着 x n 的增加呈指数函数递减
当 f y 0 时,微分方程是不稳定的; 而 f y 0 时,微分方程是稳定的。
上面讨论的稳定性,与数值方法和方程中 f 有关
•21
实验方程: y y C ,R e () 0
D e f 3 对单步法 yn 1ynh(xn,yn,h )应用实验方程,
e n 1 e n h [ ( x n ,y ( x n ) , h ) ( x n ,y n , h ) ] T n 1
•15
因为单步法是 p 阶的:h0,0hh0满足|Tn1|Chp1
|e n 1| |e n| h L |e n| C h p 1|en |
其中 1hL,C hp1
•18
三、绝对稳定性 /*Absolute Stibility*/ 计算过程中产生的舍入误差对计算结果的影响
首先以Euler公式为例,来讨论一下舍入误差的传播:
yn1ynhf(xn,yn)
设实际计算得到的点 x n 的近似函数值为 yn yn n,
其中 y n 为精确值, n 为误差
yn1ynhf(xn,yn)
通过适当选取参数 1,2和 p 的值,使得公式具有 2阶精度!!
•3
由泰勒公式展开,要使公式具有 2 阶精度,只需

龙格库塔法介绍

龙格库塔法介绍

h 0.005稳定.
2) 改进欧拉法(预测 — 校正,即二阶R K法):

yn
1

yn

h
k1 2

k2 2
,

k1

f (xn, yn ) yn,
k2 f (xn h, yn hk1) ( yn hyn ),
即yn1 故

yn
当初值准确即e0 0时,整体误差为en O(h p ).
证明
考察单步法的收敛性归结为验证增量函数(x, y,h)是否
满足Lipschitz条件.
欧拉法 : (x, y,h) f (x, y),L L.
改进的欧拉法:
yn1

yn

h[ 2
f
(xn, yn )
f
( xn 1,
xn
f
( x,
y ( x))dx

r
h ci
i 1
f
( xn

ih,
y ( xn

ih)).

yn1 yn h(xn, yn, h),
(3.4)
其中
r
(xn, yn, h) ciki ,
(3.5)
i 1
k1 f (xn, yn ),
欧拉法r 1, p 1.改进 欧拉法r 2, p 2.
k1)
k3)
k3 f (xn h, yn hk1 2hk2 )
称为库塔三阶方法.
阶数p和段数r(计算函数值次数)的关系
r12 p1 2
3 4 5 6 7 r≥8 3 4 4 5 6 r-2
常用的经典四阶龙格 库塔方法:

2维的龙格库塔算法

2维的龙格库塔算法

2维的龙格库塔算法
二维龙格-库塔算法是一种数值计算方法,用于解决微分方程的数值解。

它使用龙格-库塔方法(Runge-Kutta methods)在二维空间中迭代地计算方程的解。

以下是二维龙格-库塔算法的基本步骤:
1.定义微分方程:给定一个微分方程 dy/dx = f(x, y),其中 y 是未知函数,x 是
自变量。

2.初始化参数:选择初始值 x0 和 y0,以及步长 h 和迭代的最大步数 n。

3.初始化状态向量:创建一个大小为 (n+1)×2 的数组,用于存储 x 和 y 的值。

4.迭代计算:
a. 计算 k1 = h f(x0, y0)
b. 计算 k2 = h f(x0 + h/2, y0 + k1/2)
c. 计算 k3 = h f(x0 + h/2, y0 + k2/2)
d. 计算 k4 = h f(x0 + h, y0 + k3)
e. 更新 y0 = y0 + (k1 + 2k2 + 2k3 + k4) / 6
f. 更新 x0 = x0 + h
g. 如果 x0 小于或等于 n*h,则跳转到步骤 4,否则算法结束。

5. 输出结果:输出 x 和 y 的值。

以上是二维龙格-库塔算法的基本步骤,具体的实现可能会根据不同的微分方程和需求而有所不同。

微分方程的常用数值解法

微分方程的常用数值解法

微分方程的常用数值解法摘要:微分方程是数学中的一种重要的方程类型,它能描述自然现象和工程问题中的许多变化规律。

但是大多数微分方程解法是无法用解析的方式求解的,因此需要借助数值解法来近似求解。

本文将介绍微分方程的常用数值解法。

关键词:欧拉方法;龙格-库塔方法;微分方程;常用数值解法一、微分方程数值解方法微分方程数值解法是数学中的重要部分。

欧拉方法、龙格-库塔方法和二阶龙格-库塔方法是常用的微分方程数值解法,下面就分别介绍这三种方法。

(一)欧拉方法欧拉方法是解初值问题的一种简单方法,它是欧拉用的第一种数值方法,也叫向前欧拉法。

欧拉方法是利用微分方程的定义式y’=f(x, y),将它带入微分方程初值问题y(x_0)=y_0中,以y_0为初始解,在每一步上通过沿着切线的方法进行估计并推进新的解y_{i+1}:y_i+1=y_i+hf(x_i,y_i)其中,x_i和y_i是我们知道的初始条件,h是求解过程中的步长,f是微分方程右端项。

它是一种时间迭代的算法,易于实现,但存在着精度不高的缺点。

(二)龙格-库塔方法龙格-库塔方法是一种经典迭代方法,也是近代微分方程数值解法发展的里程碑之一。

龙格-库塔方法的主要思想是利用规定的阶码及阶向量,通过递推求解微分方程数值解的近似值。

龙格-库塔方法的方式不同,其步骤如下:第一步:根据微分方程,计算出在x_i和y_i的值。

第二步:在x_i处对斜率进行估计,并利用这个斜率来求解下一步所需的y_i+1值。

第三步:使用x_i和y_i+1的值来重新估计斜率。

第四步:使用这个新的斜率来更新y_i+1的值。

(三)二阶龙格-库塔方法二阶龙格-库塔方法是龙格-库塔方法的一种变体,它根据龙格-库塔方法的思想,使用更好的步长来提高数值解的精度。

二阶龙格-库塔方法的基本思路是,在第一次迭代时使用一个阶段小一半的y_i+1,然后使用这个估算值来计算接下来的斜率。

通过这种方法,可以提高解的精度。

二阶龙格-库塔方法的步骤如下:第一步:计算出初始阶段的y_i+1值。

龙格库塔

龙格库塔

龙格-库塔(Runge-kutta)算法在MATLAB中的用法微分方程ode23:使用二阶龙格-库塔法求微分方程,调用格式为:[t,y]=ode23(‘fname’,tspan,y0)ode45:使用四阶龙格-库塔法求微分方程,调用格式为:[t,y]=ode45(‘fname’,tspan,y0)其中fname为由M函数定义的线性或者非线性微分方程的句柄函数名。

tspan形式为[t0,tf],表示求解区间。

y0是初始状态列向量。

t和y分别给出时间向量和相应的状态向量。

二阶龙格-库塔法(ode23):下面式2为Euler(欧拉法)增量,即一步起始端斜率,式3为一步终点端斜率。

所以式1仿真计算的增量实际上是取两点斜率的平均斜率来计算的,其精度高于Euler算法。

四阶龙格-库塔法(ode45):计算原理为预报-校正法,预报值采用Euler算出,下式又作了3次校正,因此计算精度远高于Euler算法。

e.g.二阶非线性系统的微分方程:x″ + 0.5*x′+ 2*x + x^2 = 0求系统在初始条件为x(0)=1,x′(0)=0的数值解。

建立M函数:function xdot=odetest(t,x)%龙格-库塔算法测试%二阶非线性系统微分方程xdotdot + 0.5*xdot + 2*x + x^2 = 0 %求系统在初始条件为x(0)=1,xdot(0)=0的数值解xdot=zeros(2,1);xdot(1)=x(2);xdot(2)=-0.5*x(2)-2*x(1)-x(1)^2;tspam=[0 20];x0=[0 1];[t,x]=ode23(@odetest,tspan,x0);plot(t,x)微分方程数值解曲线如下图:。

(完整版)第二节龙格-库塔方法

(完整版)第二节龙格-库塔方法
en1 en h[( xn , y( xn ), h) ( xn , yn , h)] Tn1
因为单步法是 p阶的:h0 , 0 h h0 满足| Tn1 | Chp1
| en1 || en | hL | en | Ch p1 | en |
其中 1 hL, Ch p1
en O(hp )
即取
K * 1K1 2 K2 yi1 yi h(1K1 2 K2 )
其中1 和 2 是待定常数。若取 K1 f ( xi , yi ) ,则
问题在于如何确定 xi p 处的斜率 K2 和常数 1 和 2 。
仿照改进的欧拉方法,用欧拉方法预测 y( xi p ) 的值,
yi p yi phK1
k2
f ( xn
h 2
,
yn
h 2 k1)
hh k3 f ( xn 2 , yn 2 k2 )
k4 f ( xn h, yn hk3 )
例2:用经典的龙格-库塔方法
求解下列初值问题 h 0.1
dy 。 dx
y
2x y
x (0,1)
解:经典的四阶龙格-库塔公式: y(0) 1
E(h) 1 h
绝对稳定域: 1 h 1
当 R 时, 1 h 1 2 h 0
绝对稳定区间:(2, 0)
❖经典的R-K公式:yn1
yn
h 6
(k1
2k2
2k3
k4 )
k1 f ( xn , yn ) yn
k2
f
(
yn1 yn hf ( xn , yn )
n1 yn1 yn1
n1 n h[ f ( xn , yn ) f ( xn , yn )] [1 hf y ( xn , )]n

二阶龙格库塔法例题

二阶龙格库塔法例题

二阶龙格库塔法例题二阶龙格-库塔法(RK2)是一种数值求解常微分方程(ODE)的方法,它基于欧拉法的改进。

下面我将以一个例题来说明二阶龙格-库塔法的应用。

假设我们要求解如下的一阶常微分方程:dy/dx = x + y.初始条件为 y(0) = 1。

我们希望使用二阶龙格-库塔法来计算在 x = 0.1 处的函数值。

首先,我们需要将方程转化为标准形式,即将一阶微分方程表示为 dy/dx = f(x, y) 的形式。

在这个例子中,f(x, y) = x + y。

接下来,我们将计算步长 h,这是我们在每个步骤中前进的距离。

在二阶龙格-库塔法中,我们需要选择一个合适的步长。

通常情况下,我们可以通过试验不同的步长来选择一个合适的值。

在这个例子中,我们选择 h = 0.1。

然后,我们可以开始应用二阶龙格-库塔法的迭代公式。

迭代公式如下:k1 = h f(x, y)。

k2 = h f(x + h/2, y + k1/2)。

y_new = y + k2。

现在,我们可以开始迭代计算。

根据初始条件,我们有 x = 0,y = 1。

我们将进行以下计算步骤:1. 计算 k1 = h f(x, y) = 0.1 (0 + 1) = 0.1。

2. 计算 k2 = h f(x + h/2, y + k1/2) = 0.1 (0.05 + 1 + 0.1/2) = 0.105。

3. 计算 y_new = y + k2 = 1 + 0.105 = 1.105。

这样,我们得到了在 x = 0.1 处的函数值 y_new = 1.105。

通过不断重复上述步骤,我们可以计算出在其他点的函数值。

只需将当前的 x 和 y_new 作为下一步的初始条件,重复上述计算步骤即可。

需要注意的是,二阶龙格-库塔法是一种数值近似方法,其结果并不完全精确。

因此,在实际应用中,我们需要根据问题的要求和精度需求选择合适的步长和迭代次数。

以上就是使用二阶龙格-库塔法求解一阶常微分方程的例子。

第3讲(龙格-库塔方法)

第3讲(龙格-库塔方法)
h f yi [ f ( x i , yi ) f ( xi , yi ) ( x i , yi ) h 2 x f ( xi , yi ) h f ( xi , yi ) O( h2 )] y
易见,它与二阶泰勒级数方法仅相差 O( h3 )!
这一分析给我们提供了一个重要信息,那就是 我们所遇到的泰勒级数方法中求导数的困难是可以 克服的,改进的欧拉方法就没有用到导数,而是借 助于函数在某些点处的值 (复合函数的思想)。
又 y( x ) df ( x , y( x )) f x f y y f x f y f dx
故二阶泰勒级数方法为 h2 yi 1 yi h f ( xi , yi ) ( f x ( xi , yi ) f ( xi , yi ) f y ( xi , yi )) 2! 更高阶方法更复杂,主要是求导复杂!
yi 1
h2 hk ( k ) yi h y y yi i i 2! k!
这样的数值方法称为k 阶泰勒级数方法。
yi 1
h2 hk ( k ) yi h y y yi i i 2! k!
泰勒级数方法也是单步法,且其局部截断误差为
h2 hk ( k ) LTE y( xi 1 ) y( xi ) hy( xi ) y( xi ) y ( x i ) 2! k!
第二节 龙格-库塔方法
(Runge-Kutta)
根据局部截断误差与整体误差的关系可知, 局部截断误差的阶是衡量一个方法优劣的重要依据。 考虑用提高局部截断误差的阶来提高数值方法的 精度。 泰勒级数法 龙格―库塔方法
一、泰勒级数方法
d y f ( x, y ), x I 如果初值问题 d x 的精确解 y(x) 在 I y( x ) y 0 0

二阶龙格库塔方法

二阶龙格库塔方法

2012-2013(1)专业课程实践论文二阶Runge-Kutta方法董文峰,0818180123,R数学08-1班由改进的Euler 方法得到:()),(),(21121211K y h x hf K y x hf K K K y y i i i i i i ++==++=⎪⎩⎪⎨⎧+凡满足条件式有一簇形如上式的计算格式,这些格式统称为二阶龙格—库塔格式。

因此改进的欧拉格式是众多的二阶龙格—库塔法中的一种特殊格式。

若取1,0,2121212====c c b a ,就是另一种形式的二阶龙格 - 库塔公式。

⎪⎪⎩⎪⎪⎨⎧++==+=+)2,2(),(12121K hy h x f K y x f K hK y y n n n n n n (1)此计算公式称为变形的二阶龙格—库塔法。

二级龙格-库塔方法是显式单步式,每前进一步需要计算两个函数值。

由上面的讨论可知,适当选择四个参数y0,a,b,n ,可使每步计算两次函数值的二阶龙格-库塔方法达到二阶精度。

下面以式子(1)为依据利用VC++6.0编译程序进行问题的求解。

#include<stdlib.h>#include<stdio.h>/*n表示几等分,n+1表示他输出的个数*/int RungeKutta(double y0,double a,double b,int n,double *x,double *y,double (*function)(double,double)){double h=(b-a)/n,k1,k2;int i;x[0]=a;y[0]=y0;for(i=0;i<n;i++){x[i+1]=x[i]+h;k1=function(x[i],y[i]);k2=function(x[i]+h/2,y[i]+h*k1/2);y[i+1]=y[i]+h*k2;}return 1;}double function(double x,double y){return y-2*x/y;}int main(){ int i;double x[6],y[6];printf("用二阶龙格-库塔方法\n");RungeKutta(1,0,1,5,x,y,function);for( i=0;i<6;i++)printf("x[%d]=%f,y[%d]=%f\n",i,x[i],i,y[i]);return 1;}例1. 取h=0.2,用二阶Runge-Kutta 公式求解⎩⎨⎧=<<+='1)0(10,y x y x y解:1.将程序中的return y-2*x/y 改成 return x+y2.输入y0,a,b,n 分别为 1,0,1,53.结果为例2. 取h=0.2,用二阶Runge-Kutta 公式求解⎩⎨⎧=<<+='1)0(10),1/(3y x x y y解:1. 将程序中的return y-2*x/y 改成 return 3*y/(1+x)2.输入y0,a,b,n 分别为1,0,1,53.结果为。

二阶龙格库塔公式推导_二阶龙格库塔公式.ppt

二阶龙格库塔公式推导_二阶龙格库塔公式.ppt

⼆阶龙格库塔公式推导_⼆阶龙格库塔公式.ppt⼆阶龙格库塔公式第⼀节 常微分⽅程 第⼆节 欧拉⽅法 第三节 龙格—库塔法 在上⼀节中,我们得到了⼀些求微分⽅程近似解的数值⽅法,这些⽅法的局部截断误差较⼤,精度较低,我们希望得到有更⾼阶精度的⽅法。

⼀阶龙格—库塔⽅法 如果以y(x)在xi处的斜率作为y(x)在 [xi,xi+1]上的平均斜率k*,即 ⼆阶龙格—库塔⽅法 在[xi,xi+1]上取两点xi,xi+p(0< p≤1)的斜率值k1,k2的线性组合λ1k1+λ2k2作为k*的近似值(λ1、λ2为待定常数),此公式⼀般形式可写成 这就是⼆阶龙格—库塔法公式。

三阶龙格—库塔公式 为了提⾼精度,考虑在[xi,xi+1]上取三点xi,xi+p,xi+q的斜率值分别为k1,k2,k3,将k1,k2,k3的线性组合作为平均斜率k*的近似值,其中 k* 这就是欧拉法. 则得 其中k1 = f (xi,yi),k2为[xi,xi+1]内任意⼀点xi+p = xi+ ph (0< p≤1) 的斜率f (xi+p,y(xi+p))。

由于y (xi+p)并没有给出,所以先应该求y(xi+p),仿照改进欧拉公式的构造思想,得到 (8-7) 这样构造出的公式为 k1 k2 k* 公式中含有三个参数λ1,λ2和p,如果我们适当选取参数的值,可以使公式的局部截断误差为O(h3)。

对k1和k2作泰勒展开 代⼊(8-7)得 (*) ⼜ y (x)在xi处的⼆阶泰勒展开式为 当x = xi+1时, ,有 (**) (**) ⽐较(*)与(**)的系数即可发现, 要使公式(7-7)的局部截断误差满⾜ ,即要求公式具有⼆阶 精度只要下列条件成⽴即可。

(8-8)满⾜条件(8-8)的⼀簇公式统称为 ⼆阶龙格—库塔公式。

特别的,当 塔公式就成为改进欧拉公式。

时,龙格-库 改进欧拉公式就是以y(x)在xi和xi+1 处的斜率k1和k2的算术平均 值作为y(x)在[xi,xi+1]上的 平均斜率k*来进⾏计算的。

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

#include<stdlib.h>
#include<stdio.h>
/*n表示几等分,n+1表示他输出的个数*/ int RungeKutta(double y0,double a,double b,int n,double *x,double *y,double
(*function)(double,double))
{
double h=(b-a)/n,k1,k2;
int i;
x[0]=a;
y[0]=y0;
for(i=0;i<n;i++)
{
x[i+1]=x[i]+h;
k1=function(x[i],y[i]);
k2=function(x[i]+h/2,y[i]+h*k1/2);
y[i+1]=y[i]+h*k2;
}
return 1;
}
double function(double x,double y)
{
return y-2*x/y;
}
int main()
{ int i;
double x[6],y[6];
printf("用二阶龙格-库塔方法\n"); RungeKutta(1,0,1,5,x,y,function);
for( i=0;i<6;i++)
printf("x[%d]=%f,y[%d]=%f\n",i,x[i],i,y[i]); return 1;
}
另一个
#include<stdio.h>
#include<math.h>
double fxy(double xi,double yi) /*定义函数fxy*/
{
double y;
y=yi-2*xi/yi;
return(y);
}
void main()
{
double
x0,y0,h,xi,yi,yi_1,xk2,yk2,xk3,yk3,xk4,yk4,k1 ,k2,k3,k4;
int i;
x0=0;
/*赋初始值*/
y0=1;
h=0.1;
xi=x0;
yi=y0;
for(i=1;i<=10;i++)
/*循环开始*/
{
k1=h*fxy(xi,yi);
/*求解k1值*/
xk2=xi+0.5*h;
/*求解k2的值*/
yk2=yi+0.5*k1;
k2=h*fxy(xk2,yk2);
xk3=xi+0.5*h;
/*求解k3的值*/
yk3=yi+0.5*k2;
k3=h*fxy(xk3,yk3);
xk4=xi+h;
/*求解k4的值*/
yk4=yi+k3;
k4=h*fxy(xk4,yk4);
yi_1=yi+(k1+2*k2+2*k3+k4)/6;
/*求解yi+1的值*/
yi=yi_1;
if(i==1)
{
printf("输出函数yi的近似值:\n"); /*输出所有的yi值*/
printf("y0 =%.10f",y0);
}
printf("y%d =%.10f",i,yi);
if((i+1)%1==0)
/*每行显示三个数值*/
printf("\n"); }
printf("\n"); }。

相关文档
最新文档