问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何使用python计算常微分方程?

发布网友 发布时间:2022-04-25 19:49

我来回答

1个回答

热心网友 时间:2022-04-18 02:56

常用形式
odeint(func, y0, t,args,Dfun)
一般这种形式就够用了。
下面是官方的例子,求解的是
D(D(y1))-t*y1=0
为了方便,采取D=d/dt。如果我们令初值
y1(0) = 1.0/3**(2.0/3.0)/gamma(2.0/3.0)
D(y1)(0) = -1.0/3**(1.0/3.0)/gamma(1.0/3.0)
这个微分方程的解y1=airy(t)。

令D(y1)=y0,就有这个常微分方程组。
D(y0)=t*y1
D(y1)=y0

Python求解该微分方程。
>>> from scipy.integrate import odeint
>>> from scipy.special import gamma, airy
>>> y1_0 = 1.0/3**(2.0/3.0)/gamma(2.0/3.0)
>>> y0_0 = -1.0/3**(1.0/3.0)/gamma(1.0/3.0)
>>> y0 = [y0_0, y1_0]
>>> def func(y, t):
... return [t*y[1],y[0]]
>>> def gradient(y,t):
... return [[0,t],[1,0]]
>>> x = arange(0,4.0, 0.01)
>>> t = x
>>> ychk = airy(x)[0]
>>> y = odeint(func, y0, t)
>>> y2 = odeint(func, y0, t, Dfun=gradient)
>>> print ychk[:36:6]
[ 0.355028 0.339511 0.324068 0.308763 0.293658 0.278806]
>>> print y[:36:6,1]
[ 0.355028 0.339511 0.324067 0.308763 0.293658 0.278806]
>>> print y2[:36:6,1]
[ 0.355028 0.339511 0.324067 0.308763 0.293658 0.278806]

得到的解与精确值相比,误差相当小。
=======================================================================================================

args是额外的参数。
用法请参看下面的例子。这是一个洛仑兹曲线的求解,并且用matplotlib绘出空间曲线图。(来自《python科学计算》)
from scipy.integrate import odeint
import numpy as np
def lorenz(w, t, p, r, b):
# 给出位置矢量w,和三个参数p, r, b 计算出
# dx/dt, dy/dt, dz/dt 的值
x, y, z = w
# 直接与lorenz 的计算公式对应
return np.array([p*(y-x), x*(r-z)-y, x*y-b*z])
t = np.arange(0, 30, 0.01) # 创建时间点
# 调用ode 对lorenz 进行求解, 用两个不同的初始值
track1 = odeint(lorenz, (0.0, 1.00, 0.0), t, args=(10.0, 28.0, 3.0))
track2 = odeint(lorenz, (0.0, 1.01, 0.0), t, args=(10.0, 28.0, 3.0))
# 绘图
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
fig = plt.figure()
ax = Axes3D(fig)
ax.plot(track1[:,0], track1[:,1], track1[:,2])
ax.plot(track2[:,0], track2[:,1], track2[:,2])
plt.show()
===========================================================================
scipy.integrate.odeint(func, y0, t, args=(), Dfun=None, col_deriv=0, full_output=0, ml=None, mu=None, rtol=None, atol=None, tcrit=None, h0=0.0, hmax=0.0, hmin=0.0, ixpr=0, mxstep=0, mxhnil=0, mxordn=12, mxords=5, printmessg=0)
计算常微分方程(组)
使用 FORTRAN库odepack中的lsoda解常微分方程。这个函数一般求解初值问题。

参数:

func : callable(y, t0, ...) 计算y在t0 处的导数。
y0 : 数组 y的初值条件(可以是矢量)
t : 数组 为求出y,这是一个时间点的序列。初值点应该是这个序列的第一个元素。
args : 元组 func的额外参数
Dfun : callable(y, t0, ...) 函数的梯度(Jacobian)。即雅可比多项式。
col_deriv : boolean. True,Dfun定义列向导数(更快),否则Dfun会定义横排导数
full_output : boolean 可选输出,如果为True 则返回一个字典,作为第二输出。
printmessg : boolean 是否打印convergence 消息。

返回: y : array, shape (len(y0), len(t))
数组,包含y值,每一个对应于时间序列中的t。初值y0 在第一排。
infodict : 字典,只有full_output == True 时,才会返回。
字典包含额为的输出信息。
键值:

‘hu’ vector of step sizes successfully used for each time step.
‘tcur’ vector with the value of t reached for each time step. (will always be at least as large as the input times).
‘tolsf’ vector of tolerance scale factors, greater than 1.0, computed when a request for too much accuracy was detected.
‘tsw’ value of t at the time of the last method switch (given for each time step)
‘nst’ cumulative number of time steps
‘nfe’ cumulative number of function evaluations for each time step
‘nje’ cumulative number of jacobian evaluations for each time step
‘nqu’ a vector of method orders for each successful step.
‘imxer’index of the component of largest magnitude in the weighted local error vector (e / ewt) on an error return, -1 otherwise.
‘lenrw’ the length of the double work array required.
‘leniw’ the length of integer work array required.
‘mused’a vector of method indicators for each successful time step: 1: adams (nonstiff), 2: bdf (stiff)
其他参数,官方网站和文档都没有明确说明。相关的资料,暂时也找不到。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
2023年辽宁高考399分能报哪些公办大学 额头有杂音是什么意思啊 ...反应也不是一般的迟钝,胆子还越来越小,叫我的声音稍大就会被吓... 2022天津理工大学各省录取分数线 ...一个是个胖子 一个是个小矮子 一个是个黄头发的男人 一个是个穿... 我是河南理科女今年考了545 报考天津理工大学一本希望大不?二本专业... ...一个是个胖子 一个是个小矮子 一个是个黄头发的男人 还有一个是个... 有个手机游戏 图标就是一个黄头发的人背着弓箭 游戏内容是两个人_百度... 我是男生从小就怕那些动物,比如青蛙,觉得一想青蛙的皮肤就全身鸡皮疙瘩... ...不是昆虫总动员,其中片段是,一群昆虫被青蛙吃进肚子里,它们在里面... 用python 里的 matplotlib,axes3d 要怎么实现下面这样的效果 微信里添加到表情图在手机那个文件夹里 请问安卓手机微信表情文件夹在哪里? 手机微信添加的表情在哪个文件夹里 列举office2010套装中的常用软件 什么是珍珠七十? 派克钢笔都有哪些系列,价位大约多少。可以的话最好简单介绍一下,谢谢 每100克金针菇所含营养素有哪些? 衡水老白干多少钱一瓶? 威士忌是什么? 直播有哪些常识? 50钢芯铝绞线1000米多少公斤? 直播间里发关注必回会禁用 将军岭酒多少钱一瓶 眼球仪是什么? KASON K-MAX150羽毛球拍的市场价? 大重九香烟价格?(如图硬盒装,8mg) 直播间必火的6句话有什么呢? 安徽有哪几种烟? 从武汉到郑州有多少个公里 python 3dplot 不是等值x和y轴 python用matpiotilb画三维曲面图 python怎么实现方程组的解随参数变化 求云模型评价云图的python代码,做出的图就像下面图一样的 python 3D plot: unsupported operand type(s) for Python导入包错误 ImportError: No module named externals 出现TypeError: only size-1 arrays can be converted to Python scalars 求助python绘制三维曲线 Python或Matlab画出sin[(x^2+y^2)^1/2]的图像 win8自动登录怎么设置? 在电脑上怎样从回收站里找回你误删的文件? 怎么还原在回收站里误删的文件? 微软office系列软件有哪几种?及其主要作用与功能?(至少5种) 可口可乐公司2018年流动比率速动比率下降的原因? 五粮液2017年到2019速动比率下降的原因 流动比率增加,速动比率减小,说明什么?举案例分析。流动性怎么变? 6s玫瑰金怎么清理垃圾 如果企业的速动流动比率为80%,则能够引起企业的速动比率降低的是( ) 选啥。。。 玫瑰金戒指可以碰水吗 一个企业流动比率上升,速动比率下降,分析企业存在的问题