Поймать исключение в Mathematica, не выполняя вычисления дважды

Я должен запустить ряд NMinimize команды в разных случаях. Некоторые из этих трасс не смогли сходиться.

Я хочу определить, какие из них не смогли сойтись, и получить текущее решение, найденное Mathematica.

Поиск в других сообщениях, предлагаемых с помощью Check[], но это не возвращает результат, как только он выходит из ошибки.

В настоящее время у меня есть неэффективная реализация следующим образом:

allfit1 = ConstantArray[0,16];
For[i = 1, i <= 16, i++, (
allfit1[[i]] = Check[
                    {0, NMinimize[f[x,data[[i]]], x]}, 
                    {1, NMinimize[f[x,data[[i]]], x]}
                    ] 
)]

Как вы видите, я должен выполнить NMinimize дважды, что расточительно и отнимает много времени.

Есть ли способ лучше?

2 ответа

Решение

Как незначительное изменение: вы можете сохранить результат в переменной:

Block[{res}, 
      Check[{0, res = NMinimize[...]}, {1, res}]
]

Вы могли бы сделать

Table[Reap@Quiet@Check[Sow@NMinimize[f[x, d], x]; 1, 0]~
  Extract~{{1}, {2, 1, 1}}, {d, data}]
Другие вопросы по тегам