使用scipy.integrate.ode和cython

时间:2016-07-08 09:57:34

标签: python numpy cython

我目前正在尝试使用我已编写的Cython代码来实现更好的性能。但是,我在某个方面遇到了问题 我使用scipy.interpolate.ode:

  

TypeError:f()只需要3个位置参数(给定2个)

可以使用以下代码复制:

import scipy.integrate as inte
import scipy.interpolate
import numpy as np


class model(object):
   def __init__(self):
    self.r = np.arange(10) #a variable
    self.val = np.arange(10,20) #some values already calculated
    self.interpol = scipy.interpolate.interp1d(self.r,self.val) #interpolation

   #works with python but produces an error with cython
   def do_integration(self):

       abbrev = lambda i: self.interpol(i) #this is more complex in reality

       def f(x,y,i):
           return x+abbrev(i)

       ode = inte.ode(f,None)
       ode.set_integrator('dopri5')
       ode.set_f_params(5)
       ode.set_initial_value(0,1)

       for i in np.arange(0,1,0.1):
           ode.integrate(i)

如果f在do_integration之外定义,它也适用于cython。但是,在实际代码中,我定义了4-5个lambda函数,然后在f中使用(主要是从插值中得到一些导数,可能这是一个糟糕的风格?)。因此,在do_integration之外定义f意味着很多工作。

我认为我的问题类似于this one, 但是建议的解决方案并不适用于我:

只是定义

cpdef double f(double x,double y,double i):

给出

  

此处不允许使用C函数定义

由于我是Cython的新手,我不确定错误消息的原因是什么。有没有人可以帮助我?

非常感谢!

0 个答案:

没有答案