python_常微分方程的求解

python_常微分方程的求解-scipy库odeint的使用

11月10日计算物理实验——求解中心力场记

调用

scipy.integrate.odeint(func, y0, t, args=(),· · · )

代码说明:

  • func:微分方程的描写函数。要求微分方程化为标准形式,即 d y d t = f ( y , t ) \frac{dy}{dt}=f(y,t) dtdy=f(y,t),接受数组形式;

  • y0:初值;

  • t:需要求解的时间点;

  • args=():函数func中其他参数

步骤

  • 列出方程;

  • 将方程化为一阶微分方程,比如:
    { y 1 = x y 2 = x ˙ y 3 = y y 4 = y ˙ \left\{ \begin{array}{c} y_1 = x\\ y_2 = \dot{x}\\ y_3 = y\\ y_4 = \dot{y} \end{array} \right. y1=xy2=x˙y3=yy4=y˙
    由上式得到:
    { y 1 ˙ y 2 ˙ y 3 ˙ y 4 ˙ \left\{ \begin{array}{c} \dot{y_1}\\ \dot{y_2}\\ \dot{y_3}\\ \dot{y_4} \end{array} \right. y1˙y2˙y3˙y4˙
    关于 y 1 , y 2 , y 3 , y 4 y_1,y_2,y_3,y_4 y1,y2,y3,y4的表达式,放入一个矩阵就是输入的func;

  • 设置初值与时间;

  • 代入求解。

例子:

在这里插入图片描述

解:

列出方程
F = − G M m r 2 F = -\frac{GMm}{r^2} F=r2GMm
如上假设,写成将方程写成:
{ y 1 ˙ = y 2 y 2 ˙ = − G M m ( y 1 2 + y 3 2 ) − 3 2 ⋅ y 1 y 3 ˙ = y 4 y 4 ˙ = − G M m ( y 1 2 + y 3 2 ) − 3 2 ⋅ y 3 \left\{ \begin{array}{l} \dot{y_1} = y_2\\ \dot{y_2} = -GMm(y_1^2+y_3^2)^{-\frac{3}{2}}\cdot y_1\\ \dot{y_3} = y_4\\ \dot{y_4} = -GMm(y_1^2+y_3^2)^{-\frac{3}{2}}\cdot y_3 \end{array} \right. y1˙=y2y2˙=GMm(y12+y32)23y1y3˙=y4y4˙=GMm(y12+y32)23y3

代码

from scipy.integrate import odeint
import numpy as np
import matplotlib.pyplot as plt

a = 1#G*M
m = 1

#get func
def orb(d_list, t):
    y1, y2, y3, y4 = d_list
    return np.array([y2, -a*m*(y1**2 + y3**2)**(-3/2)*y1, y4, -a*m*(y1**2 + y3**2)**(-3/2)*y3])

#change E and p
t1 = np.linspace(0, 10, 2000)
t1_1 = np.linspace(0, 100, 2000)
t2 = np.linspace(0, 10, 2000)
t3 = np.linspace(0, 2, 2000)
result1 = odeint(orb, [1, 0, 0, 1], t1)
result1_1 = odeint(orb, [1, -0.5, 0, 1], t1_1)
result2 = odeint(orb, [1, 0, 0, np.sqrt(2)], t2)
result3 = odeint(orb, [1, 0, 0, 1.8], t3)

#plot
fig = plt.figure()
axe = fig.add_subplot(221)
axe.plot(result1[:, 0], result1[:, 2])
axe.set_title('E<0')
axe = fig.add_subplot(222)
axe.plot(result1_1[:, 0], result1_1[:, 2])
axe.set_title('E<0,p2')
axe = fig.add_subplot(223)
axe.plot(result2[:, 0], result2[:, 2])
axe.set_title('E=0')
axe = fig.add_subplot(224)
axe.plot(result3[:, 0], result3[:, 2], 'b-', result3[:, 0], -result3[:, 2], 'b-')
axe.set_title('E>0')
plt.show()

运行结果:
在这里插入图片描述

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值