2017-08-25 103 views
1

我想用curve_fit來適應一些數據。這是偉大的工作,我只是想提高配合其他參數匹配假設(如機械效率不能大於100%等)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) 

但我想另外指定邊界之間的關係參數例如。

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

所以我相信我已經解決了這個問題,基於@ 9dogs評論使用lmfit。 相關文件在這裏:

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

這裏一個有用的教程:

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

對於我的功能poly3這接縫工作執行水平或正拐點。

爲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抱歉,我更新了不平等的參數 –

相關問題