2012-04-01 2 views
0

Я отлаживаю процедуру оптимизации. Я создаю текстовый файл журнала, где я отслеживаю целевое значение функции на каждой итерации в подпрограмме оптимизации.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.

+0

Что именно вы имеете в виду «успешно оценены»? Вы уверены, что ни переполнение, ни деление на ноль не произошло? – celtschk

+0

Управление памятью вызывает сомнения. Ваш итерационный алгоритм расходится. Попробуйте и отследите первый расчет, который производит INF. – Potatoswatter

+1

Используйте отладчик (или добавьте инструкции печати) для отслеживания точной строки кода, которая вызывает ошибку. –

ответ

2

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

+0

Спасибо. Однако используемый вектор X одинаковый при каждом вычислении с самого начала ... так что если там какая-либо борьба с любым операндом в полиноме, это было бы с самого начала.Только переменные являются параметрами, которые являются мультипликативными константами в формуле ... – octoback

+0

Ну, тогда переместите проверки на код, который генерирует значения параметров. Ваш фрагмент слишком короткий, чтобы дать точный ответ. –

+0

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

Смежные вопросы