【问题标题】:How to fix fitting with scipy.optimize.minimize for derivation condition如何使用 scipy.optimize.minimize 修复推导条件的拟合
【发布时间】:2019-07-11 01:31:00
【问题描述】:

我试图拟合函数cav=p(T,x),条件是cavx 之后的推导constant 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 的参数。感谢您的帮助!

【问题讨论】:

  • 您的代码存在几个问题。我看到(p-cav(T,x))cav 需要三个参数。

标签: python python-3.x scipy minimize


【解决方案1】:

错误是因为除了初始猜测z0之外,您还将3个参数传递给@ 987654321。

因此,必须改变的线是:

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()

【讨论】:

  • 感谢您的帮助。我已经完成了你所说的,但不幸的是我在ValueError: operands could not be broadcast together with shapes (6,) (217,) 987654328 @,len(p)是217但是len(z)是@ 987654331有什么想法吗?
  • 这是一个问题,必须在另一个问题中提出有关您数据的更多详细信息。因此,您必须避免在单个帖子中询问多个问题。如果在当前问题中提出的问题已得到解决,则该问题被视为已解答:) span>
猜你喜欢
  • 1970-01-01
  • 2018-06-30
  • 2017-12-23
  • 2015-07-20
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 2023-01-24
  • 2022-01-14
相关资源
最近更新 更多