Как поставить деривацию в качестве границы в "scipy.optimize.curve_fit" - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь получить коэффициенты функции p (T, x).Я предоставил данные для p, T и x из листов Excel через panda.Следующий код работает очень хорошо для меня:

import pandas as pd
import os
from scipy.optimize import curve_fit
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.17 

def func(X, a, b, c, d, e, f):
    T, x = X
    return x * p_s + x * (1 - x) * (a + b * T + c * T ** 2 + d * x + e * x * T + f * x * T ** 2) * p_s

popt, pcov = curve_fit(func, (T, x), p)
print("a = %s , b = %s, c = %s, d = %s, e = %s, f = %s" % (popt[0], popt[1], popt[2], popt[3], popt[4], popt[5]))

Моя острая проблема заключается в том, что функция в конце немного качается.plot of function

Из-за этого поведения я получаю два x значения для одного p значения, которое мне не нужно.Поэтому, чтобы избежать этого небольшого колебания, я хочу выполнить граничное условие для примерки, которое говорит что-то вроде dp/dx (for constant T) > 0.Под dp/dx я имею в виду вывод функции после x.

Возможно ли это с обычным параметром bound, равным curve_fit?Как я могу это сделать?

РЕДАКТИРОВАТЬ:

Как и предполагалось, я немного запутался с функцией least_square, но я думаю, что я пришел к точке, где я не оченьпонять, что я делаю или должен делать.

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 f(X, z):
    T, x = X
    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 g(X,p,z):
    return p - f(X ,z)

z0 = np.array([0,0,0,0,0,0], dtype=float)

res, flag = least_squares(g,z0, args=(T,x,p))
print(res)

С этим кодом я получаю следующую ошибку:

TypeError: g() takes 3 positional arguments but 4 were given
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...