Я отлаживаю процедуру оптимизации. Я создаю текстовый файл журнала, где я отслеживаю целевое значение функции на каждой итерации в подпрограмме оптимизации.C++, очень неожиданно -1 # INF
Вот контекст: Я работаю с фитинга проблемы кривой с моделью, которая является линейной в четыре параметра, и полинома по данным X
Y = PARAM1*X^3+PARAM2*X^2+PARAM3*X+PARAM4
и я бегу оптимизации рутину на unnoised объективной информации созданный из этой модели, чтобы протестировать алгоритм.
В файле журнала первый шаг оптимизации не вызывает проблем. Оценки функций имеют двойное значение. На каждой итерации вычисляются 5 значений функций (и отображаются в файле журнала). Из данной итерации вещи становятся кислыми: одна функция оценивается -1#INF
, хотя объектная функция уже успешно оценена именно в этой точке (!). В следующих итерациях «плохая точка» продолжает оцениваться в -1#INF
, а один за другим указывает также на -1 # INF. Расчет Y в этих точках - это не борьба с формулой и учитывая тот факт, что они были должным образом оценены раньше.
Кроме того, я подозреваю другую причину, такую как управление памятью. У вас есть какие-либо идеи по этому поводу или какие-либо рекомендации для отслеживания проблемы ближе?
Редактировать
Я вижу первое вхождение -1#INF
в лог-файл. Функция оценивается в 5 точках на каждой итерации, но только один из этих 5 пунктов является «новой точкой». Когда появляется -1#INF
, функция уже была успешно оценена в этот момент.
Похоже
ITERATION N-1
f1 559.011
f2 560.034
f3 562.034
f4 560.342
f5 560.344
ITERATION N
f1 -1#INF
f2 560.034
f3 558.034
f4 560.342
f5 560.344
где в ITERATION N
только f3
является оценка функции в новой точке, а f1 является оценка функции в той же точке, чем f1 в ITERATION N-1
.
Что именно вы имеете в виду «успешно оценены»? Вы уверены, что ни переполнение, ни деление на ноль не произошло? – celtschk
Управление памятью вызывает сомнения. Ваш итерационный алгоритм расходится. Попробуйте и отследите первый расчет, который производит INF. – Potatoswatter
Используйте отладчик (или добавьте инструкции печати) для отслеживания точной строки кода, которая вызывает ошибку. –