Советы по оптимизации рутины / ограничения для использования - PullRequest
3 голосов
/ 12 января 2011

Я пытаюсь сделать какие-то цифры, и мне трудно найти подходящий способ решения проблемы и найти обратную связь.

Пока я проделал всю свою работу в 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"]

1 Ответ

1 голос
/ 12 января 2011

Mathematica FindMinimum прерывается, если видит мнимое число. Это может произойти даже в том случае, если ваша цель оценивается внутри ограничений, потому что для метода Барьера по умолчанию, потому что он плохо контролирует точность и может иногда выходить за пределы. Самый простой способ это обернуть вашу цель внутрь Re. Вы можете получить лучшие ответы, если разместите полный код.

Некоторые общие советы:

Проще попытаться упростить вашу задачу для Mathematica, чем заново реализовать алгоритмы оптимизации. Причина в том, что сбой одного алгоритма часто означает, что это сложная проблема, а другие алгоритмы тоже не будут работать.

Однажды у меня была проблема, когда FindMinimum выдавал предупреждения и не смог сходиться к правильному минимуму, который я мог определить аналитически, это происходило разными методами, и это имело смысл, когда я наносил на поверхность объектива ниже

http://yaroslavvb.com/upload/save/so-plateau.png

В этом случае вы видите, что проблема как минимум очень плохо обусловлена ​​(это почти плато), а минимум трудно локализовать.

Если у вас есть ограничения неравенства, метод по умолчанию - метод Барьера, который дорог и предлагает плохой контроль точности. Очень неэффективная вещь - указать ограничения равенства в виде пар неравенств, то есть вместо a=b иметь a>=b и a<=b. Это может быть в 3-10 раз медленнее, а также численно хуже - a и b могут быть только приблизительно равны в результате.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...