【问题标题】:Solving differential equation with ODEINT in python在python中用ODEINT求解微分方程
【发布时间】:2019-10-30 20:07:25
【问题描述】:

我有一个耦合微分方程组,我已经在 Excel 中使用 Euler 求解了该方程组。现在我想在 python 中使用 ODE 求解器使其更精确。 但是,我的代码中一定有一个错误,因为曲线看起来与 Excel 中的不同。我不希望曲线最终达到 1 和 0。

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

# define reactor
def reactor(x,z):
    n_a = x[0]
    n_b = x[1]
    n_c = x[2]

    dn_adz = A * (-1) * B * (n_a/(n_a + n_b + n_c)) / (1 + C * (n_c/(n_a + n_b + n_c)))
    dn_bdz = A * (1) * B * (n_a/(n_a + n_b + n_c)) / (1 + C * (n_c/(n_a + n_b + n_c)))
    dn_cdz = A * (1) * B * (n_a/(n_a + n_b + n_c)) / (1 + C * (n_c/(n_a + n_b + n_c)))
    dxdz = [dn_adz,dn_bdz,dn_cdz]
    return dxdz

# initial conditions
n_a0 = 0.5775
n_b0 = 0.0
n_c0 = 0.0
x0 = [n_a0, n_b0, n_c0]

# parameters
A = 0.12
B = 3.1e-9
C = 4.02e15

# number of steps
n = 100

# z step interval (m)
z = np.linspace(0,0.0274,n)

# solve ODEs
x = odeint(reactor,x0,z)


# Plot the results
plt.plot(z,x[:,0],'b-')
plt.plot(z,x[:,1],'r--')
plt.plot(z,x[:,2],'k:')
plt.show()

初始条件保持不变且不随步骤变化是否存在问题? 是不是应该像 Excel with Euler 一样,下一步使用珍贵步骤的条件/值?

【问题讨论】:

  • 您的dn_bdzdn_cdz 是相同的,这似乎不太可能是您想要的(尤其是n_b0==n_c0)。
  • dn_bdz 和 dn_cdz 是相同的。从 dn_adz 生成的两种化合物。但是,您是对的,n_b0 与 n_c0 有点不同。 nb_c0 = 1.5e-5,所以几乎是 0。
  • 你能解释一下你是如何确定这个结果比欧拉结果更错误的吗?此外,您可能希望使用 z = np.linspace(0,0.0274,n+1) 来获取 n 步骤的结果,因为两个端点都包含在计数中。

标签: python numpy ode


【解决方案1】:

从右侧的结构中,您可以得到状态变量n_a+n_b=n_a0+n_b0n_a+n_c=n_a0+n_c0 的常量组合。这意味着动态减少到n_a 的一维动态。

根据第一个方程,n_a 的导数对正的n_a 是负的,因此解正朝着n_a=0 下降。根据动力学常数,n_b 收敛到 n_a0+n_b0n_c 收敛到 n_a0+n_c0

尚不清楚如何在某些组件中收敛到 1,因为初始条件不支持这一点。除此之外,所描述的odeint 结果符合这种定性行为。

【讨论】:

  • 该模型背后有一个反应。反应是 A --> B + C。因此 A 被消耗以形成 B 和 C。n_a 必须始终为正,而导数为负,因为它已被消耗。我在 Excel 中有解决方案,对于这个例子,我预计 n_a 会下降到 0.288 左右,B 和 C 会增加到 0.288 左右。我在 Excel 中使用 Euler 和 Runge-Kutta 得到了相同的结果,这就是为什么我认为我的第一个 python 代码中有一个错误。向 1 收敛是一个错误。只是标准化,它会变为 1。但实际上 B 和 C 收敛到 0.5775。
  • 您是否也有一些用于 A 的入口和一些用于混合或提取 B 和 C 的出口?否则我不明白为什么不应该完全消耗 A。我真正要问的是,右侧分数背后的理论是什么?
  • 天哪,我发现了错误。右图分数背后的理论基于从实验结果和参数估计创建的模型。而且我没有使用我在 Excel 中估计的最新参数。现在它起作用了。这么愚蠢的错误。但是,非常感谢您的帮助和支持。没有你,我会放弃使用 Python。现在我将尝试更进一步,在 Python 中进行参数估计。我不知道从哪里开始,但我相信它最终会比 Excel 更好。再次感谢:)
猜你喜欢
  • 2015-12-13
  • 2018-02-08
  • 2015-03-05
  • 2012-02-28
  • 2017-11-18
  • 2017-10-06
  • 1970-01-01
  • 2021-05-27
  • 2019-04-09
相关资源
最近更新 更多