如何使用scipy.optimize.minimize修正拟合条件

时间:2019-02-17 14:21:11

标签: python python-3.x scipy minimize

我正在尝试拟合一个函数cav=p(T,x),条件是x的{​​{1}}的{​​{1}}之后的导数始终为正cavconstant Tdp/dx (for constant T) > 0x的数据来自excel表。 T是我要获取的系数。

我已将Fitting with constraints on derivative Python处的解决方案用作模板。这是我的代码,它现在带有提供错误消息:

p

错误:

z

我不明白我必须为三个import pandas as pd import os from scipy.optimize import minimize import numpy as np df = pd.read_excel(os.path.join(os.path.dirname(__file__), "./data.xlsx")) T = np.array(df['T'], dtype=float) x = np.array(df['x'], dtype=float) p = np.array(df['p'], dtype=float) p_s = 67 def cav(z,T,x): #my function return x * p_s + x * (1 - x) * (z[0] + z[1] * T + z[2] * T ** 2 + z[3] * x + z[4] * x * T + z[5] * x * T ** 2) * p_s def resid(p,T,x): return ((p-cav(T,x))**2).sum() def constr(z): return np.gradient(cav(z,x,T)) con1 = {'type': 'ineq', 'fun': constr} z0 = np.array([0,0,0,0,0,0], dtype=float) res = minimize(resid,z0, args=(p,T,x), method='cobyla',options={'maxiter':50000}, constraints=con1) 输入什么参数。感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

该错误是因为除了初始猜测resid之外,您还向z0传递了3个参数。

因此,必须更改的行是:

res = minimize(resid,z0, args=(T,x), method='cobyla',options={'maxiter':50000}, constraints=con1)

代码中的另一个问题是:

def resid(p,T,x):
    return ((p-cav(T,x))**2).sum()

您的方法cav接受三个参数,但您仅传递两个参数。因此,应该将其更改为:

def resid(p,T,x):
    return ((p-cav(p,T,x))**2).sum()