Функция минимизации в Mathematica - PullRequest
2 голосов
/ 18 октября 2011

Я попытался использовать функцию NMinimize, чтобы найти глобальный минимум следующей функции.

f = {s1 - Log[1000/{Norm[{2.83, 0, 2} - {u, v, w}]}^3]}^2 + {s2 - 
      Log[1000/{Norm[{0, 2.83, -2} - {u, v, w}]}^3]}^2 + {s3 - 
      Log[1000/{Norm[{-2.83, 0, 2} - {u, v, w}]}^3]}^2 + {s4 - 
      Log[1000/{Norm[{0, -2.83, -2} - {u, v, w}]}^3]}^2;
NMinimize[f, {u, v, w}, Method -> {"DifferentialEvolution"}].

Оптимизация - это безусловная оптимизация.Ниже приводится ошибка, которую я получаю при каждом запуске.

"NMinimize :: nnum:" Значение функции {{2.67476}} не является числом в {u, v, w} ={0.673558,0.659492,0.0861047} "

Я не уверен, где я иду не так. Также есть способ установить правило остановки и извлечь значения из вывода NMinimize, когда естьошибка такого рода. Пожалуйста, помогите мне в отладке этого кода. Заранее спасибо за помощь Kum.

1 Ответ

5 голосов
/ 18 октября 2011

Фигурные скобки означают списки в Mathematica, поэтому ваша функция выводит матрицу из одного элемента, а не скаляр. Измените пары {}, которые вы используете для группировки в нормальные скобки. Тот факт, что вы получаете двойные фигурные скобки, показывает, что существует два уровня скобок для конвертации.

f = (s1 - Log[1000./(Norm[{2.83, 0, 2} - {u, v, w}])^3])^2 + (s2 - 
      Log[1000./(Norm[{0, 2.83, -2} - {u, v, w}])^3])^2 + (s3 - 
      Log[1000./(Norm[{-2.83, 0, 2} - {u, v, w}])^3])^2 + (s4 - 
      Log[1000./(Norm[{0, -2.83, -2} - {u, v, w}])^3])^2;

Как еще одно замечание, я бы изменил значения Integer (1000) на действительные числа (1000.), поскольку остальная часть входных данных представлена ​​в действительных числах с машинной точностью. Как Бретт напомнил мне в комментариях, результат не будет отличаться, но если вы делаете много повторных вычислений, вы можете заметить небольшое ускорение производительности, и вам будет легче Компилировать функция, если вы хотите дальнейшее улучшение производительности.

(Отредактировано, когда я понял, что это матричный вывод 1 * 1, а не векторный вывод.)

...