3

(cos(x))^n에 데이터를 맞추려고합니다. 이론적으로 n의 값은 2이지만, 내 데이터는 1.7을 제공해야합니다. 내 피팅 함수를 정의하고 내가 curve_fit을하려고 할 때, 나는이 내 데이터파이썬 오류로 커브 피팅

x y    error 
90 3.3888756187 1.8408898986 
60 2.7662844365 1.6632150903 
45 2.137309503  1.4619540017 
30 1.5256883339 1.2351875703 
0 1.4665463518 1.2110104672 

오류는 다음과 같습니다이다

def f(x,a,b,c): 
    return a+b*np.power(np.cos(x),c) 

param, extras = curve_fit(f, x, y) 

오류를 얻을 :

/usr/지방/libtime/python3.5/dist-packages/ipykernel_launcher.py : 4 : RuntimeWarning : sys.path에서 cwd를 제거한 후 전원에 유효하지 않은 값이 있습니다.

/usr/lib/python3/dist-packages/scipy/optimize/minpack.py:690 : OptimizeWarning는 : 파라미터의 공분산은
카테고리 = OptimizeWarning)

+0

은 아직 행방 불명 뭔가/작동하지 거기에 다음과 같이 음모가 보인다? 그렇다면 내 대답을 수정할 수 있음을 알려주세요. 문제가 해결되면 upvote 및 대답을 고려하십시오. – Cleb

+1

먼저 감사합니다. 정말 도움이되었습니다. 문제는 x 데이터가도 단위이며 라디안이어야한다는 것입니다. 그 외에도 배열의 모든 항목을 호출 할 수있는 * popt를 사용하는 방법을 배웠습니다. –

답변

4

문제를 예상 할 수없는 cos(x)이 음수가 될 수 있고 cos(x)^n은 정의되지 않을 수 있습니다. 일러스트 :

np.cos(90) 
-0.44807361612917013 

np.cos(90) ** 1.7 
nan 

이렇게하면 두 가지 오류 메시지가 나타납니다.

모델을 수정하면 정상적으로 작동합니다. 예 : a + b * np.cos(c * x + d).

enter image description here

코드는 일부 인라인 주석과 아래 찾을 수 있습니다 :

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.optimize import curve_fit 


def f(x, a, b, c, d): 

    return a + b * np.cos(c * x + d) 

# your data 
xdata = [90, 60, 45, 30, 0] 
ydata = [3.3888756187, 2.7662844365, 2.137309503, 1.5256883339, 1.4665463518] 

# plot data 
plt.plot(xdata, ydata, 'bo', label='data') 

# fit the data 
popt, pcov = curve_fit(f, xdata, ydata, p0=[3., .5, 0.1, 10.]) 

# plot the result 
xdata_new = np.linspace(0, 100, 200) 
plt.plot(xdata_new, f(xdata_new, *popt), 'r-', label='fit') 
plt.legend(loc='best') 
plt.show()