用python求解微分方程
diffeqp的Python项目详细描述
差异
diffiqpy是一个用python解决微分方程的软件包。它利用 微分方程.jl的核心例程 为了高性能地求解许多不同类型的微分方程, 包括:
- 离散方程(函数映射,离散随机(gillespie/markov) 模拟)
- 常微分方程
- 分裂和分区的odes(辛积分器,imex方法)
- 随机常微分方程(sodes或sdes)
- 随机微分方程(rodes或rdes)
- 微分代数方程(DAE)
- 延迟微分方程(DDE)
- 混合离散和连续方程(混合方程,跳跃扩散)
直接在python中。
如果您有任何问题,或者只是想谈谈解决方案/使用软件包, 请随意在大厅里聊天。utm_source=badge&utm_medium=badge&utm_campaign=pr badge&utm_content=badge" rel="nofollow">gitter频道。对于错误报告、功能请求等,请提交问题。
安装
要安装differqpy,请使用pip:
pip install diffeqpy
使用differqpy需要安装julia并沿着 用微分方程组jl和pycall.jl。要安装Julia, 从下载通用二进制文件 Julialang站点并将其添加到您的路径中。 要安装differqpy所需的julia包,请打开python 然后运行解释器:
>>> importdiffeqpy>>> diffeqpy.install()
你很好!另外,为了提高代码的性能 建议您使用numba来jit编译派生函数。到 安装numba,使用:
pip install numba
总流量
通过以下命令导入和设置解算器:
fromdiffeqpyimportde
使用包的一般流程是完全按照
在julia中,除了前面加上de.
。
大多数命令都可以在不做任何修改的情况下工作。因此
differentialsequations.jl文档
以及不同的参数
是此包的主要深入文档。下面我们将展示如何
将这些文档转换为python代码。
常微分方程(ODE)示例
一维odes
fromdiffeqpyimportdedeff(u,p,t):return-uu0=0.5tspan=(0.,1.)prob=de.ODEProblem(f,u0,tspan)sol=de.solve(prob)
解决方案对象与所描述的对象相同
在不同的教程中
在解决方案处理文档中
(注:阵列接口为MIS唱)例如,求解时间点
保存在sol.t
中,解决方案值保存在sol.u
中。另外,
插值sol(t)
给出一个连续的解。
我们可以使用matplotlib:
importmatplotlib.pyplotaspltplt.plot(sol.t,sol.u)plt.show()
我们可以利用插值得到更精确的解:
importnumpynumpy.linspace(0,1,100)u=sol(t)plt.plot(t,u)plt.show()
求解命令
公共接口参数
可用于控制"求解"命令。例如,让我们使用saveat
来
将解决方案保存到每个t=0.1
,然后使用vern9()
9阶
龙格-库塔法以及低公差abstol=reltol=1e-10
:
sol=de.solve(prob,de.Vern9(),saveat=0.1,abstol=1e-10,reltol=1e-10)
描述了odes的一组算法。 在"ODE解算器"页上
与numba和julia一起编译
在解微分方程时,你的导数
函数f
是快速的,因为它发生在解算器的内部循环中。我们可以
利用numba对我们的派生函数进行jit编译以提高效率
解算器的:
importnumbanumba_f=numba.jit(f)prob=de.ODEProblem(numba_f,u0,tspan)sol=de.solve(prob)
另外,可以直接在julia中定义函数。这将允许
更专业化,有助于提高
用于重复或长时间呼叫的numba版本。这通过 要解决odes系统,只需使用数组作为初始条件,然后
将 或者我们可以绘制相位图: 在处理方程组时,在许多情况下
使用变异函数的内存分配。不同的是,突变
表单将变异向量添加到前面。让我们制作一个快速版本的
洛伦兹导数,即变异和jit编译: 或者使用julia函数: 求解一维sdes 具有对角噪声的sde是一个不同的wiener过程被应用于
系统的每个部分。这在有唯象噪声的模型中很常见。
让我们把乘性噪声加到洛伦兹方程中: 在许多情况下,您可能希望在整个系统中共享噪声项。这是
称为非对角噪声。这个
微分方程组。jl sde教程
解释扩散项的矩阵形式如何对应于
多重维纳过程的求和方式。实际上,行对应
该项应用于哪个系统,列是哪个噪声项。
因此,du[i,j] 在这里你可以看到噪声相关的扭曲效应是非常明显的! 微分代数方程由隐函数定义
此示例演示如何求解robertson方程: 以及就地jit编译的表单: 延迟微分方程是允许使用先前值的常微分方程。
在这种情况下,函数需要是jit编译的julia函数。它看起来
就像ode一样,除了这个例子之外,还有一个函数 我们必须提供一个历史函数 请注意,解算器能够精确地模拟扭结(不连续)
由于导数在初始时间点的不连续性,at 单元测试可以通过 如果遇到来自 另请参见:julia 18693julia.main.eval完成
0
pip install diffeqpy
敖兹系统:洛伦兹方程
f
定义为数组函数:
1
pip install diffeqpy
2
pip install diffeqpy
就地变异形式
3
pip install diffeqpy
4
pip install diffeqpy
随机微分方程(SDE)示例
一维sdes
du=f(u,t)dt+g(u,t)dw
是wiener过程产生的噪声量
应用于
5
pip install diffeqpy
具有对角噪声的sdes系统
6
pip install diffeqpy
非对角噪声sdes系统
u[i]
。我们对含有相关噪声的lorenz系统的求解如下:
7
pip install diffeqpy
微分代数方程(DAE)示例
f(du,u,p,t)=0
。所有控件都与其他示例相同,除了
这里定义一个函数,它返回
定义DAE的公式。初始值u0
和初始导数
du0
是必需的,尽管它们不一定要满足f
(已知
作为不一致的初始条件)。方法将自动找到
始终如一的初始条件。为了实现这一点,微分变量
必须设置。这个向量表示哪些变量是差分的(有
导数项),带有假
意味着变量是纯代数的。
8
pip install diffeqpy
9
pip install diffeqpy
延迟微分方程
h(p,t)
允许
您可以插值并获取以前的值。h(p,t)
,它在t0
之前给出u
的值。
这里我们假设解在初始时间点之前是常数。
此外,我们通过常量滞后=[20.0]
来告诉解算器
使用恒定的时间滞后,滞后长度是多少。这有助于改善
通过精确地在不连续点处步进,求解器的精度。
这是:>>> importdiffeqpy>>> diffeqpy.install()
0
t=20
!
这就是为什么声明不连续可以提高解算器的精度。已知限制
rodas5(autodiff=false)
。
所有默认方法都使用autodiff。测试
tox
运行。
>>> importdiffeqpy>>> diffeqpy.install()
1
故障排除
tox
的静默失败,请尝试使用
--s
(例如,tox-e py36--s
)其中-s
选项(--capture=no
,
即,不要捕获stdio)被传递到py.test
。它可能会显示
错误消息"初始化libgit2模块时出错"
。在这种情况下,
设置环境变量ssl证书文件
可能有帮助;例如,尝试:>>> importdiffeqpy>>> diffeqpy.install()
2
推荐PyPI第三方库