0

二次曲線近似プロセスで境界と制約を課そうとしています。目的は、係数a,bとを見つけることcです。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 ;

4

1 に答える 1

0

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

コードが機能するように見えます。しかし、あなたのメッセージcdelta+b+2*a*xは、コード内でdelta-b-2*a*xpara. サインに問題はありませんか?

また、5e-2 に初期化deltaしますが、その最大値を 0 に設定します。これは、紛らわしい標識に関連している可能性がある間違いのようです。

于 2016-11-25T17:54:00.763 に答える