繁体   English   中英

使用带有可变数量参数的 Scipy curve_fit 进行优化

[英]Using Scipy curve_fit with variable number of parameters to optimize

Assuming we have the below function to optimize for 4 parameters, we have to write the function as below, but if we want the same function with more number of parameters, we have to rewrite the function definition.

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

问题是这是否可以以更自动化的方式更容易完成,并且比这个问题所暗示的更直观。

示例如下,必须手写。

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

将 function 构造为循环内的字符串并使用“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

然后在定义的 function 上使用 Scipy curve_fit:

popt, pcov = curve_fit(radius, xdata=z, ydata=r)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM