python - 如何使用 scipy.optimize.minimize 修复推导条件的拟合
问题描述
我试图在forcav=p(T,x)
之后的推导始终为正的条件下x
拟合函数。和的数据来自 excel 表格。是我想要得到的系数。cav
constant T
dp/dx (for constant T) > 0
x
T
p
z
我已经使用了这里的解决方案,以对派生 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
。谢谢你的帮助!
解决方案
resid
该错误是因为除了初始猜测之外,您还传递了 3 个参数z0
。
因此,必须改变的行是:
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()
推荐阅读
- java - 如何将此代码转换为 java 8 流?
- microsoft-teams - 是否可以为不使用中央服务提供商的 Microsoft Teams 创建自定义应用程序?
- c++ - 如何准确地对 C/C++ 代码进行基准测试?
- websocket - 海王星 | 小鬼蟒 | 使用 websocket 的并行查询
- r - 将数据库 ID 主题字符串重新分配为 R 中的因素
- avro - 如何在融合模式注册表中发展模式
- c++ - 在模态对话框后面或关闭后打开一个对话框
- swift - Swift:使用 VNRecognizeText 时如何获取字符框信息
- ios - 将dylib嵌入iOS应用程序的正确方法
- charts - Google 可视化表格列宽和行高