Как преобразовать выражение Symboli c, чтобы оно работало с curve_fit? - PullRequest
2 голосов
/ 14 января 2020

так что я пытаюсь вписать указанную модель c в набор данных со значениями x - y и получить константы модели. Я могу получить константу (в этом случае есть только один), а затем установить y_opt. Ниже приведен рабочий пример этого:

import pandas as pd
from scipy.optimize import curve_fit

data = pd.read_csv(r'')
x_measured = data['x[-]'].values
y_measured = data['y[-]'].values

def y_NH(x_eng, D):
    y_comp = D * x_eng*(x_eng**2 + 3 * x_eng + 3) / (1 + x_eng)**2
    return y_comp

D = curve_fit(y_NH, x_measured, y_measured)
y_opt = y_NH(x_measured, D[0])

Это хорошо работает, но не совсем хорошо для меня. Формула для y_comp - это то, что мне нужно было вывести вручную - изначально у меня была другая переменная, скажем, Y_comp, и я получил y_comp, дифференцируя Y_comp (очевидно, x_eng). Чего я хотел бы добиться, так это снабдить свою функцию Y_comp (потому что будет больше как Z_comp, F_comp et c.), Это дифференцирует ее, что приведет к y_comp (z_comp, f_comp), и тогда он поместил бы модель в мой набор данных - тогда результат был бы константой (-ами) конкретной модели.

Я начал с какой-то работы, но все же меня недостаточно, и я бы Спасибо за помощь в этом топи c. Код ошибки:

import sympy as sy
from sympy.utilities.lambdify import lambdify

def y_NH2(x_eng, D):   
    lambda1 = sy.Symbol('lambda1')
    x_eng = sy.Symbol('x_eng')
    #Gi = sy.Symbol('Gi')    
    lambda1 = x_eng + 1
    W = lambda1**2 + 2 / lambda1
    y_comp_symb = sy.diff(W, x_eng)
    y_comp = lambdify(x_eng, y_comp_symb,'numpy')
    y_return = D / 2 * y_comp(x_eng)
    return y_return

y_p = y_NH2(x_measured, 12)
print(y_p)
D = curve_fit(y_NH2, x_measured, y_measured)
y_opt = y_NH2(x_measured, D[0])

Это вызывает ошибку в curve_fit, а именно: «error: Результат от вызова функции не является правильным массивом с плавающей точкой».

Не могли бы вы дать мне подсказку?

...