如何修复 scipy.optimize.minimize 的推导条件
How to fix fitting with scipy.optimize.minimize for derivation condition
我正在尝试拟合函数 cav=p(T,x)
,条件是 cav
的 x
之后对 constant T
的推导始终为正值 dp/dx (for constant T) > 0
。 x
、T
、p
的数据来自excel张。 z
是我想要得到的系数。
我使用此处 Fitting with constraints on derivative Python 中的解决方案作为模板。这是我的代码,因为它现在提供错误消息:
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)
错误:
TypeError: resid() takes 3 positional arguments but 4 were given
我不明白我必须输入什么作为三个 def
的参数。感谢您的帮助!
错误是因为除了初始猜测 z0
之外,您还向 resid
传递了 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()
我正在尝试拟合函数 cav=p(T,x)
,条件是 cav
的 x
之后对 constant T
的推导始终为正值 dp/dx (for constant T) > 0
。 x
、T
、p
的数据来自excel张。 z
是我想要得到的系数。
我使用此处 Fitting with constraints on derivative Python 中的解决方案作为模板。这是我的代码,因为它现在提供错误消息:
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)
错误:
TypeError: resid() takes 3 positional arguments but 4 were given
我不明白我必须输入什么作为三个 def
的参数。感谢您的帮助!
错误是因为除了初始猜测 z0
之外,您还向 resid
传递了 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()