用python实现解常微分方程组的简单示例以及用odeint解常微分方程的范例

本文通过两种方法实现洛仑兹吸引子的轨迹模拟,一是手动编程迭代更新位置,二是利用Python的odeint函数求解常微分方程。最终通过三维绘图展示两组不同初始条件下的运动轨迹。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:

包括两个部分,一个是演示怎么自己写代码解常微分方程,另一部分就是示范python怎么调用解常微分方程的函数。
下面的方程组给出洛仑兹引子在三个方向上的速度,求解运动轨迹

软件:

python3.5.2

部分1:(div)

代码:

# -*- coding: utf8 -*-
import numpy as np
"""
移动方程:
t时刻的位置P(x,y,z)
steps:dt的大小
sets:相关参数
"""
def move(P,steps,sets):
    x,y,z = P
    sgima,rho,beta = sets
    #各方向的速度近似
    dx = sgima*(y-x)
    dy = x*(rho-z)-y
    dz = x*y - beta*z
    return [x+dx*steps,y+dy*steps,z+dz*steps]

#设置sets参数
sets = [10.,28.,3.]
t = np.arange(0,30,0.01)

#位置1:
P0 = [0.,1.,0.]

P = P0
d = []
for v in t:
    P = move(P,0.01,sets)
    d.append(P)
dnp = np.array(d)

#位置2:
P02 = [0.,1.01,0.]

P = P02
d = []
for v in t:
    P = move(P,0.01,sets)
    d.append(P)
dnp2 = np.array(d)
"""
画图
"""
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt

fig = plt.figure()
ax = Axes3D(fig)
ax.plot(dnp[:,0],dnp[:,1],dnp[:,2])
ax.plot(dnp2[:,0],dnp2[:,1],dnp2[:,2])
plt.show()

结果:



部分2:

代码:

# -*- coding: utf-8 -*-
import numpy as np
from scipy.integrate import odeint
"""
定义常微分方程,给出各方向导数,即速度
"""
def dmove(Point,t,sets):
    """
    p:位置矢量
    sets:其他参数
    """
    p,r,b = sets
    x,y,z = Point
    return np.array([p*(y-x),x*(r-z),x*y-b*z])

t = np.arange(0,30,0.01)
#调用odeint对dmove进行求解,用两个不同的初始值
P1 = odeint(dmove,(0.,1.,0.),t,args = ([10.,28.,3.],))  #(0.,1.,0.)是point的初值
#([10.,28.,3.],)以元祖的形式给出 point,t之后的参数
P2 = odeint(dmove,(0.,1.01,0.),t,args = ([10.,28.,3.],))

"""
画3维空间的曲线
"""
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt

fig = plt.figure()
ax = Axes3D(fig)
ax.plot(P1[:,0],P1[:,1],P1[:,2])
ax.plot(P2[:,0],P2[:,1],P2[:,2])
plt.show()

结果:



以下是使用Python的SciPy库求一阶微分方程示例代码: ``` import numpy as np from scipy.integrate import solve_ivp import matplotlib.pyplot as plt # 定义微分方程 def myODE(t, y): dydt = np.zeros((2,)) dydt[0] = y[1] dydt[1] = -np.sin(y[0]) return dydt # 设置初始条件 tspan = (0, 10) y0 = [1, 0] # 调用solve_ivp函数求微分方程 sol = solve_ivp(myODE, tspan, y0) # 绘制结果 plt.plot(sol.t, sol.y[0], '-o', label='y1') plt.plot(sol.t, sol.y[1], '-x', label='y2') plt.legend() plt.xlabel('t') plt.ylabel('y') plt.show() ``` 在上面的代码中,我们首先定义了一个名为myODE的函数来描述微分方程。该函数接受两个参数t和y,其中t表示当前时间,y是一个包含微分方程中每个变量的向量。函数返回一个包含每个变量的导数的向量dydt。在这个例子中,我们定义了一个简单微分方程,其中第一个变量y1的导数是y2,第二个变量y2的导数是-sin(y1)。 接下来,我们设置了初始条件tspan和y0。tspan是一个包含开始和结束时间的元,y0是一个包含每个变量初始值的列表。 然后,我们调用了SciPy的solve_ivp函数来求微分方程。该函数接受三个参数:微分方程函数的句柄,时间范围和初始条件。它返回一个名为sol的对象,该对象包含时间向量sol.t和包含每个变量的值的矩阵sol.y。 最后,我们使用matplotlib库的plot函数绘制了结果。我们绘制了y1和y2随时间的变化,并用legend函数添加了一个图例。最后使用show函数显示图形。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值