2013-12-14 5 views
0

저는 아직 Python에 익숙하지 않고 커브 피팅에 문제가 있습니다. 다음 프로그램은 내가 만드는 더 큰 프로그램을 단순화 한 것인데, 내가 가진 문제를 나타냅니다.scipy.optimize.curve_fit : 커브 피팅을 수행 할 수 없습니다.

문제는 내가 커브에 맞지 않는 햄버거라는 기능이 있다는 것입니다. 이 줄은 y = np.sqrt (y) : 문제입니다. 제거 할 때 완벽하게 맞출 수 있지만 원하는 기능이 아닙니다.

어떻게이 함수 y = np.sqrt (y)의 피팅을 수행 할 수 있습니까?

# -*- coding: utf-8 -*- 
""" 
Created on Wed Dec 11 22:14:54 2013 

@author: 
""" 
import numpy as np 
import matplotlib.pyplot as plt 
import pdb 
import scipy.optimize as optimization 
from math import * 
from scipy.optimize import curve_fit 

import math 
import moyenne 

####################Function Burger############################### 

def burger(t, E1, E2, N,tau): 
    nu=0.4 #Coefficient de Poisson 
    P=50 #Peak force 
    alpha=70.3 #Tip angle 
    y=((((pi/2.)*P*(1.-nu**2.))/(tan(alpha)))*(1./E1 + 1./E2*(1.-np.exp(-t/tau)) + 1./((N)*(1.-nu))*t)) 
    y=np.sqrt(y) 
    return y 

#######exemple d'utilisation########## 
xlist=np.linspace(0,1,100) 
ylist=[ burger(t,3, 2,1,0.1) for t in xlist] 

#pdb.set_trace() 
pa,j = curve_fit(burger,xlist,ylist) 

yfit=[burger(x,*pa) for x in xlist] 

plt.figure() 
plt.plot(xlist,ylist,marker='o') 
plt.plot(xlist,yfit) 
plt.show() 

답변

1

그래서, 이것은 아마도 당신이 얻는 가장 좋은 해답이 될 수 없지만 여기에 다른 사람을 위해 기다리는 동안 생각하는 몇 가지 있습니다.

우선, 파이썬에 익숙하지 않으므로 어쩌면 모르는 일일 수도 있고 어쩌면 목록 내재에서이 문제를 해결할 이유가있을 수도 있지만 목록 내포가 필요하다고 생각하지는 않습니다. numpy 수학 연산을 사용하여 한 번에 전체 배열을 처리 할 수 ​​있습니다.

y=((((pi/2.)*P*(1.-nu**2.))/(tan(alpha)))* ... 

대신

[ burger(t, 3., 2., 1., 0.1) for t in xlist] 

의 다음

y = ((((np.pi/2.)*P*(1.-nu**2.))/(np.tan(alpha)))* ... 

을 작성할 수 있습니다 대신에 당신이 작업 할 때 당신은이 훨씬 빨리 될 것입니다

burger(xlist, 3., 2., 1., 0.1) 

할 수 배열로.

둘째, 알고리즘에서 일어나는 몇 가지 문제를 살펴 봅니다. 올바른 범위에서 매개 변수를 찾지 못했습니다. 나는 scipy.optimize 페이지 (here)에서 사용하는 알고리즘을 찾아 보았고 wikipedia는 수렴이 초기 추측에 달려 있으며 전역 (global)이 아닌 로컬 (local)을 찾는다 고 말한다. 어떤 경우에는 sqrt가 정의되지 않은 매개 변수). 좋은 초기 추측을 할 수있는 방법이 있다면 작동해야합니다 ([1., 3., 3., 2]는 나를 위해 일했습니다). 그것을 해결 한 나의 명령은이었다 : pa,j = curve_fit(burger,xlist,ylist, [1., 3., 3., 2], maxfev=10000)).

셋째, 내가 코드를 사용했을 때의 첫 번째 오류는 최대 발열 수에 도달했다는 것입니다. curve_fit에 대한 마지막 인수로 maxfev=10000 (또는 필요한 경우 더 많이)을 추가하십시오.

확인해보십시오. 더 큰 문제에 초기 추측을 할 수 있다면 수렴 할 수 있습니다. 그렇지 않으면 아마도 다른 알고리즘이 더 적합할까요?

업데이트 :이 기능이 작동하는 이유에 대한 자세한 설명은 question을 참조하십시오. 그러나 다른 kwg를 부여하면 추측하지 않고도 작동 할 수 있습니다 (diag).

사용 :

pa,j = curve_fit(burger,xlist,ylist, diag=(1./xlist.mean(), 1./ylist.mean()), maxfev=10000) 
관련 문제