Python函数定义中的可变性

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]的奇怪定义有意义,我猜测通过一些创意和lambda表达式是可能的,但我一直没想出来……希望这是可能的。感谢您的帮助:)
另外,有什么方法可以为了易读性而对代码进行彩色编码吗?
1个回答

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

谢谢Jared向我展示sum函数 :-) 不过,不幸的是,在这一行中失败了: popt,pcov = curve_fit(func,xdata,ydata) 因为没有指定curve_fit将要请求多少个参数。 - HyperActive
您可以通过传递“p0”参数来防止sicpy尝试确定函数的参数数量。 - Caleb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接