2012-04-15 1 views
2

入力として2つの独立変数x、yと3つのパラメータをa、b、cとする関数をフィットしようとしています。これは私のテストコードです:フィッティング関数に引数を渡します。

import numpy as np 
from scipy.optimize import curve_fit 

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

y= x = np.linspace(0,4,50) 
z = func(x,y, 2.5, 1.3, 0.5) #works ok 
#generate data to be fitted 
zn = z + 0.2*np.random.normal(size=len(x)) 
popt, pcov = curve_fit(func, x,y, zn) #<--------Problem here!!!!! 

しかし、私はエラーを取得しています: "FUNC()は(51が与えられた)正確に5引数を取ります"。引数x、yを正しく渡すには?

+0

'' curve_fit 'のドキュメントは 'func'パラメータについて何を言いますか?明らかに、それは51のパラメータでそれを呼び出そうとしているので、おそらくあなたはドキュメントを再読み込みする必要があります。 – Wes

答えて

6

documentation of scipy.optimize.curve_fit()でご覧ください。プロトタイプは

scipy.optimize.curve_fit(f, xdata, ydata, p0=None, sigma=None, **kw) 

ドキュメント状態curve_fit()は、パラメータの開始値ANS第三引数として第2引数、従属変数としての第1引数、独立変数(単数または複数)としてターゲット関数と呼ばれています第4引数として。関数を全く別の方法で呼び出そうとしたので、うまくいきません。具体的には、p0パラメータとしてznを渡しました。このため、非常に多くのパラメータで関数が呼び出されました。

ドキュメントは、ターゲット関数が呼び出される方法を説明します。

f : callable
The model function, f(x, ...) . It must take the independent variable as the first argument and the parameters to fit as separate remaining arguments.

xdata : An N -length sequence or an (k,N) -shaped array
for functions with k predictors. The independent variable where the data is measured.

あなたはそれが引数の単一のアレイである必要がありながら、従属変数の引数を区切るために使用してみてください。

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

N = 50 
x = np.linspace(0,4,50) 
x = numpy.array([x, x])   # Combine your `x` and `y` to a single 
           # (2, N)-array 
z = func(x, 2.5, 1.3, 0.5) 
zn = z + 0.2 * np.random.normal(size=x.shape[1]) 
popt, pcov = curve_fit(func, x, zn) 
+0

ありがとう、問題解決済み! – elyase

0

試行タプルとしてfuncに最初の2つの配列パラメータを渡し、通常curvefitが合うように入力としてxおよびyパラメーターfunc(x)を受け入れるであろうと予想されるパラメータ

のタプルを受け入れるようにfuncを変更します曲線。不思議なことに、xパラメータが単一の値ではなく2つの値(理由がわからない)の場合は、xを単一のパラメータとして受け入れ、その範囲内で展開するように関数を変更する必要があります。

一般に、3次元カーブフィッティングは、達成しようとしているものとは異なる方法で処理する必要があります。あなたは次のSO投稿を見て、3次元のばらつきを線で近似しようとしました。

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

>>> y= x = np.linspace(0,4,50) 
>>> z = func((x,y), 2.5, 1.3, 0.5) #works ok 
>>> zn = z + 0.2*np.random.normal(size=len(x)) 
>>> popt, pcov = curve_fit(func, (x,y), zn) 
関連する問題