Как исправить примерку с помощью scipy.optimize.minimize для условия деривации - PullRequest
0 голосов
/ 17 февраля 2019

Я пытаюсь согласовать функцию cav=p(T,x) с условием, что деривация после x из cav для constant T всегда положительна dp/dx (for constant T) > 0.Данные x, T и p взяты из листов Excel.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.Спасибо за любую помощь!

1 Ответ

0 голосов
/ 17 февраля 2019

Ошибка в том, что вы передаете 3 аргумента resid в дополнение к первоначальному предположению 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()
...