2013-06-24 2 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 [п] имеет смысл

Я предполагаю, что с некоторыми творчества и использования лямбда-это возможно, но я имею не смог понять это ... Надеюсь, это возможно.

Заранее благодарим за помощь :)

PS. Любая идея, как кодировать код цвета для удобства чтения?

ответ

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

спасибо за показывая мне функцию суммы Джареда :-) , к сожалению, хотя это не удается на линии: Popt, pcov = curve_fit (FUNC, XData, ydata) , потому что его неопределенные, сколько аргументы, которые curve_fit спросит для – HyperActive

+0

Вы можете предотвратить попытку определить количество параметров, которые имеет ваша функция, передав аргумент 'p0'. –