2017-07-12 14 views
3

私が知っているいくつかの設定点、xとyに当てはまる曲線を見つけてプロットしたいと思います。Pythonの非線形曲線適合プログラム

私はscipy.optimizeとcurve_fitを使って実験を始めましたが、リファレンスガイドでは、代わりにデータにフィットする関数を使用し、ydata = f(xdata、* params)+ epsと仮定していました。

だから私の質問はこれです:私は私のセットポイントを使用して曲線の関数を見つけることcurve_fitまたは他のライブラリを使用するために自分のコードに変更することは何がありますか? (注:関数についても知りたいので、後でプロジェクトに統合してプロットすることができます)。私はそれが減衰する指数関数になることは知っていますが、正確なパラメータは分かりません。これは自分のプログラムで試したものです:

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

    def func(x, a, b, c): 
     return a * np.exp(-b * x) + c 

    xdata = np.array([0.2, 0.5, 0.8, 1]) 
    ydata = np.array([6, 1, 0.5, 0.2]) 
    plt.plot(xdata, ydata, 'b-', label='data') 
    popt, pcov = curve_fit(func, xdata, ydata) 
    plt.plot(xdata, func(xdata, *popt), 'r-', label='fit') 

    plt.xlabel('x') 
    plt.ylabel('y') 
    plt.legend() 
    plt.show() 

このプロジェクトは、現在何か変更があった場合、Raspberry Piで開発中です。そして、最小二乗法を使用したいのは、偉大で正確ですが、うまくいく他の方法は大歓迎です。 これも、scipyライブラリのリファレンスガイドに基づいています。また、私も曲線ではない以下のグラフを取得:セットポイントに基づいて、グラフや曲線

[1]

+2

はすべてがあなたのプロットを除いて、OKです: 'X =あなたのフィット関数を評価したいので、np.arange(0、1、0.01) 'と' plt.plot(x、func(x、* popt)、 'r-'、label = 'fit'より多くのポイントで、滑らかな結果を見ることができます。適合したパラメータに関しては、それらはpopt配列にあります。 –

+1

実際にあなたは既存のコードで何が問題になっていますか?編集:@MauroLacyは私が疑っていたものを確認しました。 –

答えて

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

def func(x, a, b, c): 
    return a * np.exp(-b * x) + c 

#c is a constant so taking the derivative makes it go to zero 
def deriv(x, a, b, c): 
    return -a * b * np.exp(-b * x) 

#Integrating gives you another c coefficient (offset) let's call it c1 and set it equal to zero by default 
def integ(x, a, b, c, c1 = 0): 
    return -a/b * np.exp(-b * x) + c*x + c1 

#There are only 4 (x,y) points here 
xdata = np.array([0.2, 0.5, 0.8, 1]) 
ydata = np.array([6, 1, 0.5, 0.2]) 

#curve_fit already uses "non-linear least squares to fit a function, f, to data" 
popt, pcov = curve_fit(func, xdata, ydata) 
a,b,c = popt #these are the optimal parameters for fitting your 4 data points 

#Now get more x values to plot the curve along so it looks like a curve 
step = 0.01 
fit_xs = np.arange(min(xdata),max(xdata),step) 

#Plot the results 
plt.plot(xdata, ydata, 'bx', label='data') 
plt.plot(fit_xs, func(fit_xs,a,b,c), 'r-', label='fit') 
plt.plot(fit_xs, deriv(fit_xs,a,b,c), 'g-', label='deriv') 
plt.plot(fit_xs, integ(fit_xs,a,b,c), 'm-', label='integ') 
plt.xlabel('x') 
plt.ylabel('y') 
plt.legend() 
plt.show() 

deriv and integ

+1

あなたはカーブではなく 'bx'のようなものをポイントとしてデータを表示する必要があります(それほど一般的なコメントですが、あまり気にしないでください) – jadsq

+0

私はこの提案が気に入っています。ポイント – mitoRibo

+0

私は曲線をよりよくフィットさせるための措置が必要であることが理にかなっています。だから、明確にするために、関数は私に曲線の等式を与えますか?そしてもしそうなら、後で私は、統合、派生、そしてそれほど長い間、関数 "func"を操作することができますか? – Cmylife

関連する問題