2017-11-14 16 views
0

와 함수를 피팅 : enter image description here나는 다음과 같은 그래프의 일부에 기능을 맞추려고 오전 heavyside 단계 기능

내가 신호가 기하 급수적으로 증가 시작 시간을 찾고 싶어요. 이렇게하려면 데이터에 지수 곡선을 곱해서 heavyside 스텝 함수를 곱합니다.

enter image description here

나는를 기대 : 만 지수 부분은 내가 다음과 같은 그래프를 얻을 수에 맞게 때

def fit(x, a, b, c, d, e): 
    return np.heaviside(x-a, 0.5)*b*np.exp(c*x-d)+e 

parameter, covariance = curve_fit(fit, fitx, fity) 

x = np.linspace(min(fitx), max(fitx), 1000) 
plt.plot(fitx, fity) 
plt.plot(x, fit(x, *parameter), 'b-', label='fit') 
plt.show() 

결과는 어떻게 든 직선

enter image description here

입니다 x 축의 직선, 이미지 2의 지수 그래프 다음에 아무도 내가 잘못 갔는지 알 수 있습니까?

+0

'a'매개 변수의 적절한 시작점을 제공해야 할 수도 있습니다. –

+0

많은 도움을 주신 @IgnacioVergaraKausel, 감사합니다! – tomM

+0

피팅이있는 문제의 70 %가 불량한 시작점이고, 나머지는 주로 잘못 정의 된 맞춤 함수입니다. 나는 답을 주석으로 칠하겠다. –

답변

1

가장 일반적인 상황은 매개 변수의 수렴에 문제가 있다는 것입니다. 대부분의 경우이 수렴 문제는 매개 변수의 시작점이 잘못되어 발생합니다.

heavyside 기능이 없으면 예상대로 작동하기 때문에 curve_fit 함수 호출에서 a 매개 변수의 적절한 시작점을 지정해야합니다.

+1

비선형 해석기의 시작점을 찾는 데 도움이되도록 scipy는 scipy.optimize.differential_evolution 유전 알고리즘 모듈을 추가했습니다. Latin Hypercube 알고리즘을 사용하여 매개 변수 공간을 철저하게 검색하기 때문에 검색 할 수있는 매개 변수 값의 범위가 필요합니다. 그러나 이러한 범위는 상당히 관대 할 수 있습니다. 필자는이 scipy 모듈을 사용하여 이중 Lorentzian 피크 방정식을 탄소 나노 튜브의 라만 분광학 데이터에 맞추기위한 초기 매개 변수 추정치를 생성했습니다. https://bitbucket.org/zunzuncode/ramanspectroscopyfit –

+0

멋지다. –

0

"신호가 기하 급수적으로 증가하기 시작하는 시간"을 찾고 싶지만 플롯 된 신호는 기하 급수적으로 증가하지 않습니다. 실제로, 그것은 감소합니다 (적어도 시간이 갈수록 증가하고 왼쪽에서 오른쪽으로). 피크처럼 보입니다. 그 방울에 어떤 기능을 맞추기를 원한다는 뜻입니까?

가우스가 잘 작동한다고 생각합니다. 단계 함수를 사용하는 것은 OK 일 수도 있지만 아마도 t = 1e-8 정도가 넘을 것입니다.

데이터 또는 완전한 코드를 포함하지 않았으므로 구체적인 예를 제시하기가 어렵습니다. 하지만 lmfit 패키지가 도움이 될 것입니다. 선형 또는 오류 함수 또는 물류 곡선을 사용할 수있는 내장 Step Model이 있습니다. http://lmfit.github.io/lmfit-py/builtin_models.html#step-like-models을 참조하십시오. 이것은 당신이하려는 일에 가깝습니다.