2016-04-13 8 views
0

を使用して、以下の機能を合わせては、どのように私は私が解決するために、以下の機能を必要としているcurve_fit

x_data = [4, 6, 8, 10] 

y_data = [0.86, 0.73, 0.53, 0.3] 

popt, pcov = curve_fit(function, x_data, y_data,(28.14,-0.25)) 
answer = function_solve(0.5, popt[0], popt[1]) 

コードを実行しようとしましたが、エラーは次のとおりです。

は私が解決しようとしている機能は、直線状でy = 1/ c*exp(-b*x)ある関数呼び出し

に割り当てることはできません。私はy_datax_dataの束を持っているので、私はcbの最適値を取得したいと思います。

+0

ジャスト式を編集しました。 – CodeMAK

+0

実装について心配する前に、本当に解決しようとしている問題を明確にする必要があります。方程式exp((1-Y)/ Y)= exp(c)-b * xを解くことを試みていますか? – Cyb3rFly3r

+0

'np.exp(c)'はこの場合はもう一つの定数なので、 'C'だけで置き換えることができます。いくつかのデータを追加できますか? – Cleb

答えて

0

コードにいくつかの問題が既に指摘されています。ここソリューションです:

まず、あなたがあなたの元の関数の正しい対数表現を取得する必要があります:

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.08c = 100.5を使用)し、あなたにいくつかのランダムに生成されたデータの結果を示しています

[ 8.17260899e-02 1.17566291e+02] 

enter image description here

あなたが見ることができるように当てはめ値は、元のものに近いとフィット感は非常によくデータを記述する。次のように

あなたのデータのために見えます:ここで

[-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() 
+0

として、上記の関数を使用してこれを実行する方法を示してもらえ: デフf_log(X、B、c_ln): リターンのb * X - c_ln がy_dataがLNに変換する必要があります(y_data)? – CodeMAK

+0

@コードMAK:はい、データを再度変換する必要があります。既に対数データを提供しましたか? – Cleb

+0

いいえ、指定されたyデータはログ値に変換されませんでした。 – CodeMAK

1

私にジャンプ二つの問題があります。

  1. ln((1-Y)/Y) = ln(c) -b*xが、これは有効なPythonコードではありません。左側には名前が必要ですが、ここでは関数呼び出しがln(..)なので、エラーです。

  2. ln()は、標準ライブラリのPython関数ではありません。 math.log()機能があります。 ln()を別の場所に定義していない限り、動作しません。のではなく、あなたが別の関数の呼び出しに

    ln(c) - b*x 
    

    を割り当てるしようとしている

    def function(x, b, c): 
    
        ln((1-Y)/Y) = ln(c) -b*x 
        return y 
    

    、LN():

+0

ちょうどそれを訂正しましたが、同じエラーを返します – CodeMAK

+0

かなり基本的な問題である代入文を正しく理解していないようです。 'f(Y)= f(x、c、b)'という形式の代入はできません。代入の左側には、引数なしで名前をつけることしかできません: 'g = f(x、c、b)'したがって、gは 'f(x、c、b)'の評価結果を含みます。 。 – Cyb3rFly3r

0

あなたの問題は、関数を()の定義であります変数。代わりに(関数の)変数の関数を解いて、Python変数に格納できるようにしてください。

+0

あなたが機能を使用してでは例 – CodeMAK

関連する問題