2011-11-14 1 views
3

더 복잡한 문제로 이동하기 전에 간단한 사인파 (아무런 노이즈도 포함되지 않음)를 테스트로 사용하려고합니다. 불행히도 원격조차도 정확한 답변을 제공하지 않습니다. 여기 내 구문입니다 :curve_fit이 사인파에서도 작동하지 않습니다.

x = linspace(0,100,300) 
y = sin(1.759*x) 
def mysine(x, a): 
    return sin(a*x) 

popt, pcov = curve_fit(mysine, x, y) 
popt 
array([ 0.98679056]) 

그리고 나는 초기 추측 (예를 들어 1.5)하려고하면 :

popt, pcov = curve_fit(mysine, x, y, p0=1.5) 
popt 
array([ 1.49153365]) 

... 정답 어디에도 아직 없습니다.

필자는 함수가 얼마나 잘 샘플링 되었는가에 따라 적합성이 잘 작동하지 않는다는 것에 놀랐을 것입니다.

답변

5

커브 피팅이 항상 간단하지는 않습니다. curve_fit 알고리즘은 최소 제곱 커브 피팅을 기반으로하며 일반적으로 입력 매개 변수에 대한 초기 추측이 필요합니다. 당신이 적합하길 원하는 기능의 종류에 따라, 당신의 초기 추측은 좋은 것이어야합니다.

초기 추측을 시도했지만 샘플링 빈도 및 웨이브 주파수와 관련하여 추가 문제가 있다고 말할 수 있습니다. 자세한 내용은 위키 백과의 Nyquist-Shannon sampling theorem을 참조하십시오. 간단히 말해서 웨이브의 주파수는 1.759/(2 * pi) = 0.28입니다. 이는 x 배열 (~ 0.33)의 샘플링 주파수에 매우 가깝습니다. 발생할 수있는 또 다른 문제는 함수에 너무 많은 진동을 가하는 것입니다.

코드가 작동하려면 웨이브의 빈도를 높이거나 (> 4 * 0.33) 또는 샘플링 빈도를 높이고 공간 벡터의 길이를 줄이는 것이 좋습니다 x.

는 다음 코드를 실행하고 그림 here과 같은 결과를 얻을 : 당신은 당신이 적합을하려고하는 사인파의 주파수를 알고 있다면

# -*- coding: utf-8 -*- 
import numpy as np 
import pylab as pl 
from scipy.optimize import curve_fit 

def mysine(x, a): 
    return 1. * np.sin(a * x) 

a = 1.759 # Wave frequency 
x = np.linspace(0, 10, 100) # <== This is what I changed 
y = np.sin(a * x) + 0. * np.random.normal(size=len(x)) 

# Runs curve fitting with initial guess. 
popt, pcov = curve_fit(mysine, x, y, p0=[1.5]) 

# Calculates the fitted curve 
yf = mysine(x, *popt) 

# Plots results for comparison. 
pl.ion() 
pl.close('all') 
fig = pl.figure() 
ax = fig.add_subplot(111) 
ax.plot(x, y, '-', c=[0.5, 0.5, 0.5]) 
ax.plot(x, yf, 'k-', linewidth=2.0) 
ax.text(0.97, 0.97, ur'a=%.4f, ã=%.4f' % (a, popt[0]), ha='right', va='top', 
    fontsize=14, transform=ax.transAxes) 
fig.savefig('stow_curve_fit.png') 
+0

정말 고마워요 - 정말 고마워요! 건배, 댄. –

5

, 당신은 사인파에 맞게 선형 회귀를 사용할 수 있습니다. 모든 사인파는 사인 함수와 코사인 함수의 선형 조합으로 나타낼 수 있습니다. 선형 회귀를 사용하여 사인과 코사인의 계수를 찾을 수 있습니다. 이 접근법에 대한 좋은 점은 초기 추측이 필요하지 않으며 회귀 공식을 만족하는 단 하나의 답이 있다는 것입니다 (예 : '틀린'답을 얻지는 못함).

http://exnumerus.blogspot.com/2010/04/how-to-fit-sine-wave-example-in-python.html에는 예제 코드가 포함 된 간단한 자습서가 있습니다.

관련 문제