Примеры неустойчивости алгоритмов

Пример 1.4. Вычисление экспоненты с помощью ряда Маклорена:

Примеры неустойчивости алгоритмов - student2.ru . (1.1)

Как известно, этот ряд сходится на всей числовой оси, однако, при использовании реальных систем представления чисел могут возникнуть ошибки. Рассмотрим вычисления в десятичной системе с длиной мантиссы t=4. Система с усечением: остальные разряды просто отбрасываются.

Найдем Примеры неустойчивости алгоритмов - student2.ru . Суммирование закончим, как только абсолютная величина очередного слагаемого станет меньше, чем 0.0001 от суммы ряда. Дальнейшее суммирование бессмысленно. В данном случае в сумме оказывается 25 слагаемых. Выпишем несколько слагаемых:

Примеры неустойчивости алгоритмов - student2.ru

Истинное значение Примеры неустойчивости алгоритмов - student2.ru равно 0.004128. Имеем катастрофическую потерю верных знаков! Ошибка связана с тем, что наибольшие слагаемые по абсолютной величине на несколько порядков больше конечной суммы. Погрешность округления для этих слагаемых сравнима с окончательным результатом. К тому же ряд является знакопеременным. При вычитании чисел возрастает относительная ошибка. Например, алгебраическая сумма двух наибольших слагаемых ряда равна Примеры неустойчивости алгоритмов - student2.ru . Полагаем, что абсолютная погрешность равна примерно половине отброшенного разряда. Следовательно, относительная погрешность для вычитаемых чисел имеет порядок Примеры неустойчивости алгоритмов - student2.ru , а для разности эта погрешность на порядок выше (учитывая, что при вычитании абсолютные погрешности могут как вычитаться, так и складываться).

Если слегка изменить значение x, получим вообще парадоксальный результат: значение экспоненты Примеры неустойчивости алгоритмов - student2.ru равно 0.004087, в то время как сумма ряда в нашей системе оказывается отрицательной Примеры неустойчивости алгоритмов - student2.ru .

Видим, что алгоритм непосредственного суммирования ряда (1.1) в нашей системе оказывается неустойчивым. Однако алгоритм может быть легко улучшен. Чтобы избежать потери точности при вычитании, вычислим Примеры неустойчивости алгоритмов - student2.ru и найдем обратную величину Примеры неустойчивости алгоритмов - student2.ru . В этом случае вычисления с помощью ряда Маклорена дают неплохой результат:

Примеры неустойчивости алгоритмов - student2.ru .

Пример Уилкинсона

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

Пример 1.5.

Введем многочлен двадцатой степени:

Примеры неустойчивости алгоритмов - student2.ru .

Корнями многочлена Примеры неустойчивости алгоритмов - student2.ru , естественно, являются натуральные числа от 1 до 20.

Введем небольшое изменение в многочлен Примеры неустойчивости алгоритмов - student2.ru : изменим слегка коэффициент при Примеры неустойчивости алгоритмов - student2.ru . Пусть новый многочлен равен Примеры неустойчивости алгоритмов - student2.ru . Корни многочлена Примеры неустойчивости алгоритмов - student2.ru , вычисленные с помощью пакета Mathematica, приведены в таблице.

Корни многочлена Примеры неустойчивости алгоритмов - student2.ru

1. 6.00 Примеры неустойчивости алгоритмов - student2.ru Примеры неустойчивости алгоритмов - student2.ru
2. 7.00 Примеры неустойчивости алгоритмов - student2.ru Примеры неустойчивости алгоритмов - student2.ru
3. 7.99 Примеры неустойчивости алгоритмов - student2.ru Примеры неустойчивости алгоритмов - student2.ru
4. 9.11 Примеры неустойчивости алгоритмов - student2.ru Примеры неустойчивости алгоритмов - student2.ru
5. 9.57 Примеры неустойчивости алгоритмов - student2.ru Примеры неустойчивости алгоритмов - student2.ru

Видим, что незначительное изменение одного из коэффициентов многочлена привело к появлению комплексных корней. Исследуем причину этого явления. Обозначим коэффициент многочлена при Примеры неустойчивости алгоритмов - student2.ru буквой Примеры неустойчивости алгоритмов - student2.ru и найдем зависимость корней многочлена от этого коэффициента. Для этого будем рассматривать наш многочлен как функцию двух аргументов Примеры неустойчивости алгоритмов - student2.ru . Продифференцируем по Примеры неустойчивости алгоритмов - student2.ru уравнение Примеры неустойчивости алгоритмов - student2.ru , полагая Примеры неустойчивости алгоритмов - student2.ru функцией Примеры неустойчивости алгоритмов - student2.ru :

Примеры неустойчивости алгоритмов - student2.ru .

Найдем отсюда производную Примеры неустойчивости алгоритмов - student2.ru :

Примеры неустойчивости алгоритмов - student2.ru .

При x = k эта производная равна

Примеры неустойчивости алгоритмов - student2.ru .

Результаты расчетов по этой формуле представлены в таблице.

Значения производной Примеры неустойчивости алгоритмов - student2.ru

k Значение производной k Значение производной k Значение производной k Значение производной
Примеры неустойчивости алгоритмов - student2.ru Примеры неустойчивости алгоритмов - student2.ru Примеры неустойчивости алгоритмов - student2.ru Примеры неустойчивости алгоритмов - student2.ru
Примеры неустойчивости алгоритмов - student2.ru Примеры неустойчивости алгоритмов - student2.ru Примеры неустойчивости алгоритмов - student2.ru Примеры неустойчивости алгоритмов - student2.ru
Примеры неустойчивости алгоритмов - student2.ru Примеры неустойчивости алгоритмов - student2.ru Примеры неустойчивости алгоритмов - student2.ru Примеры неустойчивости алгоритмов - student2.ru
Примеры неустойчивости алгоритмов - student2.ru Примеры неустойчивости алгоритмов - student2.ru Примеры неустойчивости алгоритмов - student2.ru Примеры неустойчивости алгоритмов - student2.ru
Примеры неустойчивости алгоритмов - student2.ru Примеры неустойчивости алгоритмов - student2.ru Примеры неустойчивости алгоритмов - student2.ru Примеры неустойчивости алгоритмов - student2.ru

Видим, что имеет место резкая зависимость корней многочлена от значения коэффициента при x19.

Пример 1.6.

Рассмотрим более простой пример. Будем искать корни многочлена четвертой степени, используя средства пакета Mathematica.. Сохраним нотацию пакета Mathematica. Входные выражения (In[ ] :=) содержат команды, выходные – (Out[ ] =) включают результаты вычислений.

Определим многочлен четвертой степени:

In[ ] := P[x_] = Expand[ Product[(x-k), {k, 4}] ]Out[ ] = Примеры неустойчивости алгоритмов - student2.ru

Слегка изменим коэффициент при x3 и найдем корни полученного многочлена с помощью функции Solve:

In[ ] := Solve[ P[x] + 0.03 x^3 == 0 ]

Out[ ] = Примеры неустойчивости алгоритмов - student2.ru

Примеры неустойчивости алгоритмов - student2.ru Отметим, что корни многочлена P[x] – натуральные числа от 1 до 4; относительно небольшое изменение коэффициента при x3 (на 0,3%) приводит к появлению комплексных корней. Следовательно, решение уравнения четвертой степени также является неустойчивой задачей.

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

Вопросы для повторения

1. Почему могут возникнуть погрешности при переводе числа из одной системы счисления в другую?

2. Какими параметрами характеризуется представление чисел в системах с плавающей запятой?

3. Что называется абсолютной и относительной погрешностью приближенного значения числа?

4. Какое требование предъявляется к оценкам погрешности приближенного значения числа?

5. Что называется машинным эпсилоном? Что характеризует машинный эпсилон?

6. Какой величиной оценивается абсолютная погрешность дифференцируемой функции Примеры неустойчивости алгоритмов - student2.ru , вызываемая достаточно малой погрешностью аргумента Примеры неустойчивости алгоритмов - student2.ru ?

7. Какой величиной оценивается абсолютная погрешность дифференцируемой функции Примеры неустойчивости алгоритмов - student2.ru , вызываемая достаточно малыми погрешностями Примеры неустойчивости алгоритмов - student2.ru аргументов?

8. Как оценивается абсолютная погрешность алгебраической суммы нескольких приближенных чисел?

9. Почему относительная погрешность разности двух чисел одного знака больше относительной погрешности этих чисел?

10. Какие алгоритмы называются неустойчивыми? Почему такие алгоритмы непригодны для вычислений?

Наши рекомендации