如何固定配件scipy.优化.最小化求导条件

2024-10-01 00:28:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用一个条件来拟合函数cav=p(T,x),条件是x之后cavconstant T的派生总是正的dp/dx (for constant T) > 0xTp的数据来自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的参数。谢谢你的帮助!你知道吗


Tags: importdfreturnosdefnpfloat条件
1条回答
网友
1楼 · 发布于 2024-10-01 00:28:46

这个错误是因为除了最初的猜测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()

相关问题 更多 >