2016-11-25 10 views
0

私は二次曲線近似プロセスで境界と制約を課そうとしています。目的は、係数a,bcを見つけることです。 b:delta-2*a*xに制約を課すことは私の疑いです。どのように私の制約内に変数xを追加できますか?実行可能コード:カーブフィッティングパラメータの制約

from lmfit import Model, Parameters 

#create x and y data to be used for curve fitting 
xip=[ 0.02237461, 0.0983837 , 0.25707382, 0.56959641, 1.33419197, 4.95835927] 
yip=[0.20085822, 0.23583258, 0.28996988, 0.36350284, 0.47981232, 0.67602165] 

#function to fit data: a,b,c needs to be found 
def f(xx, a, b, c): 
    # constraints: c <=0, a>0 and 2*a*x+b >= 0 
    return a*xx**2 + b*xx + c 

fmodel = Model(f) 
params = Parameters() 

params.add('a', value=-1e-2, vary=True, min = -1e10, max = 0) 
params.add('c', value=-4e-2, vary=True, min = -1e10, max =0) 
params.add('delta', value=5e-2, vary=True, min=0, max=1e10) 
params.add('xpara', value=5, vary=True) 
params.add('b', expr = 'delta-2*a*xpara') 

result = fmodel.fit(yip, params, xx=xip) 
print(result.fit_report()) 


import matplotlib.pyplot as plt 
op = plt.subplot(1,1,1) 
op.scatter(xip,yip) 
plt.plot(xip, result.init_fit, 'k--') 
#plt.plot(xip, result.best_fit, 'r-') 

ありがとうございます!

編集:このプログラムを動作させるために変数を変更しました。しかし、制約を適用するのが正しいかどうかは不明です。

編集2:必要な制約が追加されました:c < = 0、a> 0および2 * a * x + b> = 0;

答えて

0

どのようなエラーが表示されますか?

コードがうまくいくように見えます。しかし、あなたのメッセージでは、cdelta+b+2*a*xに、コードにはdelta-b-2*a*xparaとなるように制約したいと言っていました。サインに問題はありますか?

また、deltaを5e-2に初期化しますが、最大値を0に設定します。間違いのように見えますが、混乱する可能性があります。

+0

@M Newville、Sorry!自分のコードを自分の実際のデータで変更しました。私はチェックするためにここにいます:制約に変数 'xx'を追加することは可能ですか?このカーブフィッティングプロセスで 'xx'を表す' xpara'はどのようにフィットするのでしょうか?ここで、xxはカーブフィッティングプロセスで使用されるデータの「xip」だけです。おかげさま! – learnerADV

+0

私はあなたの質問を完全に理解しているかどうかはわかりません。パラメータには配列ではなくスカラがあります。 "2 * a * x + b> 0"と言うとき、xはおそらく配列を意味します。しかし、これは変化しないので、あなたは "2 * a * x_max + b> 0"をアサートすることができ、フィットの前にx_maxの値を知ることができるかもしれません。 Stackoverflowのコメントは、そのような議論のための素晴らしい場所ではありません。適切なメーリングリストを検討してください。 –

+0

Okay Newville。私は最小限の機能を使用することができます。残差 '((y-a * x ** 2-b * x-c)** 2).sum()'は目的関数として使用されます。 – learnerADV