用python中的ODEINT求解微分方程

用python中的ODEINT求解微分方程,python,numpy,ode,Python,Numpy,Ode,我有一个耦合的微分方程组,我已经用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_

我有一个耦合的微分方程组,我已经用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中的Euler一样,下一步使用珍贵步骤的条件/值?

从右侧的结构中,可以得到状态变量的常量组合,
n\u a+n\u b=n\u a0+n\u b0
n\u a+n\u c=n\u a0+n\u c0
。这意味着动态降低为一维动态
n\u a

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


目前还不清楚在某些组件中,您是如何向
1
收敛的,因为初始条件不支持这种收敛。除此之外,所描述的结果符合这种定性行为。

从右侧的结构中,可以得到状态变量的常数组合,
n_a+n_b=n_a0+n_b0
n_a+n_c=n_a0+n_c0
。这意味着动态降低为一维动态
n\u a

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


目前还不清楚在某些组件中,您是如何向
1
收敛的,因为初始条件不支持这种收敛。除此之外,描述的
odeint
结果符合这种定性行为。

您的
dn_bdz
dn_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
步骤的结果,因为两个端点都包含在计数中。您的
dn_bdz
dn_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
步骤的结果,因为两个端点都包含在计数中。该模型背后有一个反应。反应是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更好。再次感谢:)这种模式背后有一种反应。反应是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进行参数估计。我不知道该去哪里