我正在使用由scipy.integrate.solve_ivp解决的微分方程组。对于该系统的每个变化项,我组合了不同的中间变量。我正在寻找一种方法来存储这些中间变量,而不仅是结果变量。
我一直在考虑使用列表或其他可迭代方式将中间值直接存储在传递给Solve_ivp的函数中,但这似乎不是最好的方法,并且不允许我使用插值,当使用density_output时。 我也可以使用solve_ivp的结果重新计算这些中间变量,但是由于计算有些复杂,因此应该更容易地直接存储值并且仅计算一次。
我的func函数看起来像这样:
def dY(t, Y):
C1, C2 = Y
dC1 = A(C1, C2) + B(C1, C2)
dC2 = C(C1, C2) + B(C1, C2)
return [dC1, dC2]
我想在每个步骤中存储A,B,C和D的值,以及C1和C2的值(对于那些与之交谈的人来说,这是一个化学工程问题,而A,B,C和D是不同的汇和源术语)
感谢您的帮助!
答案 0 :(得分:0)
使用解决方案的值并在事实发生后调用函数。请勿使用存储在dY
函数中的中间值。严格的ODE集成商将在一个时间步中多次调用该函数,最终将导致毫无意义的数据被存储。非刚性ODE集成商可能也会在一次尝试中尝试多个时间步,这将遇到相同的问题。
以下是事实之后如何重建A和B的示例:
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt
tspan = (0, 10)
y0 = [1, 2]
def A(C1, C2):
return 2*C1 + 3*C2 - C1**2
def B(C1, C2):
return 1*C1 + 4*C2
def C(C1, C2):
return 1*C1 + 3*C2 - C2**2
def D(C1, C2):
return 2*C1 + 5*C2
def dY(t, Y):
C1, C2 = Y
dC1 = A(C1, C2) + B(C1, C2)
dC2 = C(C1, C2) + B(C1, C2)
return [dC1, dC2]
sol = solve_ivp(dY, tspan, y0)
fig,ax = plt.subplots()
ax.plot(sol.t, sol.y[0], label='C1')
ax.plot(sol.t, sol.y[1], label='C2')
ax.legend()
fig2,ax2 = plt.subplots()
ax2.plot(sol.t, A(sol.y[0], sol.y[1]), label='A')
ax2.plot(sol.t, B(sol.y[0], sol.y[1]), label='B')
ax2.legend()