Минимизация функции с интегралом python

Рейтинг: 0Ответов: 1Опубликовано: 09.06.2023

Задача: нужно найти параметр 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 все считает.

Ответы

▲ 0

Оказывается, величина tau_0 должна входить в первой степени в это уравнение, число 2 означает индекс. Так что всегда разбираемся, что и что означает... Нелдер-Мид все прекрасно считает для таких функций с интегралами.