Как передать несколько констант и переменных в Scipy Optimize? - PullRequest
0 голосов
/ 19 января 2020

Я пытаюсь согласовать данные модели (рассчитанные из eR) с моими экспериментальными данными e_exp. Я не совсем уверен, как передать константы и переменные в func.

import numpy as np
import math
from scipy.optimize import curve_fit, least_squares, minimize

f_exp     = np.array([1, 1.6, 2.7, 4.4, 7.3, 12, 20, 32, 56, 88, 144, 250000])
e_exp     = np.array([7.15, 7.30, 7.20, 7.25, 7.26, 7.28, 7.32, 7.25, 7.35, 7.34, 7.37, 13.55])

ezero     = np.min(e_exp)
einf      = np.max(e_exp)

ig_fc     = 500
ig_alpha  = 0.35

def CCER(einf, ezero, f_exp, fc, alpha):
    x  = [np.log(_ / ig_fc) for _ in f_exp]
    eR = [ezero + 1/2 * (einf - ezero) * (1 + np.sinh((1 - ig_alpha) * _) / (np.cosh((1 - ig_alpha) * _) + np.sin(1/2 * ig_alpha * math.pi))) for _ in x]
    return eR

def func(z):
    return np.sum((CCER(z[0], z[1], z[2], z[3], z[4], z[5]) - e_exp) ** 2)

res = minimize(func, (ig_fc, ig_alpha), method='SLSQP')

einf, ezero и f_exp - все константы плюс переменные, которые мне нужно оптимизировать, - ig_fc и ig_alpha, где ig обозначает начальное предположение.

Как я могу сделать эту работу?

Я также не уверен, какой из алгоритмов оптимизации из scipy лучше всего подходит для моей проблемы (будь то curve_fit, least_squares или minimize).

1 Ответ

1 голос
/ 19 января 2020

Я считаю, что вам нужно следующее:

def CCER(x, fc, alpha):
    y = np.log(x/fc)
    eR = ezero + 1/2 * (einf - ezero) * (1 + np.sinh((1 - alpha) * y) / (np.cosh((1 - alpha) * y) + np.sin(1/2 * alpha * math.pi)))
    return eR

res = curve_fit(CCER, f_exp, e_exp, p0=(ig_fc, ig_alpha))

В качестве аргумента вы передаете первое значение CCER, два оставшихся (fc и alpha) затем рассматриваются как оптимизируемые параметры. Все фиксированные параметры будут считаны из внешней области видимости - здесь нет необходимости явно передавать их функции.

Наконец, в curve_fit вам нужно только передать массив входов (f_exp) и соответствующие выходы (e_exp), а также - возможно - кортеж начальных догадок p0.

...