Mathematica: Порядок вычисления при численной оптимизации функций черного ящика

Я пытаюсь выполнить численную оптимизацию функции «черного ящика» в Mathematica. Схематично это выглядит так:

NMinimize[{comb[x,y,z], x > 0}, {x,y,z}]

где comb[x,y,z] определяется аналогично этому:

comb[x_,y_,z_] := Module[{},
  Print[x,y,z];
  M = FindMaximum[SkewNormal[a,x,y,z], {a,x}] // First;
  val = f[x,y,z,M];
  Return[val];
];

Тем не менее, все функции минимизации, которые я пробовал, не сразу предоставляют comb[x,y,z] числовые значения, и в конечном итоге они пытаются оценить FindMaximum с символическими значениями для x,y,z (что легко проверить потому что Print[x,y,z] также оценивается символически). Таким образом, Findmaximum терпит неудачу (FindMaximum::nrnum: значение функции, бла-бла, не является реальным числом), поэтому минимизация не удалась.

Как исправить порядок оценки, чтобы подфункции гребенки оценивались числовыми значениями?


person Ben Farmer    schedule 09.08.2011    source источник
comment
Другая (более тонкая) проблема из-за символической предварительной обработки в NMinimize недавно была решена в другая тема от Daniel Lichtblau.   -  person Alexey Popkov    schedule 09.08.2011
comment
Хм, хорошо, спасибо, я проверю это. Я также только что заметил, что эта проблема не возникает в Mathematica 8 (ранее я запускал 7).   -  person Ben Farmer    schedule 11.08.2011


Ответы (2)


Порядок оценки для FindMinimum, FindMaximum, FindRoot и FindFit задокументирован в tutorial/UnconstrainedOptimizationSymbolicEvaluation. Страница документации. Я думаю, что что-то очень похожее применимо к функции NMinimize. Описание довольно длинное, поэтому я приведу здесь только предлагаемое решение с этой страницы:

Если ваша функция такова, что символьные вычисления не сохранят функцию, как предполагалось, или будут слишком медленными, вы должны определить свою функцию так, чтобы она оценивала только числовые значения переменных. Самый простой способ сделать это — определить функцию с помощью PatternTest (?), как в f[x_?NumberQ]:=definition.

Может показаться, что символьные вычисления просто создают проблемы, поскольку вам нужно специально определить функцию, чтобы предотвратить это. Однако без символьной оценки системе Mathematica трудно использовать уникальную комбинацию числовой и символьной мощности. Символьная оценка означает, что команды могут последовательно использовать преимущества символьного анализа, такие как определение алгоритма, автоматическое вычисление производных, автоматическая оптимизация и компиляция, а также структурный анализ.

person Alexey Popkov    schedule 11.08.2011

Как насчет замены comb на

comb[x_?NumericQ, y_?NumericQ, z_?NumericQ] := 
 Module[{}, Print[x, y, z];
 M = FindMaximum[SkewNormal[a, x, y, z], {a, x}] // First;
 val = f[x, y, z, M];
 Return[val];];

что приводит к тому, что определение comb оценивается только в том случае, если его аргументы являются числами?

person acl    schedule 09.08.2011
comment
Нет, это не помогает. Моя функция уже сделала это, я просто удалил эти биты, чтобы задать этот вопрос. - person Ben Farmer; 11.08.2011
comment
@Ben Странно, что Print также будет отображать символические значения, поскольку comb[x,y,z] с символическими значениями не будет соответствовать определению, которое я дал. Вы Clear[comb] делали это перед запуском? Возможно, это соответствует определению без бита NumericQ. - person acl; 11.08.2011
comment
@acl Сначала это не сработало для меня, но после очистки это помогло. - person Thomas Ahle; 12.05.2017