Я пытаюсь сделать какие-то цифры, и мне трудно найти подходящий способ решения проблемы и найти обратную связь.
Пока я проделал всю свою работу в Mathematica, однако я считаю, что настало время, когда мне нужно больше контролировать свои алгоритмы.
Я пока не могу публиковать изображения, поэтому вот ссылка на них, где H - это значительный шаг шага.C(k)
это просто FT C(r)
и m=4
.N
в моем случае - 2000
, поэтому вы можете видеть, что омега - это всего лишь сумма большого числа экспонент.rho
это просто плотность.C(r)
, как вы можете видеть, потому что m=4
имеет различные коэффициенты a
.IRISM, в конечном счете, зависит от коэффициентов a
.
У меня есть эти три уравнения, работающие правильно, я думаю, в Mathematica, однако я пытаюсь минимизировать IRISM и найти значения 4 a
.Проблема, с которой я сталкиваюсь, заключается в том, что по очевидным причинам возникает разрыв, когда логарифм с интегралом равен нулю.Кажется, я не могу найти способ изменить алгоритм Mathematica (это чёрный ящик, это правильный термин?), Чтобы проверить пробные значения a
.Я использовал Nelder-Meade и diffrential Evolution и пробовал разные ограничения.Однако мне казалось, что я получаю только мнимые результаты, очевидно, из отрицательного логарифма, или если я достаточно хорошо ограничен, чтобы избежать явно только локального минимума, поскольку мои результаты не соответствуют «правильным» результатам.Я пробовал несколько раз с алгоритмами минимизации, которые использовали градиенты, но мне не очень повезло.
Я думаю, что мой лучший способ двигаться вперед - это просто написать процедуру минимизации с нуля или изменить другой код,Я могу проверить IRISM перед интеграцией на разрыв.Я прочитал кое-что о штрафных функциях, лог-барьере и т. Д., Но, будучи новичком в программировании, надеялся, что кто-нибудь сможет дать мне знать, с чего начать с хорошего подхода.Я думаю, больше всего на свете есть слишком много информации об оптимизации, и мне трудно понять, с чего начать.
Редактировать: Вот необработанный ввод.Если мне нужно опубликовать его другим способом, пожалуйста, дайте мне знать.
OverHat[c][a1_, a2_, a3_, a4_, k_] := (a1*(4*Pi*(Sin[k] - k*Cos[k])))/k^3 +
(a2*(4*Pi*(k*Sin[k] + 2*Cos[k] - 2)))/k^4 +
(a3*(8*Pi*(2*k - 3*Sin[k] + k*Cos[k])))/k^5 +
(a4*(-(24*Pi*(k^2 + k*Sin[k] + 4*Cos[k] - 4))))/k^6
Subscript[OverHat[\[Omega]], \[Alpha]\[Gamma]][k_, \[Alpha]\[Gamma]_, n_] :=
Exp[(-k^2)*\[Alpha]\[Gamma]*((n - \[Alpha]\[Gamma])/(6*n))]
OverHat[\[Omega]][k_] := Sum[Subscript[OverHat[\[Omega]], \[Alpha]\[Gamma]][k, \[Alpha]\[Gamma], n],
{\[Alpha]\[Gamma], 1, n}] /. n -> 2000
IRISM[a1_, a2_, a3_, a4_, \[Rho]_, kmax_] :=
\[Rho]^2*(1/15)*(20*a1 - 5*a2 + 2*a3 - a4)*Pi -
(1/(8*Pi^3))*NIntegrate[(\[Rho]*OverHat[\[Omega]][k]*OverHat[c][a1, a2, a3, a4, k] +
Log[1 - \[Rho]*OverHat[\[Omega]][k]*OverHat[c][a1, a2, a3, a4, k]])*4*Pi*k^2,
{k, 0, kmax}, WorkingPrecision -> 80]
NMinimize[IRISM[a1, a2, a3, a4, 0.9, 30], {a1, a2, a3, a4},
Method -> "DifferentialEvolution"]