gpt4 book ai didi

python - 使用 scipy 在贝塞尔函数(第二类)上拟合数据

转载 作者:行者123 更新时间:2023-12-01 05:22:12 25 4
gpt4 key购买 nike

我有看起来像第二类贝塞尔函数的数据(并且可以说应该由这些函数之一来描述)。

我一直在尝试按照文档示例使用 scipy 优化工具箱来执行此操作,但到目前为止没有成功:我收到以下错误消息

ValueError: array must not contain infs or NaNs

我想说 0 的分歧是问题的原因。

顺便说一句,我正在尝试拟合两个参数,即贝塞尔函数的索引和变量中的比例因子,即 K a(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 时为 float ,筹集RuntimeWarning 。您最好仅针对缩放变量 b 进行优化,然后研究整数阶 a 的不同值。您可以手动或循环执行此操作。

我将从一个示例开始讨论一些收敛问题,拟合 sin(x)/2yn(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

enter image description here

如果您现在将域名更改为 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是第二类贝塞尔函数,通常称为 Ia(x) .

关于python - 使用 scipy 在贝塞尔函数(第二类)上拟合数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22097185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com