Как обработать случай, когда заданная точность не может быть достигнута?
К примеру есть такая конструкция :
do {
. . .
} while (fabs(x1 - x) >= eps);
eps задаю с клавиатуры. Но в результате тестирования оказалось, что не во всех случаях может быть достигнута заданная точность и программа просто не выдает результата. Как предусмотреть эту ситуацию?С помощью if-а? С помощью исключений?Если это возможно, то как это можно реализовать? Чтобы выводилось соответствующее сообщение и осуществлялся выход из программы.
Ответы (1 шт):
Обычно ставится банальное ограничение на количество итераций. Написать можно по разному, я предпочитаю
constexpr std::size_t IterMax= 9999;
for(std::size_t i = 0; std::abs(x1 - x) >= eps; ++i){
if(i == IterMax){
break; // or throw
}
...
}
Но тут возникает вопрос, что вообще означает невозможность достижения требуемой точности. Часто это ошибка в алгоритме, или данные, не удовлетворяющие условию сходимости.
Но может быть и такое, что eps фактически должна зависеть от данных, и вычислить ее заранее невозможно. Тогда можно попробовать использовать относительную ошибку, вроде abs(x1 - x) / max(abs(x1), abs(x)) > 0.1.
Или же можно проверять производную ошибки, тогда расчет заканчивается, когда ошибка перестала уменьшаться: abs(abs(x1 - x) - prevEps) >= dEps . Ну или аналогично можно проверять производную относительной ошибки.
Это все не отменяет необходимости подсчета итераций, иначе сложные модели не отладить.