擅长:python、mysql、java
<p>我写了<a href="https://github.com/neurophysik/jitcode" rel="nofollow noreferrer">a module named JiTCODE</a>,它是为像你这样的问题量身定做的。
它接受符号表达式,将它们转换为C代码,在其周围包装一个Python扩展,对其进行编译,并加载它以与<code>scipy.integrate.ode</code>或{<cd2>}一起使用。在</p>
<p>您的示例如下所示:</p>
<pre><code>from jitcode import y, jitcode
from sympy.parsing.sympy_parser import parse_expr
from sympy import symbols
xs = symbols('x1 x2')
ks = symbols('k1 k2')
strs = ['-k1 * x1**2 + k2 * x2', 'k1 * x1**2 - k2 * x2']
syms = [parse_expr(item) for item in strs]
substitutions = {x_i:y(i) for i,x_i in enumerate(xs)}
f = [sym.subs(substitutions) for sym in syms]
ODE = jitcode(f,control_pars=ks)
</code></pre>
<p>然后您可以使用<code>ODE</code>,这与<code>scipy.integrate.ode</code>的实例非常相似。在</p>
<p>虽然您的应用程序不需要此函数,但您也可以提取并使用编译后的函数:</p>
^{pr2}$
<p>注意,与您的规范不同,<code>k</code>不是作为NumPy数组传递的。对于大多数ODE应用程序,这不应该是相关的,因为硬编码控制参数更有效。在</p>
<p>最后,请注意,对于这个小示例,由于<code>scipy.integrate.ode</code>或{<cd2>}的开销,您可能无法获得最佳性能(另请参见<a href="https://github.com/scipy/scipy/issues/8257" rel="nofollow noreferrer">SciPy Issue #8257</a>或{a3})。
对于大型微分方程(如您所见),这种开销变得无关紧要。在</p>