利用龙格库塔法求解质点运动方程

利用龙格-库塔法求解质点运动常微分方程

一、待解问题

讨论常微分方程的初值问题,边值问题的数值解法,最常用的基本方法就是龙格-库塔法使一些物理方程的计算简便,所得结果的精确提高。

下面是利用龙格-库塔法求解一个质点运动的常微分方程 以初速v 0=8km /s 自地球表面(半径R =6000km )竖直向上发射一质量为 m 的火箭,如图所示。若不计空气阻力,火箭所受引力 F 大小与它到地心距离的平方成反比,求火箭所能到达的最大高度H 。

火箭为我们分析的对象,对其做受力分析,火箭在任意位置 x 处仅受地球引力F 作用。由题意知,F 的大小与 x2 成反比,设μ为比例系数,则有:

(1)

F =

μ

x 当火箭处于地面时,即x =R 时F = m g ,由式(1)可得μ=mgR 2,于

m gR 2

是火箭在任意位置 x 处所受地球引力 F 的大小为 F =2

x

由于火箭作直线运动,火箭的直线运动微分方程式为:

d 2x mgR 2m 2=-2dt x

分离变量积分

d 2x dv dv dx dv

==⋅=v 2

dt dx dx dt dt

dv mgR 2mv ⋅=-2

dx x

dv gR 2

=-2dx vx

二、物理机理

1. 龙格-库塔法的基本思想及一般形式

设初值问题y =y (x ) ∈[a , b ],由微分中值定理可知,必存在ξ∈[x n , x n +1],使

y (x n +1) =y (x n ) +h y '(ξ) =y (x n ) +hf (ξ, y (ξ))

设y n =y (x n ) ,并记K *=f (ξ, y (ξ)) ,则

y (x n +1) =y n +hK *

其中K *称为y (x ) 在[x n , x n +1]上的平均斜率,只要对平均斜率K *提供一种算法,上式就给出了一种数值解公式,例如,用K 1=f (x n , y n ) 代替K *,就得到欧拉公式,用K 2=f (x n +1, y n +1) 代替K *,就得到向后欧拉公式,如果用K 1, K 2的平均值来代替K *,则可得到二阶精度的梯形公式。可以设想,如果在[x n , x n +1]*库塔(Runge-Kutta )法的基本思想。 龙格-库塔公式的一般形式:

y n +1=y n +h ∑c i k i

i =1

r

K 1=f (x n , y n )

K i =f (x n +λi h , y n +h ∑μij K j )

j =1i -1

(1)

其中K i 是y =y (x ) 在x n +λi h (0≤λi ≤1) 点的斜率预测值;c i , λi , μij 均为常数,选取这些常数的原则是使(1)式有尽可能高的精度。 2. 二阶龙格-库塔法

r =2的龙格-库塔公式为:

y n +1=y n +h (c 1K 1+c 2K 2) K 1=f (x n , y n )

K 2=f (x n +λ2h , y n +h μ21K 1)

(2)

式中c 1, c 2, λ2, μ21均为待定常数,我们希望适当的选取这些系数使公式的精度尽可能高,先将K 2按照二元函数泰勒级数:

1∂∂

f (x n +λ2h , y n +h μ21K 1) =∑(λ2h +h μ21) k f (x n , y n ) +...

∂x ∂y k =0k !

n

展开得到:

K 2=f (x n , y n ) +λ2hf x (x n , y n ) +μ21hf y (x n , y n ) f (x n , y n ) 122

[λ2h f xx (x n , y n ) +2λ2μ21h 2f xy (x n , y n ) f (x n , y n ) 2! 22+μ21h f yy (x n , y n ) f 2(x n , y n )]+... +

为了叙述方便,把f (x n , y n ) 和偏导数里面的x n , y n 省略不写,将K 2代入(2)式的第一式,得:

y n +1=y n +h (c 1+c 2) f +h 2c 2(λ2f x +μ21f y f ) c 222

+h (λ2f xx +2λ2μ21f xy f +μ21f yy f 2)

2

3

再用泰勒公式将y (x n +1) 展开,先计算得到以下各式:

y '=f (x , y ) y ''=f x +f y f

y

'''=f xx +2f xy f +f yy f 2+f y (f x +f y f )

再代入泰勒公式中:

h 2h 3

y (x n +1) =y (x n ) +h y '(x n ) +y ''(x n ) +y '''(x n ) +...

2! 3!

h 2h 3

=y n +hf +(f x +f y f ) +(f xx +2f xy f +f yy f 2

26

+f x f y +f y f ) +...

得到局部阶段误差为:

R n +1=y (x n +1) -y n +1

11

=h (1-c 1-c 2) f +h 2-c 2λ2) f x +(-c 2μ21) f y f ]

22

11231 +h -c 2λ2) f xx +(-c 2λ2μ21) f xy f 623112+(-c 2μ21) f yy f 2+f y (f x +f y f )]+... 62

要使局部截断误差为O (h 3) ,f , f x , f y f 的系数需为零,于是

c 1+c 2=11 21

c 2μ21=

2c 2λ2=

该方程组有4个未知数3个方程,所以有无穷多个解,它的每组解代入(2)式得到的近似公式都为二阶龙格-库塔方法。例如,取

1

c 1=c 2=, λ2=μ21=1,得到近似公式为:

2

h

y n +1=y n +(K 1+K 2)

2

K 1=f (x n , y n ) K 2=f (x n +h , y n +hK 1)

此处参数还有许多种不同的值,这里不再举例说明。

3、四阶龙格-库塔法

四阶龙格-库塔法的表达形式如下:

y n +1=y n +h (c 1K 1+c 2K 2+c 3K 3+c 4K 4) K 1=f (x n , y n )

K 2=f (x n +a 1h , y n +b 1K 1) K 3=f (x n +a 2h , y n +b 2K 1+b 3K 2) K 4=f (x n +a 3h , y n +b 4K 1+b 5K 2+b 6K 3)

仿照二阶龙格-库塔法的解法,通过N=4阶的泰勒级数的系数匹配,使局部截断误差为O (h 5) ,

b 1=a 1b 2+b 3=a 2b 4+b 5+b 6=a 3w 1+w 2+w 3+w 4=112122

w 2a 12+w 3a 2+w 4a 3=

3133

w 2a 13+w 3a 2+w 4a 3=

4w 2a 1+w 3a 2+w 4a 3=w 3a 1b 3+w 4(a 1b 5+a 2b 6) =

16

1

w 3a 1a 2b 3+w 4a 3(a 1b 5+a 2b 6) =

812

w 3a 12b 3+w 4(a 12b 5+a 2b 6) =

12

1

w 4a 1b 3b 6=

24

得到11个方程和13个未知量,因此需要补充两个条件

a 1=

1

, b 2=0,求解得到。 2

111

, a 3=1, b 1=, b 3=, b 4=0, b 5=0, 222

1111

b 6=1, w 1=, w 2=, w 3=, w 4=

6336a 2=

最后得出经典的四阶龙格-库塔公式:

h

y n +1=y n +(K 1+2K 2+2K 3+K 4)

6

K 1=f (x n , y n )

h h

K 2=f (x n +, y n +K 1)

22h h

K 3=f (x n +, y n +K 2)

22

K 4=f (x n +h , y n +hK 3)

三、数值计算方案

微分方程用积分可以解得火箭达到的高度,但是如果用数值方法解微分方程,所得的结果要精确得多。所以对于模型中的微分方程,用四阶龙格-库塔法对其求解所得结果精度更高,该方法还可以应用更为复杂的微分方程,如布朗动力学运动方程,但是对于高阶的微分方程,需对其降阶再。

km 千米, 火箭到上述模型中v 0=8km /s , 地球半径取x 0=R =6000

达最大高度处的速度为0,设当v i =0时所对应的火箭距离地球球心的高度为x i ,那么H =x i -R 即为火箭能达到的最大高度。 对于以下微分方程及其初值

⎧dv -gR 2-36⨯107⎪==2⎨dx vx vx 2, R ≤x ≤R +H ⎪⎩v 0=8, x 0=R =6000

7-36⨯10可知 f ( x , v ) = ,利用上述所求的四阶龙格-库塔公式得到vx 2

该模型的龙格-库塔式子:

h

v n +1=v n +(K 1+2K 2+2K 3+K 4)

6

K 1=f (x n , v n )

h h

K 2=f (x n +, v n +K 1)

22h h

K 3=f (x n +, v n +K 2)

22

K 4=f (x n +h , v n +hK 3)

根据题目,有初值v 0=6,x 0=6000, 即可求解. 取h=0.4

-36⨯107

K 1=f (x 0, v 0) ==-1. 25 2

8⨯(6000)

K 2==f (6000. 2, 7. 75) =-1. 2902 K 3=f (6000. 2, 7. 74196) =-1. 2905

K 4=f (6000. 4, 7. 4838) =-1. 3360

v 1=8-

......

0. 4

(1. 25+2⨯1. 2902+2⨯1. 2905+1. 3360) =7. 48351 6

v n =0

代入四阶龙格-库塔公式计算,直至v n

=0。步长选取为h =0. 4,

相应的x i =x 0+h , v i =对应的值,直到v i =0时,取到相应的x i ,则最大高度H =x i -R .

四、流程图

利用龙格-库塔法求解质点运动常微分方程

一、待解问题

讨论常微分方程的初值问题,边值问题的数值解法,最常用的基本方法就是龙格-库塔法使一些物理方程的计算简便,所得结果的精确提高。

下面是利用龙格-库塔法求解一个质点运动的常微分方程 以初速v 0=8km /s 自地球表面(半径R =6000km )竖直向上发射一质量为 m 的火箭,如图所示。若不计空气阻力,火箭所受引力 F 大小与它到地心距离的平方成反比,求火箭所能到达的最大高度H 。

火箭为我们分析的对象,对其做受力分析,火箭在任意位置 x 处仅受地球引力F 作用。由题意知,F 的大小与 x2 成反比,设μ为比例系数,则有:

(1)

F =

μ

x 当火箭处于地面时,即x =R 时F = m g ,由式(1)可得μ=mgR 2,于

m gR 2

是火箭在任意位置 x 处所受地球引力 F 的大小为 F =2

x

由于火箭作直线运动,火箭的直线运动微分方程式为:

d 2x mgR 2m 2=-2dt x

分离变量积分

d 2x dv dv dx dv

==⋅=v 2

dt dx dx dt dt

dv mgR 2mv ⋅=-2

dx x

dv gR 2

=-2dx vx

二、物理机理

1. 龙格-库塔法的基本思想及一般形式

设初值问题y =y (x ) ∈[a , b ],由微分中值定理可知,必存在ξ∈[x n , x n +1],使

y (x n +1) =y (x n ) +h y '(ξ) =y (x n ) +hf (ξ, y (ξ))

设y n =y (x n ) ,并记K *=f (ξ, y (ξ)) ,则

y (x n +1) =y n +hK *

其中K *称为y (x ) 在[x n , x n +1]上的平均斜率,只要对平均斜率K *提供一种算法,上式就给出了一种数值解公式,例如,用K 1=f (x n , y n ) 代替K *,就得到欧拉公式,用K 2=f (x n +1, y n +1) 代替K *,就得到向后欧拉公式,如果用K 1, K 2的平均值来代替K *,则可得到二阶精度的梯形公式。可以设想,如果在[x n , x n +1]*库塔(Runge-Kutta )法的基本思想。 龙格-库塔公式的一般形式:

y n +1=y n +h ∑c i k i

i =1

r

K 1=f (x n , y n )

K i =f (x n +λi h , y n +h ∑μij K j )

j =1i -1

(1)

其中K i 是y =y (x ) 在x n +λi h (0≤λi ≤1) 点的斜率预测值;c i , λi , μij 均为常数,选取这些常数的原则是使(1)式有尽可能高的精度。 2. 二阶龙格-库塔法

r =2的龙格-库塔公式为:

y n +1=y n +h (c 1K 1+c 2K 2) K 1=f (x n , y n )

K 2=f (x n +λ2h , y n +h μ21K 1)

(2)

式中c 1, c 2, λ2, μ21均为待定常数,我们希望适当的选取这些系数使公式的精度尽可能高,先将K 2按照二元函数泰勒级数:

1∂∂

f (x n +λ2h , y n +h μ21K 1) =∑(λ2h +h μ21) k f (x n , y n ) +...

∂x ∂y k =0k !

n

展开得到:

K 2=f (x n , y n ) +λ2hf x (x n , y n ) +μ21hf y (x n , y n ) f (x n , y n ) 122

[λ2h f xx (x n , y n ) +2λ2μ21h 2f xy (x n , y n ) f (x n , y n ) 2! 22+μ21h f yy (x n , y n ) f 2(x n , y n )]+... +

为了叙述方便,把f (x n , y n ) 和偏导数里面的x n , y n 省略不写,将K 2代入(2)式的第一式,得:

y n +1=y n +h (c 1+c 2) f +h 2c 2(λ2f x +μ21f y f ) c 222

+h (λ2f xx +2λ2μ21f xy f +μ21f yy f 2)

2

3

再用泰勒公式将y (x n +1) 展开,先计算得到以下各式:

y '=f (x , y ) y ''=f x +f y f

y

'''=f xx +2f xy f +f yy f 2+f y (f x +f y f )

再代入泰勒公式中:

h 2h 3

y (x n +1) =y (x n ) +h y '(x n ) +y ''(x n ) +y '''(x n ) +...

2! 3!

h 2h 3

=y n +hf +(f x +f y f ) +(f xx +2f xy f +f yy f 2

26

+f x f y +f y f ) +...

得到局部阶段误差为:

R n +1=y (x n +1) -y n +1

11

=h (1-c 1-c 2) f +h 2-c 2λ2) f x +(-c 2μ21) f y f ]

22

11231 +h -c 2λ2) f xx +(-c 2λ2μ21) f xy f 623112+(-c 2μ21) f yy f 2+f y (f x +f y f )]+... 62

要使局部截断误差为O (h 3) ,f , f x , f y f 的系数需为零,于是

c 1+c 2=11 21

c 2μ21=

2c 2λ2=

该方程组有4个未知数3个方程,所以有无穷多个解,它的每组解代入(2)式得到的近似公式都为二阶龙格-库塔方法。例如,取

1

c 1=c 2=, λ2=μ21=1,得到近似公式为:

2

h

y n +1=y n +(K 1+K 2)

2

K 1=f (x n , y n ) K 2=f (x n +h , y n +hK 1)

此处参数还有许多种不同的值,这里不再举例说明。

3、四阶龙格-库塔法

四阶龙格-库塔法的表达形式如下:

y n +1=y n +h (c 1K 1+c 2K 2+c 3K 3+c 4K 4) K 1=f (x n , y n )

K 2=f (x n +a 1h , y n +b 1K 1) K 3=f (x n +a 2h , y n +b 2K 1+b 3K 2) K 4=f (x n +a 3h , y n +b 4K 1+b 5K 2+b 6K 3)

仿照二阶龙格-库塔法的解法,通过N=4阶的泰勒级数的系数匹配,使局部截断误差为O (h 5) ,

b 1=a 1b 2+b 3=a 2b 4+b 5+b 6=a 3w 1+w 2+w 3+w 4=112122

w 2a 12+w 3a 2+w 4a 3=

3133

w 2a 13+w 3a 2+w 4a 3=

4w 2a 1+w 3a 2+w 4a 3=w 3a 1b 3+w 4(a 1b 5+a 2b 6) =

16

1

w 3a 1a 2b 3+w 4a 3(a 1b 5+a 2b 6) =

812

w 3a 12b 3+w 4(a 12b 5+a 2b 6) =

12

1

w 4a 1b 3b 6=

24

得到11个方程和13个未知量,因此需要补充两个条件

a 1=

1

, b 2=0,求解得到。 2

111

, a 3=1, b 1=, b 3=, b 4=0, b 5=0, 222

1111

b 6=1, w 1=, w 2=, w 3=, w 4=

6336a 2=

最后得出经典的四阶龙格-库塔公式:

h

y n +1=y n +(K 1+2K 2+2K 3+K 4)

6

K 1=f (x n , y n )

h h

K 2=f (x n +, y n +K 1)

22h h

K 3=f (x n +, y n +K 2)

22

K 4=f (x n +h , y n +hK 3)

三、数值计算方案

微分方程用积分可以解得火箭达到的高度,但是如果用数值方法解微分方程,所得的结果要精确得多。所以对于模型中的微分方程,用四阶龙格-库塔法对其求解所得结果精度更高,该方法还可以应用更为复杂的微分方程,如布朗动力学运动方程,但是对于高阶的微分方程,需对其降阶再。

km 千米, 火箭到上述模型中v 0=8km /s , 地球半径取x 0=R =6000

达最大高度处的速度为0,设当v i =0时所对应的火箭距离地球球心的高度为x i ,那么H =x i -R 即为火箭能达到的最大高度。 对于以下微分方程及其初值

⎧dv -gR 2-36⨯107⎪==2⎨dx vx vx 2, R ≤x ≤R +H ⎪⎩v 0=8, x 0=R =6000

7-36⨯10可知 f ( x , v ) = ,利用上述所求的四阶龙格-库塔公式得到vx 2

该模型的龙格-库塔式子:

h

v n +1=v n +(K 1+2K 2+2K 3+K 4)

6

K 1=f (x n , v n )

h h

K 2=f (x n +, v n +K 1)

22h h

K 3=f (x n +, v n +K 2)

22

K 4=f (x n +h , v n +hK 3)

根据题目,有初值v 0=6,x 0=6000, 即可求解. 取h=0.4

-36⨯107

K 1=f (x 0, v 0) ==-1. 25 2

8⨯(6000)

K 2==f (6000. 2, 7. 75) =-1. 2902 K 3=f (6000. 2, 7. 74196) =-1. 2905

K 4=f (6000. 4, 7. 4838) =-1. 3360

v 1=8-

......

0. 4

(1. 25+2⨯1. 2902+2⨯1. 2905+1. 3360) =7. 48351 6

v n =0

代入四阶龙格-库塔公式计算,直至v n

=0。步长选取为h =0. 4,

相应的x i =x 0+h , v i =对应的值,直到v i =0时,取到相应的x i ,则最大高度H =x i -R .

四、流程图


相关内容

  • 学业论文-龙格库塔法求解微分方程组
  • 龙格-库塔求解微分方程组 数学111班:何荣航 指导老师:于鹏 (陕西科技大学理学院 陕西 西安 710021) 摘 要:在工程实践当中,经常会遇到求解微分方程组的问题,一般情形下,求微分方程组的精确解是困难的,为了解决此问题需要求微分方程组的数值解.龙格-库塔法就是求解微分方程组的一种有效方法.一 ...

  • 非线性方程求根
  • 第7章 非线性方程求根 本章主要内容: 1.区间二分法. 2切线法. 3.弦位法. 4.一般迭代法. 重点.难点 一.区间二分法 区间二分法是求方程f(x)=0根的近似值的常用方法. 基本思想:利用有根区间的判别方法确定方程根的区间[a,b] ,将有根区间平分为二:再利用有根区间的判别方法判断那一个 ...

  • 四阶龙格-库塔(R-K)方法求常微分方程
  • 中南大学 MATLAB 程序设计实践 材料科学与工程学院 2013年3月26日 一.编程实现"四阶龙格-库塔(R-K )方法求常微分方程",并举一 例应用之. [实例]采用龙格-库塔法求微分方程: ⎧y ' =-y +1 ⎨ ⎩y (x 0) =0 , x 0=0 1.算法说明: ...

  • 数值计算基础
  • 数值计算基础 实验指导书 2010年 目录 实验一 直接法解线性方程组的 ................................ 1 实验二 插值方法 ........................................... 10 实验三 数值积分 ............. ...

  • 机电一体化英语论文
  • 动态模拟直流机电系统创新的数字方法 Chen Chaoyinga,*,P. Di Barbab, A Savinib 电机工程系, 天津大学, 天津300072, 中华人民共和国电气工程系, 帕维亚大学,27100年, 意大利帕维亚摘要 在本文中, 提出了一个名为"r k t " ...

  • matlab求解非线性方程组及极值
  • matlab求解非线性方程组及极值 默认分类 2010-05-18 15:46:13 阅读1012 评论2 字号:大中小 订阅 一.概述: 求函数零点和极值点: Matlab中三种表示函数的方法: 1. 定义一个m函数文件, 2.使用函数句柄; 3.定义inline函数, 其中第一个要掌握简单函数编 ...

  • 浅谈数值分析在机械工程领域的应用
  • 浅谈数值分析在机械工程领域的应用 摘要: MATLAB是目前国际上最流行的科学与工程计算的软件工具, 它具有强大的数值分析.矩阵运算.信号处理.图形显示.模拟仿真和最优化设计等功能.本文浅谈MATLAB在机械设计优化问题的几点应用. 关键词: MATLAB 约束条件 机械设计优化 数值分析 引言:在 ...

  • 常微分方程MATLAB解法
  • 实验四 求微分方程的解 一.问题背景与实验目的 实际应用问题通过数学建模所归纳而得到的方程,绝大多数都是微分方程,真正能得到代数方程的机会很少.另一方面,能够求解的微分方程也是十分有限的,特别是高阶方程和偏微分方程(组).这就要求我们必须研究微分方程(组)的解法,既要研究微分方程(组)的解析解法(精 ...

  • 四阶龙格库塔法C语言(西安交大)
  • #include #include 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,x ...