我是Scipy的数字新手。特别是,我想集成一个(复杂的)微分方程组。我注意到scipy.integrate.solve_ivp
可以胜任。由于我的方程式取决于某些数值参数,因此我编写了一个builder类以构建方程式以及初始条件
from scipy.integrate import solve_ivp
class eq_builder:
def __init__(self, parameters):
self._parameters = parameters
def build_eqs():
def numerical_function(t, y):
#here y is a list. This numerical function uses parameters and return a list
return numerical_function
def build_ics():
#generate and returns initial conditions (as a list)
然后我用
a = eq_builder(my_parameter)
solve_ivp(a.build_eqs(), [0, 10000], a.build_ics())
numerical_function
将多次调用solve_ivp
,有没有一种方法[numerical_function
的定义中,我应该尽可能限制一些更抽象(但令人印象深刻)的东西,例如列表或列表理解中的map
?由于数字函数将由solve_ivp多次调用,因此有一种方法可以编译它以使计算过程更快?
您必须竭尽所能。退后一步,您的假设似乎是“编译”代码总是比Python快。事实并非如此。的确,在Python中像循环之类的简单事情要比在C语言中慢,但这就是您不使用Python编写大型循环的原因。您宁愿使用numpy数组及其内在函数。例如,numpy.dot(a, b)
比用C语言编写的任何内容都要快[[多,因为numpy.dot
使用了一些精美的库(在这种情况下,BLAS)比以前做得更好。
在numerical_function的定义中,我应该限制一些抽象的(但令人印象深刻的东西),例如映射到列表或列表理解吗?
这是一个品味问题。您还有其他建议可以给我吗?考虑到上述系统中的方程数约为几百个。
[即使它运行缓慢,也要使其开始运行,然后尝试找出where您的代码运行缓慢,然后尝试在那里进行改进。