2017-12-11 5 views
1

저는 Python lmfit을 사용하여 2005-2016의 월평균 데이터와 최소 자승을합니다. 나는 기능을 아래와 같이 구성했다 : equation 원래 코드는 다음과 같습니다 :Python lmfit으로 커브 피팅을위한 매개 변수 추정

# t is in fractional years, e.g. 2017+122./365. 
def fun(t, a, b, c, A1, A2, A3, A4, B1, B2, B3, B4): 
    An=[A1,A2,A3,A4] 
    Bn=[B1,B2,B3,B4] 
    sum=np.sum([An[i] * np.sin(2 * np.pi * (i + 1) * t+Bn[i]) for i in range(len(An))]) 
    return a+b*t+c*t*t+sum 

mod = Model(fun) 
pars = mod.make_params(a=-10, b=0.003, c=0.01, A1=-1., A2=1., A3=1., A4=1., B1=-1., B2=1., B3=1., B4=1.) 

result = mod.fit(y, pars, t=t) 
print(result.fit_report()) 

plt.plot(t, y, 'bo') 
plt.plot(t, result.best_fit, 'r-') 
plt.show() 

fitted line and the original data dots 푸리에 용어가 작동하지 않은 것으로 보인다. 그러므로 나는 A1, A2, A3과 같은 함수 매개 변수에 대해 적절한 초기 추정을 제공하는 방법이 궁금합니다.

+3

메모와 함께 : 좋은 생각이 변수 이름으로 sum''사용합니다. – mikuszefski

+1

또한 최소한의 작업 예제, 즉 모든 '가져 오기'를 포함하여 최소한 완전한 작업 코드를 제공해야합니다. 최소한의 데이터 세트도 좋을 것입니다. – mikuszefski

+0

그 외에도 '평균'에서 'a'를 확인할 수 있습니다. 'B'는 아마도 0으로 설정하는 것이 가장 좋습니다. 'A1 * '은'0.5 * (max() - min())'과 같은 것입니다. 다른 'A'는 0입니다. (모든 데이터가 링크에 표시되는 것과 유사하다고 가정하면 'b'및 'c'도 0으로 표시됩니다. – mikuszefski

답변

2

np.sum 원하는 작업을 수행하지 않습니다. 표현식은 t과 같은 길이의 배열이 아닌 단일 스칼라 값으로 합산됩니다. 그런 다음 스칼라 값은 매개 변수 A1, ... B4을 단일 값으로 축소하므로이 값을 결정할 수 없습니다.

모양 (2, len(t))의 2D 배열을 만들고 나서 첫 번째 차원 만 합쳐서 푸리에 요소에 대한 합계가 len(t) 인 배열을 남기고 싶다고 생각합니다.

에 한번 교체하여

sum=np.sum([An[i]*np.sin(2*np.pi*(i+1)*t+Bn[i]) for i in range(len(An))]) 

sum=np.array([An[i]*np.sin(2*np.pi*(i+1)*t+Bn[i]) for i in range(len(An))]).sum(axis=0) 
+0

에서 확인하십시오. 도움이되는 답변에 감사드립니다. 실제로 나는 합계 기간의 모양을주의하지 않았다. 그리고 제안대로 작동했습니다. https://groups.google.com/forum/#!topic/lmfit-py/u413sR1XYV0 – Cheng

관련 문제