C ++, очень неожиданный -1 # INF - PullRequest
0 голосов
/ 01 апреля 2012

Я отлаживаю процедуру оптимизации.Я создаю текстовый файл журнала, в котором отслеживаю значение целевой функции на каждой итерации в процедуре оптимизации.

Вот контекст: я работаю с проблемой подбора кривой, с моделью, которая является линейной по четырем параметрам и полиномиальной по данным X

Y = PARAM1*X^3+PARAM2*X^2+PARAM3*X+PARAM4

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

В файле журнала первый шаг оптимизации не вызывает проблем.Оценки функций имеют двойное значение.На каждой итерации вычисляются 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 only f3 - оценка функции приновая точка, и f1 - оценка функции в той же точке, что и f1 в ITERATION N-1.

1 Ответ

2 голосов
/ 01 апреля 2012

Бесконечность распространяется в расчетах. Самые большие шансы на то, что полином выдает -Inf, потому что X уже был -Inf. С наибольшей вероятностью это вызвано вычислением для X, который делится на ноль. Вернитесь назад и добавьте код, который проверяет ноль в делениях.

...