用python求解微分方程

diffeqp的Python项目详细描述


差异

在https://gitter.im/juliadiffeq/lobby加入聊天构建状态构建状态

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()

f1

我们可以利用插值得到更精确的解:

importnumpynumpy.linspace(0,1,100)u=sol(t)plt.plot(t,u)plt.show()

f2

求解命令

公共接口参数 可用于控制"求解"命令。例如,让我们使用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版本。这通过julia.main.eval完成

pip install diffeqpy
0

敖兹系统:洛伦兹方程

要解决odes系统,只需使用数组作为初始条件,然后 将f定义为数组函数:

pip install diffeqpy
1

F3

或者我们可以绘制相位图:

pip install diffeqpy
2

f4

就地变异形式

在处理方程组时,在许多情况下 使用变异函数的内存分配。不同的是,突变 表单将变异向量添加到前面。让我们制作一个快速版本的 洛伦兹导数,即变异和jit编译:

pip install diffeqpy
3

或者使用julia函数:

pip install diffeqpy
4

随机微分方程(SDE)示例

一维sdes

求解一维sdesdu=f(u,t)dt+g(u,t)dw就像一个ode,除了 对于扩散项(随机性或噪声)有一个额外的函数。台阶 按照sde教程

pip install diffeqpy
5

f5

具有对角噪声的sdes系统

具有对角噪声的sde是一个不同的wiener过程被应用于 系统的每个部分。这在有唯象噪声的模型中很常见。 让我们把乘性噪声加到洛伦兹方程中:

pip install diffeqpy
6

F6

非对角噪声sdes系统

在许多情况下,您可能希望在整个系统中共享噪声项。这是 称为非对角噪声。这个 微分方程组。jl sde教程 解释扩散项的矩阵形式如何对应于 多重维纳过程的求和方式。实际上,行对应 该项应用于哪个系统,列是哪个噪声项。 因此,du[i,j]是wiener过程产生的噪声量 应用于u[i]。我们对含有相关噪声的lorenz系统的求解如下:

pip install diffeqpy
7

f7

在这里你可以看到噪声相关的扭曲效应是非常明显的!

微分代数方程(DAE)示例

微分代数方程由隐函数定义 f(du,u,p,t)=0。所有控件都与其他示例相同,除了 这里定义一个函数,它返回 定义DAE的公式。初始值u0和初始导数 du0是必需的,尽管它们不一定要满足f(已知 作为不一致的初始条件)。方法将自动找到 始终如一的初始条件。为了实现这一点,微分变量 必须设置。这个向量表示哪些变量是差分的(有 导数项),带有意味着变量是纯代数的。

此示例演示如何求解robertson方程:

pip install diffeqpy
8

f8

以及就地jit编译的表单:

pip install diffeqpy
9

延迟微分方程

延迟微分方程是允许使用先前值的常微分方程。 在这种情况下,函数需要是jit编译的julia函数。它看起来 就像ode一样,除了这个例子之外,还有一个函数h(p,t)允许 您可以插值并获取以前的值。

我们必须提供一个历史函数h(p,t),它在t0之前给出u的值。 这里我们假设解在初始时间点之前是常数。 此外,我们通过常量滞后=[20.0]来告诉解算器 使用恒定的时间滞后,滞后长度是多少。这有助于改善 通过精确地在不连续点处步进,求解器的精度。 这是:

>>> importdiffeqpy>>> diffeqpy.install()
0

dde

请注意,解算器能够精确地模拟扭结(不连续) 由于导数在初始时间点的不连续性,att=20! 这就是为什么声明不连续可以提高解算器的精度。

已知限制

  • autodiff不适用于python函数。如果适用,定义导数函数 作为julia函数或将算法设置为使用有限差分,即rodas5(autodiff=false)。 所有默认方法都使用autodiff。
  • 延迟微分方程必须使用julia定义的函数,否则历史函数是 重载类型不正确。

测试

单元测试可以通过tox运行。

>>> importdiffeqpy>>> diffeqpy.install()
1

故障排除

如果遇到来自tox的静默失败,请尝试使用 --s(例如,tox-e py36--s)其中-s选项(--capture=no, 即,不要捕获stdio)被传递到py.test。它可能会显示 错误消息"初始化libgit2模块时出错"。在这种情况下, 设置环境变量ssl证书文件可能有帮助;例如,尝试:

>>> importdiffeqpy>>> diffeqpy.install()
2

另请参见:julia 18693

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Java例外。Lang.Stringindexoutofboundsexception索引超出范围(0)   java Spring引导Freemarker从2.2.0升级失败   重构Java反模式名称?包含对象的对象包含。。。等   用java处理JDBC可能出现的死锁的最佳方法   java无法访问主线程上的数据库,因为它可能会在很长一段时间内锁定UI   java如何将固定大小的画布包装在边框窗格中的滚动窗格居中?   java解析xsd文件后得到空结果   在html页面中表示XML文件的java   socketjava对象流   sql Java越界异常数据库   JavaJBoss7.1.1不会在Mavericks上启动   Twincat ADS事件驱动读取在一段时间后停止工作(Java)   java MyBatis使用生成的ID插入所有   Mojave上缺少MacOS Java控制面板   JavaGuice:如果多次注入相同的依赖项,是否注入了该依赖项的相同实例?