コードにいくつかの問題が既に指摘されています。ここソリューションです:
まず、あなたがあなたの元の関数の正しい対数表現を取得する必要があります:
y = 1/(c * exp(-b * x))
y = exp(b * x)/c
ln(y) = b * x + ln(1/c)
ln(y) = b * x - ln(c)
あなたはcurve_fit
でそれを使用したい場合は、次のように関数を定義する必要があります。
def f_log(x, b, c_ln):
return b * x - c_ln
私は今も、あなたが提供されたデータのための出力を元の関数を使用して(b = 0.08
とc = 100.5
を使用)し、あなたにいくつかのランダムに生成されたデータの結果を示しています
[ 8.17260899e-02 1.17566291e+02]
あなたが見ることができるように当てはめ値は、元のものに近いとフィット感は非常によくデータを記述する。次のように
あなたのデータのために見えます:ここで
[-0.094 -1.263]
は、コードは次のとおりです。
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
def f(x, b, c):
return 1./(c * np.exp(-b * x))
def f_log(x, b, c_ln):
return b * x - c_ln
# some random data
b_org = 0.08
c_org = 100.5
x_data = np.linspace(0.01, 100., 50)
y_data = f(x_data, b_org, c_org) + np.random.normal(0, 0.5, len(x_data))
# fit the data
popt, pcov = curve_fit(f, x_data, y_data, p0=(0.1, 50))
print popt
# plot the data
xnew = np.linspace(0.01, 100., 5000)
plt.plot(x_data, y_data, 'bo')
plt.plot(xnew, f(xnew, *popt), 'r')
plt.show()
# your data
x_data = np.array([4, 6, 8, 10])
y_data = np.array([0.86, 0.73, 0.53, 0.3])
# fit the data
popt_log, pcov_log = curve_fit(f_log, x_data, y_data)
print popt_log
# plot the data
xnew = np.linspace(4, 10., 500)
plt.plot(x_data, y_data, 'bo')
plt.plot(xnew, f_log(xnew, *popt_log), 'r')
plt.show()
ジャスト式を編集しました。 – CodeMAK
実装について心配する前に、本当に解決しようとしている問題を明確にする必要があります。方程式exp((1-Y)/ Y)= exp(c)-b * xを解くことを試みていますか? – Cyb3rFly3r
'np.exp(c)'はこの場合はもう一つの定数なので、 'C'だけで置き換えることができます。いくつかのデータを追加できますか? – Cleb