【发布时间】:2014-06-11 12:24:13
【问题描述】:
我想将一个类的成员函数用于 gsl_function 的全局函数,但我不知道该怎么做。由于我现在只是非常了解 C,我知道我必须将作为被积函数的类实例发送到 void 参数,但从技术上讲,我无法在 cython 中对其进行编码,这是一个 cython 示例。
from cython_gsl cimport *
ctypedef double * double_ptr
ctypedef void * void_ptr
cdef double foo(double x, void * params) nogil:
cdef double alpha, f
alpha = (<double_ptr> params)[0]
f = log(alpha*x) / sqrt(x)
return f
def main():
cdef gsl_integration_workspace * w
cdef double result, error, expected, alpha
w = gsl_integration_workspace_alloc (1000)
expected = -4.0
alpha = 1
cdef gsl_function F
F.function = &foo
F.params = &alpha
gsl_integration_qags (&F, 0, 1, 0, 1e-7, 1000, w, &result, &error)
print "result = % .18f\n" % result
print "estimated error = % .18f\n" % error
假设我有以下课程:
from math import *
cdef class Foo(object):
def __init__(self, double a=1.2, double b=0.6):
self.a = a
self.b = b
def _integrand(self,double x):
cdef double self.a = (<double_ptr> params)[0]
cdef double self.b = (<double_ptr> params)[1]
return self.a*log(x)+self.b/x**3
def whole(self, double upper_limit=10,double lower_limit=0):
cdef gsl_integration_workspace * w
cdef double result, error, expected, alpha
w = gsl_integration_workspace_alloc (1000)
expected = -4.0
params[0] = self.a
params[1] = self.b
cdef gsl_function F
F.function = &self._integrand
F.params = params
gsl_integration_qags (&F, lower_limit,upper_limit , 0, 1e-7, 1000, w, &result, &error)
return result,error
如何将Foo._integrand 转换为gsl 可以使用的全局函数?
【问题讨论】:
-
一个问题:最后一行不应该说
return self.a*log(x)+self.b/x**3吗? -
你想要全局化的特定方法在它所绑定的类实例的上下文之外没有任何意义。它依赖于
a和b,它们都是实例类属性。你为什么要按照你的要求去做? -
@aruisdante 因为这只是我更大问题的一个例子。我想在一个类中使用这个积分,我不知道应该怎么做。
标签: python function class methods cython