2014-02-26 31 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

Kevin指出,quad的第一個參數應該是一個函數,並且您正在輸入一個數字。我會建議創建一個函數

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

現在把newfunc作爲第一個參數與調用序列中適當的aguments四。

請注意,其他調用quad將需要類似的修改。

1

根據docsquad的第一個參數應該是一個整合的函數。你有一個表達而不是功能。爲了解決這個問題,你可以嘗試引入匿名函數來調用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) 

這是未經測試,但它應該工作。