2013-10-17 1 views
3

모두. boost :: python을 사용하여 * .pyd 파일로 내 보낸 함수의 최소값을 찾으려고합니다.부스트 :: 파이썬 기능을 가진 Scipy

def SaturationDensity(C): 
    return optimize.minimize(lambda z:SNM_BED(z, C), 1.0) 

def SNM_BED(n, C): 
    return eos.t_E(0.5*n, 0.5*n, C)/(Dim*n) - m_n 

여기서 eos는 모듈의 이름입니다. scipy.optimize.minimize 일상에서 내 C++ 함수에 직접 ndarray을 통과 Boost.Python.ArgumentError:Python argument types in eos.t_E(numpy.ndarray, numpy.ndarray, KVOR) did not match C++ signature: t_E(double, double, class set_const *)

그래서 scipy 시도와 라인

#optimize.py 
def wrap_function(function, args): 
    ncalls = [0] 
    def function_wrapper(x): 
     ncalls[0] += 1 
     return function(x, *args) # <---Here 
    return ncalls, function_wrapper 

에 실패합니다. (KVOR은 set_const 클래스에서 상속되며 문제가되지 않습니다.)

나는 return map(lambda z: function(z, *args), x)으로 바꾸려고했으나 목록 (ndarrays)이 여기에 x으로 전달되었을뿐만 아니라 스칼라로도 보이기 때문에 map은 오류를보고합니다.

또한 다음 코드 사용, x는 반복 가능 여부를 확인하려고 :

try: 
    it = iter(x) 
except TypeError: 
    return function(x, *args) 

return map(lambda z: function(z, *args),x)  

을하지만 optimize.py 다른 장소에 실패

File "C:\Python27\lib\site-packages\scipy\optimize\optimize.py", line 589, in approx_fprime grad = numpy.zeros((len(xk),), float) TypeError: object of type 'numpy.float64' has no len()

내가있어 이 같은 몇 가지 문제는 scipy의 기능을 기억하지 못하지만 map을 사용하여 해결할 수 있습니다. 그것은 모든 scipy 기능의 일반적인 문제입니까? 그리고이 경우 어떻게해야합니까?

답변

1

n = float(n)을 SNM_BED 루틴에 추가하십시오.

일반적으로 1 요소 ndarrays는 필요에 따라 자동으로 float으로 변환되지만 boost :: python은 너무 복잡해 보입니다.

관련 문제