<p>我编写了一个名为<a href="https://github.com/neurophysik/jitcode" rel="nofollow noreferrer">JiTCODE</a>的模块,它允许您以符号形式指定微分方程。这对您来说很方便,因为它主要负责将您的方程转换为函数。此外,在实际积分过程中,函数求值将非常有效,因为它是用C硬编码的。如果你有150个方程,这可能很重要</p>
<p>针对您的具体问题,我会这样做:</p>
<pre><code>from jitcode import jitcode,y
import numpy as np
from pandas import read_csv
# Dictionary describing the RHS of the ODE:
f = {}
def add_to_equation(dynvar,to_be_added):
try:
f[dynvar] += to_be_added
except KeyError:
f[dynvar] = to_be_added
# Dictionary mapping identifiers to JiTCODE’s dynamic variables
dynvars = {}
def get_dynvar(name):
try:
return dynvars[name]
except KeyError:
new_dynvar = y(len(dynvars))
dynvars[name] = new_dynvar
return new_dynvar
# Parsing the file
for source_name,target_name,rate in read_csv("flows.csv").values:
rate = float(rate)
source = get_dynvar(source_name)
target = get_dynvar(target_name)
add_to_equation(target, rate*source)
add_to_equation(source,-rate*source)
initial_condition = np.random.random(len(dynvars))
# Your test case:
Liver_1 = get_dynvar("Liver_1")
Blood_5 = get_dynvar("Blood_5")
assert f[Liver_1] == 0.462*Blood_5-0.0009242*Liver_1-0.045286*Liver_1
# Setup integrator
ODE = jitcode(f)
ODE.set_integrator("dopri5")
ODE.set_initial_value(initial_condition,0.0)
# Actual integration
times = np.linspace(0,100,50)
for time in times:
print(ODE.integrate(time))
</code></pre>
<p>一些注意事项:</p>
<ul>
<li><p>包括不同的非线性组件应该很简单</p></li>
<li><p>我在这里打印输出,但您可以用不同的方式存储和处理输出</p></li>
<li><p>您还可以使用<a href="https://jitcode.readthedocs.io/en/v1.5.0/#_jitcode.jitcode.y_dict" rel="nofollow noreferrer">^{<cd1>}</a>使用您的标识符作为字典访问解决方案(通过<code>dynvars</code>)。这样,您就不需要直接处理动态变量的编号</p></li>
<li><p>基本的简化如</p>
<pre><code>-0.000924*Liver_1 - 0.045286*Liver_1 = -0.04621*Liver_1
</code></pre>
<p>将由SymEngine(象征性主干)在引擎盖下动态完成</p></li>
<li><p>JiTCODE在引擎盖下使用<code>scipy.integrate.ode</code>或<code>solve_ivp</code></p></li>
</ul>