【发布时间】: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_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步骤的结果,因为两个端点都包含在计数中。