2014-02-26 3 views
0

나는 errormessages를 생성하는 작은 조각의 코드를 가지고 있습니다. (저는 수학 공식 때문에 생각합니다). 왜 그럴까요?python 코드 scipy의 수학 수식 오류

import matplotlib.pyplot as plt 
import numpy as np 
from scipy.optimize import curve_fit 
from scipy.integrate import quad 
n = 3 
x = np.array([2.1,2.2,2.3,2.4]) 
y = np.array([0.9,2.1,3.2,17.9]) 
def func(x, a, b): 
    b1 = n*quad(x[n]*np.log(y[n]), 1, n) - quad(x[n], 1, n)*quad(np.log(y[n]), 1, n) 
    b2 = n*quad(x[n]**2, 1, n) - (quad(x[n], 1, n))**2 
    b = b1/b2 
    a = np.exp(1/n+(quad(np.log(y[n]), 1, n) - b(quad(x[n], 1, n)))) 
    return a*np.exp(b*x) 
popt, pcov = curve_fit(func, x, y) 
print popt 
plt.plot(x, y) 
plt.grid(True) 
plt.show() 

오류 로그 :

Traceback (most recent call last): 
    File "F:\py-IAT\Laktat.py", line 20, in <module> 
    popt, pcov = curve_fit(func, x, y) 
    File "C:\Python27\lib\site-packages\scipy\optimize\minpack.py", line 506, in curve_fit 
    res = leastsq(func, p0, args=args, full_output=1, **kw) 
    File "C:\Python27\lib\site-packages\scipy\optimize\minpack.py", line 348, in leastsq 
    m = _check_func('leastsq', 'func', func, x0, args, n)[0] 
    File "C:\Python27\lib\site-packages\scipy\optimize\minpack.py", line 14, in _check_func 
    res = atleast_1d(thefunc(*((x0[:numinputs],) + args))) 
    File "C:\Python27\lib\site-packages\scipy\optimize\minpack.py", line 418, in _general_function 
    return function(xdata, *params) - ydata 
    File "F:\py-IAT\Laktat.py", line 15, in func 
    b1 = n*quad(x[n]*np.log(y[n]), 1, n) - quad(x[n], 1, n)*quad(np.log(y[n]), 1, n) 
    File "C:\Python27\lib\site-packages\scipy\integrate\quadpack.py", line 247, in quad 
    retval = _quad(func,a,b,args,full_output,epsabs,epsrel,limit,points) 
    File "C:\Python27\lib\site-packages\scipy\integrate\quadpack.py", line 312, in _quad 
    return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit) 
quadpack.error: quad: first argument is not callable 

감사합니다!

+2

어떤 오류 메시지가 나타 납니까? – Kevin

+1

['quad'] (http://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.quad.html)에 대한 첫 번째 인수는 함수로 생각되지만 그것을 제공하고 있습니다. 숫자. 그래도 문제를 해결하는 방법을 권하는 scipy에 대해서는 충분히 알지 못합니다. 희망이 도움이됩니다. – Kevin

답변

1

케빈은 쿼드에 대한 첫 번째 인수는 함수로 가정하고 숫자를 넣는 것으로 지적했습니다. 함수를 만드는 것이 좋습니다.

def newfunc(x, y, n): 
    # Insert appropriate processing here 
    return x[n]*np.log(y[n]) 

이제 호출 시퀀스에 적절한 아약과 함께 quadf에 대한 첫 번째 인수로 newfunc를 넣습니다.

다른 쿼드 호출은 비슷한 수정이 필요합니다.

1

docs에 따르면 quad의 첫 번째 인수는 통합 할 함수 여야합니다. 함수가 아닌 표현이 있습니다. 이 안된

b1 = n*quad(lambda n:x[n]*np.log(y[n]), 1, n) - quad(lambda n:x[n], 1, n) * \ 
    quad(lambda n:np.log(y[n]), 1, n) 

,하지만 작동합니다 :이 문제를 해결하려면, 당신은 quad 전화에 익명 함수를 도입하는 시도 할 수 있습니다.