我的数据看起来像第二种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)

10-06 05:18