假设我们具有以下针对4个参数进行优化的函数,我们必须按如下方式编写该函数,但是如果希望具有更多参数的同一个函数,则必须重写该函数定义。
def radius (z,a0,a1,k0,k1,):
k = np.array([k0,k1,])
a = np.array([a0,a1,])
w = 1.0
phi = 0.0
rs = r0 + np.sum(a*np.sin(k*z +w*t +phi), axis=1)
return rs
问题是,是否可以通过比this question提示的自动化方式更轻松,更直观地完成此操作。
示例如下,必须手动编写。
def radius (z,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,k0,k1,k2,k3,k4,k5,k6,k7,k8,k9,):
k = np.array([k0,k1,k2,k3,k4,k5,k6,k7,k8,k9,])
a = np.array([a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,])
w = 1.0
phi = 0.0
rs = r0 + np.sum(a*np.sin(k*z +w*t +phi), axis=1)
return rs
[将函数构造为循环内的字符串,并使用'exec'将其作为python代码执行,然后在Scipy curve_fit中使用它可能会更容易:
N = 5
arg_k = ''
arg_a = ''
for i in range(N):
arg_a += 'a'+str(i)+','
arg_k += 'k'+str(i)+','
function_def = 'def radius (z,' + arg_a+arg_k+ '):'
a = 'a = np.array(['+arg_a+'])'
k = 'k = np.array(['+arg_k+'])'
indent = ' '
function_def += ('\n'+indent+ k
+'\n'+indent+ a
+'\n'+indent+'w = 1.0'
+'\n'+indent+'phi = 0.0'
+'\n'+indent+'rs = r0 + np.sum(a*np.sin(k*z +w*t +phi), axis=1)'
+'\n'+indent+'return rs')
exec(function_def)
打印字符串会得到以下结果:
print(function_def)
def radius (z,a0,a1,a2,a3,a4,k0,k1,k2,k3,k4,):
k = np.array([k0,k1,k2,k3,k4,])
a = np.array([a0,a1,a2,a3,a4,])
w = 1.0
phi = 0.0
rs = r0 + np.sum(a*np.sin(k*z +w*t +phi), axis=1)
return rs
然后在定义的函数上使用Scipy curve_fit:
popt, pcov = curve_fit(radius, xdata=z, ydata=r)