我想拟合一系列高斯函数,以前我不知道这些函数需要多少。这是我目前的解决方案。
g_used=false c_used=false n_used=false
while .....
g) g_used=true; ...
c) c_used=true; ...
n) n_used=true; ...
....
# something like that
if "$g_used"; then
if ! "$c_used" || ! "$n_used"; then
echo "ERROR: -g option was used, but -c or -n option was not used"
fi
fi
# ex. move the execution of actions after the option parsing
if "$c_used"; then
prune_containers
fi
if "$n_used"; then
prune_networks
fi
我知道有关位置,std和最大值的信息。因此,即使在许多高斯函数的情况下,拟合也会收敛。但是,我需要曲线拟合才能将列表或元组传递给函数。启动时,它会自动将其置于许多单个参数中:
def gauss_recursive(x,max_value,pos,std):
if len(pos)==1:
return gauss(x,max_value,pos,std)
else:
return gauss_recursive(x,max_value[:-1],pos[:-1],std[:-1])+gauss(x,max_value[-1],pos[-1],std[-1])
def gauss(x,max_value,pos,std):
from numpy import exp
return max_value*exp(-(x-pos)*(x-pos)/std/std)
这将导致以下错误:
fit_para,err = curve_fit(gauss_recursive,x,y,p0=[[1,5,7],[11,15,14],[2.5,2.5,2.5]])
当我将p0作为元组而不是列表传递时,会发生相同的效果。
有没有办法绕过这个问题?如果是,怎么办?
这是解决方案:
TypeError: gauss_recursive() takes 4 positional arguments but 10 were given