我的数据看起来像第二种Bessel函数(可以说应该用这些函数之一来描述)。
我一直在尝试使用文档示例之后的scipy优化工具箱,但到目前为止仍未成功:我收到以下错误消息
ValueError: array must not contain infs or NaNs
我想说0的差异是问题的原因。
顺便说一句,我试图拟合两个参数,贝塞尔函数的索引和varialbe中的比例因子,Ka(bx)中的a和b。尝试适合离散空间(a取自然整数中的值)是否存在问题?
目前,我的代码如下所示:
from scipy.special import yn #importing the Bessel functions
from scipy.optimize import curve_fit
def func(var, a, b):
return yn(b*var,a)
popt, pcov = curve_fit(func, x, y) # x and y are my data points
最佳答案
首先,您以错误的顺序将参数传递给yn
,它应该是yn(a,b*var)
而不是yn(b*var,a)
。可能是此错误导致函数yn
炸裂为inf
。
第二点,正如您所怀疑的那样,当您调用scipy
时,a
会将您的yn
截断为浮点数,从而引发了RuntimeWarning
。最好只对缩放变量b
进行优化,然后研究整数阶数a
的不同值。您可以手动执行,也可以循环执行。
我将从一个示例开始讨论一些收敛问题,在sin(x)/2
上将yn(1,x)
与[1,2*pi]
拟合。
from scipy.special import yn
from scipy.optimize import curve_fit
from numpy import sin,linspace,pi
a=1#choose the order a here!
func = lambda var,b : yn(a,b*var)
x=linspace(1,2*pi,100)
y=sin(x)/2.#we fit this as an example
[b], pcov = curve_fit(func, x, y) # x and y are my data points
print b
如果现在将域更改为
x=linspace(0,2*pi,100)[1:]
,则curve_fit
不会收敛。这是因为在接近零的域部分中,优化算法将尝试向轴挤压yn
。这导致b
的值很大,进而导致该函数(尝试plot(x,yn(a,10*x))
)强烈振荡,直到离散化限制(尝试plot(x,yn(a,10*x))
)为止,在这种情况下,情况甚至变得更糟。道理是,如果您的数据在
x
低的情况下接近零,则应该开始拟合远离零的点,以实现良好的收敛。附带说明一下,通常
Ka(x)
指的是第二种MODIFIED Bessel函数,而yn
是第二种的Bessel函数,通常称为Ia(x)
。