
- •Глава 1 Погрешности вычислений
- •1.1. Перевод чисел из одной системы счисления в другую
- •1.2. Представление чисел в системах с плавающей запятой
- •1.3. Оценки погрешности
- •1.4. Машинный эпсилон
- •1.5. Погрешности вычисления значений функций
- •1.6. Примеры неустойчивости алгоритмов
- •1.7. Пример Уилкинсона
- •Корни многочлена
- •Значения производной
1.6. Примеры неустойчивости алгоритмов
Пример 1.4. Вычисление экспоненты с помощью ряда Маклорена:
.
(1.1)
Как известно, этот ряд сходится на всей числовой оси, однако, при использовании реальных систем представления чисел могут возникнуть ошибки. Рассмотрим вычисления в десятичной системе с длиной мантиссы t=4. Система с усечением: остальные разряды просто отбрасываются.
Найдем
.
Суммирование закончим, как только
абсолютная величина очередного слагаемого
станет меньше, чем 0.0001 от суммы ряда.
Дальнейшее суммирование бессмысленно.
В данном случае в сумме оказывается 25
слагаемых. Выпишем несколько слагаемых:
Истинное значение
равно 0.004128. Имеем катастрофическую
потерю верных знаков! Ошибка связана с
тем, что наибольшие слагаемые по
абсолютной величине на несколько
порядков больше конечной суммы.
Погрешность округления для этих
слагаемых сравнима с окончательным
результатом. К тому же ряд является
знакопеременным. При вычитании чисел
возрастает относительная ошибка.
Например, алгебраическая сумма двух
наибольших слагаемых ряда равна
.
Полагаем, что абсолютная погрешность
равна примерно половине отброшенного
разряда. Следовательно, относительная
погрешность для вычитаемых чисел имеет
порядок
,
а для разности эта погрешность на порядок
выше (учитывая, что при вычитании
абсолютные погрешности могут как
вычитаться, так и складываться).
Если слегка
изменить значение x,
получим вообще парадоксальный результат:
значение экспоненты
равно 0.004087, в то время как сумма ряда в
нашей системе оказывается отрицательной
.
Видим, что алгоритм
непосредственного суммирования ряда
(1.1) в нашей системе оказывается
неустойчивым. Однако алгоритм может
быть легко улучшен. Чтобы избежать
потери точности при вычитании, вычислим
и
найдем обратную величину
.
В этом случае вычисления с помощью ряда
Маклорена дают неплохой результат:
.
1.7. Пример Уилкинсона
Пример Уилкинсона – это пример неустойчивой задачи, в которой незначительное изменение входных параметров приводит к принципиальному изменению решения.
Пример 1.5.
Введем многочлен двадцатой степени:
.
Корнями
многочлена
,
естественно, являются натуральные числа
от 1 до 20.
Введем
небольшое изменение в многочлен
:
изменим слегка коэффициент при
.
Пусть новый многочлен равен
.
Корни многочлена
,
вычисленные с помощью пакета Mathematica,
приведены в таблице.
Корни многочлена
-
1.
6.00
2.
7.00
3.
7.99
4.
9.11
5.
9.57
Видим,
что незначительное изменение одного
из коэффициентов многочлена привело к
появлению комплексных корней. Исследуем
причину этого явления. Обозначим
коэффициент многочлена при
буквой
и найдем зависимость корней многочлена
от этого коэффициента. Для этого будем
рассматривать наш многочлен как функцию
двух аргументов
.
Продифференцируем по
уравнение
,
полагая
функцией
:
.
Найдем
отсюда производную
:
.
При x = k эта производная равна
.
Результаты расчетов по этой формуле представлены в таблице.