2013-06-24 106 views
3

我試圖寫它簡化了單一的功能/組合這些功能:蟒蛇的變異

def func0(x, a0): 
    return a0 

def func1(x, a0, a1): 
    return a0 + a1*x 

def func2(x, a0, a1, a2): 
    return a0 + a1*x + a2*x**2 

def func3(x, a0, a1, a2, a3): 
    return a0 + a1*x + a2*x**2 + a3*x**3 

到這樣的功能:

def func[n](x,a0,a1,...,an): 
    return a0*x**0 + a1*x**1 + a2*x**2 + ... + an*x**n 

這樣做的目的是爲了與scipy.optimize.curve_fit一起使用,它需要一個可調用的函數,其中參數的數量用作要優化的參數的數量。

例如:

from scipy.optimize import curve_fit 
from matplotlib.pyplot import * 
from numpy import * 

def func[n](x, *list(vars()['a'+str(i)]  for i in range(0, n+1))): 
    return  sum(vars()['a'+str(i)]*x**i for i in range(0, n+1)) 

xdata = array([1,2,3,4]) 
ydata = array([0.012,1.456,4.673,8.927]) 

popt,pcov = curve_fit(func[2],xdata,ydata) 

plot(xdata, ydata, 'o') 
plot(arange(0,5,.1), func[2](arange(0,5,.1),*popt)) 
show() 

如果FUNC [N]的非常奇怪的定義是有道理的

我猜測,一些創意和使用拉姆達的,這是可能的,但我已經一直無法弄清楚......我希望這是可能的。

在此先感謝您的幫助:)

PS。任何想法如何對代碼進行顏色編碼以便於閱讀?

回答

3
def func(x, *args): 
    return sum(arg*x**n for n, arg in enumerate(args)) 
+0

感謝我展示SUM函數賈裏德:-) 但不幸的是這未能在該行: POPT,pcov = curve_fit(FUNC,XDATA,YDATA) ,因爲它的不確定有多少論點curve_fit會問對於 – HyperActive

+0

您可以通過傳遞'p0'參數來防止sicpy嘗試確定函數的參數數量。 –