2014-02-28 54 views
1

我有看起來像第二類貝塞爾函數的數據(可以說這些數據應該由這些函數之一來描述)。用scipy擬合貝塞爾函數(第二類)的數據

我一直在努力這樣做,使用SciPy的優化工具箱下的文件的例子,但沒有成功至今:我收到以下錯誤消息

ValueError: array must not contain infs or NaNs 

我想說的是,在0散度問題的原因。順便說一下,我試圖擬合兩個參數,Bessel函數的索引和一個比例因子的變量a和b中的K a(bx)。嘗試適應離散空間(自然整數帶來價值)是一個問題嗎?

我的代碼看起來像這樣的時刻:

所有的
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 
+0

你的數據看起來像什麼? –

回答

2

首先,你傳遞給yn參數順序錯誤,應該是yn(a,b*var)而不是yn(b*var,a)。可能是這個錯誤導致功能yn吹到inf

作爲第二個點,因爲你懷疑,scipy會當你調用yn,養RuntimeWarning截斷你的a爲float。您最好僅針對縮放變量b進行優化,然後調查整數次序爲a的不同值。你可以通過手工或循環來完成。

我將以[1,2*pi]爲例,以sin(x)/2yn(1,x)爲契機討論一些收斂問題。

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)是指第二種修改的貝塞爾函數,而yn是第二種的貝塞爾函數,通常被稱爲Ia(x)

+0

謝謝你的詳細答案,真的很有用。我只是檢查了最後一點,是的,的確,我感興趣的功能實際上是kn(a,b * x)。 –

+0

好的非常感謝,我認爲我的工作知道了(除了找到正確的離散索引),我還有一個巨大的比例因子來添加(10^7)以使函數收斂,但現在看起來它適合數據;) –

+0

很酷,我很高興它解決了。無論如何,這些數據是什麼?你的問題是否有任何形式的徑向對稱? – gg349