3

私は(cos(x))^nに自分のデータを収めようとしています。理論的にはnの値は2ですが、私のデータは1.7程度です。私は私のフィッティング関数を定義し、私はcurve_fitをしようとすると、私はこれが私のデータPythonエラーでカーブフィッティング

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/local/runtimeWarning:sys.pathからcwdを取り除いた後、無効な値が検出されました。 sys.pathからファイルを削除しました。

/usr/lib/python3/dist-packages/scipy/optimize/minpack.py:690: OptimizeWarning:パラメータの共分散が
カテゴリ= OptimizeWarningを推定することができませんでした)

+0

はまだ欠けている何か/動作していないありますか?もしそうなら、私は自分の答えを修正できることを教えてください。そうでない場合は、問題を解決した場合にアップホートと回答を受け入れてください:) – Cleb

+1

まずは本当にありがとうございます。問題は、xデータが度であり、ラジアンでなければならないということでした。それ以外では、配列のすべての項目を呼び出すために* poptを使うことを学んだので、それは素晴らしかったです! –

答えて

4

問題cos(x)が負になる可能性があり、cos(x)^nは未定義である可能性があります。図:

np.cos(90) 
-0.44807361612917013 

np.cos(90) ** 1.7 
nan 

これにより、2つのエラーメッセージが表示されます。

モデルを変更するとうまくいきます。 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() 
関連する問題