Минимизация функции с интегралом python
Задача: нужно найти параметр tau0, решая уравнение
где все, кроме tau0 -- константы.
Самым удобным способом, мне кажется, является минимизация Нелдера-Мида, что я и сделал, перенеся правую часть уравнения в левую и осуществив поиск минимального значения полученной функции, коим должен являться 0:
from scipy.integrate import quad
import numpy as np
from scipy.optimize import minimize
# CaII 3933, 3968
l1, l2, W1, W2, f1, f2 = 3933.22, 3968.03, 0.052, 0.034, 0.708, 0.351
fij = l1*f1/(l2*f2)
f1 = lambda x, tau: 1 - np.exp(-tau**2.0*fij*np.exp(x**2.0))
f2 = lambda x, tau: 1 - np.exp(-tau**2.0*np.exp(x**2.0))
def func(tau):
integral1 = quad(f1, -np.inf, np.inf, args=(tau,))
integral2 = quad(f2, -np.inf, np.inf, args=(tau,))
s = l1*integral1[0]/(l2*integral2[0]) - W1/W2
return s
def chi2(pars):
p = (0 - func(pars[0]))**2.0
return p
pars = [1]
#bnds = ((0, 20))
res = minimize(chi2, pars, method = 'Nelder-Mead')
print('tau = ', res.x[0])
print('\n func value at tau:', func(res.x[0]))
И все бы хорошо, но при различных значениях констант результат минимизации получается одним и тем же.
В чем может быть ошибка в коде? Интегралы проверил, quad все считает.
Источник: Stack Overflow на русском