2014-02-28 2 views
1

두 번째 종류의 Bessel 함수처럼 보이는 데이터가 있습니다 (그리고 아마도이 함수 중 하나에 의해 설명되어야합니다).scipy로 Bessel 함수에 데이터 피팅

ValueError: array must not contain infs or NaNs 

나는 0에서 차이가 있다고 말하고 싶지만 나는 다음과 같은 오류 메시지가 얻을 : 나는 문서의 예를 다음하지만 지금까지 성공하지 않고 scipy 최적화 도구 상자를 사용하여 그렇게하도록 노력했습니다

문제의 원인.

덧붙여서, 저는 베셀 함수의 인덱스와 가변 인자의 축척 계수, 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으로 날아 갔을 가능성이 있습니다. 당신이 의심 당신이 RuntimeWarning을 제기 yn를 호출 할 때

두 번째 지점으로, scipya float로 자릅니다. 스케일링 변수 b에 대해서만 최적화를 수행 한 다음 정수 순서 a에 대해 다른 값을 조사하는 것이 좋습니다. 당신은 손으로 또는 반복하여 그것을 할 수 있습니다.

예를 들어 sin(x)/2yn(1,x)으로 맞추어서 수렴하는 문제를 [1,2*pi]에 대해 살펴 보겠습니다. 지금 x=linspace(0,2*pi,100)[1:]에 도메인을 변경하는 경우

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

, curve_fit이 수렴되지 않습니다 발생합니다. 0에 가까운 도메인 부분에서는 최적화 알고리즘이 축 방향으로 yn을 집어 넣으려고 시도하기 때문입니다. 이것은 b의 큰 값으로 이어지고, 그 결과 점점 더 악화되는 이산 한계 (시도 plot(x,yn(a,10*x)))까지 함수의 강력한 진동 동작 (시도 plot(x,yn(a,10*x)))이 발생합니다.

도덕적 인 점은 데이터가 0 일 때 0보다 가깝다면 x은 0에서 약간 떨어져서 적절한 컨버전스를 시작해야한다는 것입니다. 사이드 참고로

은 일반적 Ka(x)yn는 2 종류의 베셀 함수 동안 더 자주 Ia(x)라고도 제 2 종 변형 베셀 함수를 의미한다.

+0

정말 유용한 답변에 감사드립니다. 방금 마지막 점을 확인했는데, 실제로 관심있는 함수는 실제로 kn (a, b * x)입니다. –

+0

좋아요, 고맙습니다. 제 생각에 제대로 된 이산 색인을 찾는 경우를 제외하고는 알았습니다. 함수를 수렴하기 위해 (10^7)을 추가하는 큰 스케일링 요소가 있었지만 지금은 맞는 것처럼 보입니다. 데이터;) –

+0

멋지다, 나는 그것이 잘되어서 다행이다. 어쨌든 데이터는 무엇입니까?당신의 문제는 어떤 종류의 방사상 대칭을 가지고 있습니까? – gg349