2017-08-25 52 views
1

私はcurve_fitをデータに適合させようとしています。それは素晴らしい働いている、私は追加のパラメータを持つフィットは、私はさらに関係に範囲を指定したいScipy curve_fit境界と条件

y_data = [0.90 0.90 0.90 0.90 0.90 0.90 0.90 1.30 1.30 1.30 1.30 1.20 1.65 1.65 1.65 1.65 1.65 1.65 1.80 1.80 1.80 1.80 1.80 1.80 1.80 1.80 1.80 3.50 6.60 6.60 6.70 6.70 6.70 6.70 6.70 8.50 12.70] # I am aware this does not have commas 
x_data = [0.38 0.38 0.38 0.38 0.38 0.38 0.38 0.38 0.38 0.38 0.38 0.46 0.53 0.53 0.53 0.53 0.53 0.53 0.53 0.53 0.53 0.53 0.53 0.53 0.53 0.53 0.53 0.53 1.02 1.02 1.02 1.02 1.02 1.02 1.02 1.02 1.02] # ditto 


def poly2(x, a, b, c): return a*x**2+ b*x+c 

def poly3(x,a,b,c,d): return a*x**3+b*x**2+c*b*x+d 

pars = fit(poly2, x_data, y_data, bounds=bounds) 

しかし、(例えば100%以上などすることはできません機械効率など)の前提条件に一致するように改善したいと思いますパラメータ。

B**2 -4*a*c > 0 #for poly2 
b**2-3*a*c=0 #for poly3 

フィットが水平方向の屈曲を持つようにする。 これを達成する方法はありますか? enter image description here

編集:私は調査後、私はこれを見つけ、それが役立つことがあります。How do I put a constraint on SciPy curve fit?

これが示唆したようにlmfitを使用して行われるだろうか?

+2

いいえ(基本的な問題を変更する)(非ボックス)制約はサポートされていません。 – sascha

+2

lmfitモジュールは、[パラメータ制約](https://lmfit.github.io/lmfit-py/constraints.html)を追加する簡単な方法を提供するようです。 – 9dogs

+1

データを追加できますか? – Cleb

答えて

0

私はlmfitを使って@ 9dogsのコメントに基づいてこれを解決したと思います。ここ 関連文書:

https://lmfit.github.io/lmfit-py/constraints.html

、ここで役に立つチュートリアル:私の機能poly3については

http://blog.danallan.com/projects/2013/model/

これは、水平または正の変曲を強制するために動作するように縫い目。 TEHひどい数学のための

from lmfit import Parameters, Model 
def poly3(x,a,b,c,d): return a*x**3+b*x**2+c*b*x+d 

model = Model(poly3, independent_vars=['x'],) 
params = Parameters() 

謝罪:立方dicriminantは疑問がある場合は、私は他の例を拡大していきますhttps://brilliant.org/wiki/cubic-discriminant/b**2*c**2-4*a*c**3-4*b**3*d-27*a**2*d**2+18*a*b*c*d

params = Parameters() 

params..add('a', value=1, min=0, vary=True) 
params.add('b', value=1, vary=True) 

params.add('c', value=1, vary=True) 
params.add('d', value=1, vary=True) 
params.add('discr', value = 0, vary= False, expr='(b**2*c**2-4*a*c**3-4*b**3*d-27*a**2*d**2+18*a*b*c*d)') 

result = model.fit(y_data, x=x_data, params=params) # do the work 
pars = [] # list that will contain the optimized parameters for analysis 
# create a parameters list for use in the rest of code, this is a stopgap until I refactor the rest of my code 
pars.append(result.values['a']) 
pars.append(result.values['b']) 
pars.append(result.values['c']) 
pars.append(result.values['d']) 

## rest of code such as plotting 

として、ここで与えられています。

+0

これは '='の場合をカバーしています。 '>' 'を' B ** 2 -4 * a * c> 0 'のように扱う方法を見つけましたか? – Cleb

+1

はい、これは、デルタパラメータを変更し、最小/最大を設定することでそれをカバーします。不等式をカバーすることができます。最初のリンクの一番下にある –

+0

@Cleb残念ですが、私は不等式のパラメータを更新しました –

関連する問題