ЛЕКЦИЯ 1 ПОГРЕШНОСТЬ ВЫЧИСЛЕНИЙ В наши дни, ни один крупный технический проект не обходится без различных расчетов и вычислений, начиная с очень простых алгебраических моделей, заканчивая сложнейшими научными расчетами, созданием алгоритмов, методов решения и т. д. В любом случае, необходимо знать на сколько полученный результат будет правильным. Пусть 𝑎 — истинное значение некоторой величины, 𝑎∗ — ее приближенное значение. Определение 1: Абсолютная погрешность величины 𝑎∗ называется наименьшее значение Δ(𝑎∗ ), про которое известно, что |𝑎∗ − 𝑎| ⩽ Δ(𝑎∗ ). Определение 2: Относительная погрешность величины 𝑎∗ называется наименьшее значение 𝛿(𝑎∗ ), про которое известно, что ∣ 𝑎∗ − 𝑎 ∣ ⩽ 𝛿(𝑎∗ ). 𝑎∗ Рассмотрим основные источники происхождения ошибок в вычислительной математике. 1. Неопределенность входных данных Во многих задачах входными данными могут являться величины, значения которых были получены в ходе эксперимента. Однако, ни одну величину невозможно измерить абсолютно точно, всегда есть некоторый доверительный интервал, в котором лежит правильный результат. Пример 1 𝑥∗ — полученное значение, 𝑦∗ ≈ 𝑓(𝑥∗ ) — значение функции. 𝑥 − 𝜀 ⩽ 𝑥∗ ⩽ 𝑥 + 𝜀, 𝑦 − 𝛿 ⩽ 𝑦∗ ⩽ 𝑦 + 𝛿. Рассмотрим с какой точность можно определить значение функции. Пусть 𝑓(𝑥) = sin 𝑥. ! Конспект не проходил проф. редактуру, создан студентами и, возможно, содержит смысловые ошибки. Следите за обновлениями на lectoriy.mipt.ru. 2 Рис. 1.1 Очевидно, что |𝑦∗ − 𝑦| ⩽ |𝑏 − 𝑎|. В данном примере такая оценка не самая лучшая. Можно выбрать 𝑏+𝑎 ∗ 𝑦опт = . 2 Тогда |𝑏 − 𝑎| ∗ |𝑦опт − 𝑦| ⩽ . 2 Однако и такой выбор оптимального значения не всегда является наилучшим. ∗ 2. Погрешность метода Второй источник ошибок в вычислительной математике связан с погрешностью метода. Попробуем вычислить значение функции 𝑦 = 𝑓(𝑥), где 𝑓(𝑥) = sin 𝑥. Для этого разложим ее в ряд Тейлора. 𝑥3 𝑥5 𝑦 =𝑥− + +… 3! 5! С точки зрения вычислительной математики, в реальных вычислениях приходится ограничиваться конечным числом членов. В зависимости от того, сколько членов будет учтено, будет меняться погрешность метода. 𝑦1∗ = 𝑥 + 𝑜(𝑥3 ), 𝑦2∗ = 𝑥 − 𝑦3∗ = 𝑥 − 𝑥3 + 𝑜(𝑥5 ), 3! 𝑥3 𝑥5 3 + (𝑥 ) + 𝑜(𝑥7 ). 3! 5! Первый метод определяет значение функции с точностью до 𝑜(𝑥3 ). Этот метод хорошо описывает погрешность вычисления для небольших 𝑥, но совершенно непременим, когда 𝑥 достаточно большое. В данном примере |𝑦u�∗ − 𝑦| = ! 𝑦(2u�+1) (𝜉) 2u�+1 𝑥 , (2𝑛 + 1)! где 0 < 𝜉 < 𝑥. Для подготовки к экзаменам пользуйтесь учебной литературой. Об обнаруженных неточностях и замечаниях просьба писать на pulsar@ phystech. edu 3 ! Конспект не проходил проф. редактуру, создан студентами и, возможно, содержит смысловые ошибки. Следите за обновлениями на lectoriy.mipt.ru. 3. Погрешность округления Третий источник ошибок — это погрешность округления чисел. Вспомним представление машинных чисел. В современных компьютерах реализован стандарт IEEE арифметики. В IEEE арифметике действительные числа делятся на два класса: числа с одинарной точностью, для записи которых используются 32 бита (8 байт) и числа с двойной точностью, для записи которых используются 64 бита (16 байт). Числа с одинарной точностью записываются следующим образом. Знак 1 Степень 8 Мантисса 23 Один бит отводится под знак числа 𝑠, 8 бит под степень числа 𝑒 и 23 бита под мантиссу числа 𝑓. Такие числа называются числами с плавающей запятой. Они представимы в следующем виде: (−1)u� 2u�−127 (1 + 𝑓). Это означает, что все числа на числовой оси расположены неравномерно и между каждой последовательной степенью двойки находится одно и то же количество модельных чисел. С таким представлением чисел связаны следующие важные константы вычислительной математики. 𝜀маш — машинная погрешность или погрешность округления. Определение 3: 𝜀маш — наибольшая величина, для которой справедливо тождество 1 + 𝜀маш = 1. Исходя из представления числа видно, что 𝜀маш равна половине последнего разряда. 𝜀маш = 2−24 ≈ 10−8 . ♣ Определение 4: OFL — Over Flow Limit (порог переполнения) максимальное число, которое может быть записано в арифметику. 𝑂𝐹 𝐿 = 2256−127 (1 + 1) ≈ 1038 . ♣ Определение 5: UFL — Under Flow Limit (порог машинного нуля) минимальное число, которое может быть записано в арифметику. 𝑈 𝐹 𝐿 = 2−127 ≈ 10−38 . ♣ Кроме нормализованных чисел в IEEE арифметике, где старший разряд равен 1, существуют субнормальные числа, где старший разряд может быть не только 1, но и 0. Они вводятся, для того чтобы правильно округлять результат математических операций, таких как сложение, вычитание, умножение и деление. Однако, может оказаться так, что результат операции над числами может не являться нормализованным числом. Обозначим как ⊙ любую из этих операций +, −, ∗, /. Тогда операция округления 𝑓𝑙(𝑎 ⊙ 𝑏) округляет число до ближайшего числа с плавающей точкой. В этом случае округление считается правильным. Если результат лежит ровно между двумя числами, то операция округления округляет число до ближайшего четного с нулевым последним разрядом. На числа с двойной точностью отводятся 64 бита (16 байт). Распределение между знаком числа, степенью и мантиссой будет следующим. ! Для подготовки к экзаменам пользуйтесь учебной литературой. Об обнаруженных неточностях и замечаниях просьба писать на pulsar@ phystech. edu ! Конспект не проходил проф. редактуру, создан студентами и, возможно, содержит смысловые ошибки. 4 Следите за обновлениями на lectoriy.mipt.ru. Знак 1 Степень 11 Мантисса 52 В этом случае число представимо в следующем виде (−1)u� 2u�−1023 (1 + 𝑓). Для чисел с двойной точностью получим: 𝜀маш = 2−53 ≈ 10−16 , 𝑂𝐹 𝐿 = 22048−1023 ≈ 10308 , 𝑈 𝐹 𝐿 = 2−1023 ≈ 10−308 . В современных больших расчетах вычисления выполняются с двойной точностью. Пример 2 Рассмотрим функцию 𝑦 = 𝑓(𝑥), где u� 𝑓(𝑥) = ∑ 𝑎u� 𝑥u� . u�=0 Для вычисления функции будем использовать схему Горнера. Она хороша тем, что является очень экономичным алгоритмом, при реализации схемы Горнера используется порядка 2𝑛 операций. Зададим схему следующим образом: p=an for k=n−1 to 0 p=px+an end for Пусть 𝑓(𝑥) = (𝑥 − 2)9 = = 𝑥9 − 18𝑥8 + 144𝑥7 − 672𝑥6 + 2016𝑥5 − 4032𝑥4 + 5376𝑥3 − 4608𝑥2 + 2304𝑥 − 512. Рассмотрим график функции. Точками обазначены значения, полученные используя схему Горнера. Рис. 1.2 При вычислении по схеме Горнера в окрестности точки 𝑥 = 2 функция будет принимать значения различных знаков. При таком алгоритме невозможно определить положение нуля функции. Ошибка вызвана тем, что 𝑦 = 𝑓(𝑥) содержит много положительных и отрицательных членов с большой степенью. Тем самым, вычитая и складывая числа порядка 29 , мы пытаемся получить точность порядка 10−15 . Такое вычисление является некорректным. ∗ Пример 3 𝑓(𝑥) = eu� . 𝑥2 𝑥u� +⋯+ +… 2! 𝑛! Для подготовки к экзаменам пользуйтесь учебной литературой. Об обнаруженных неточностях и замечаниях просьба писать на pulsar@ phystech. edu eu� = 1 + 𝑥 + ! 5 Конспект не проходил проф. редактуру, создан студентами и, возможно, содержит смысловые ошибки. Следите за обновлениями на lectoriy.mipt.ru. ! Для вычисления 𝑓(𝑥) будем использовать тот факт, что начиная с некоторого номера, каждый следующий член ряда будет меньше чем ошибка округления. Рассмотрим алгоритм вычисления. SUM=1 TERM=1 I=1 1. TERM=TERM X/I IF (SUM+TERM.EQ.SUM) THEN WRITE (*,*,X, SUM, EXP(X)) STOP ELSE SUM=SUM+TERM GO TO 1 где SUM — сумма ряда, TERM — величина члена ряда. Рассмотрим результат работы программы для чисел с одинаковой точностью. X 1 5 10 15 20 SUM 2,718282 148,4132 22026,47 3269017 4,8516531 ⋅ 108 EXP 2,718282 148,4132 22026,46 3269017 4,8516521 ⋅ 108 X -1 -5 -10 -15 -20 SUM 0,3678794 6,7377836 ⋅ 10−3 −1,6408609 ⋅ 10−4 −2,2377001 ⋅ 10−7 1,202966 ⋅ 10−9 EXP 0,367795 6,7377947 ⋅ 10−3 4,539930 ⋅ 10−4 3,0590232 ⋅ 10−7 2,0611537 ⋅ 10−9 Как можно видеть из приведенных таблиц, при достаточно больших положительных 𝑥 ошибка остается маленькой, однако, при отрицательных значениях переменной функция меняет знак, что приводит к значительным ошибкам. В этом примере основную ошибку дает алгоритм вычисления значения экспоненты при отрицательных 𝑥. Это связано с тем, что для отрицательных значений 𝑥 ряд становится знакочередующимся. Нечетные степени образуют отрицательные величины. Для больших 𝑥 наблюдается такой же эффект, как и в предыдущем примере. Значение экспоненты вычисляется, как сумма двух огромных значений. Так как количество разрядов ограничено, то на содержательное значение функции не остается численных разрядов. Такой алгоритм является неустойчивым, однако, его можно усовершенствовать. Будем вычислять для 𝑥 < 0 значения e−u� , а не eu� , как раньше. Тогда eu� вычислим, как 1 eu� = −u� . e Такой алгоритм будет устойчивым. ∗ Пример 4 Рассмотрим систему уравнений следующего вида { 0,780𝑥 + 0,563𝑦 = 0,217, 0,457𝑥 + 0,330𝑦 = 0,127. Нетрудно убедиться, что точным решением системы уравнений будут значения 𝑥 = 1,000, 𝑦 = 1,000. Если решать систему метод Гаусса с точностью три десятичных знака, то есть с точностью коэффициентов, то будут получены следующие значения 𝑥 = 1,71, 𝑦 = −1,98. ! Для подготовки к экзаменам пользуйтесь учебной литературой. Об обнаруженных неточностях и замечаниях просьба писать на pulsar@ phystech. edu ! Конспект не проходил проф. редактуру, создан студентами и, возможно, содержит смысловые ошибки. Следите за обновлениями на lectoriy.mipt.ru. 6 Подставим полученные значения в систему уравнений. { 0,780(1,71) + 0,563(−1,98) − 0,217 = 0,00206, 0,457(1,71) + 0,330(−1,98) − 0,127 = 0,00167. Заметим, что, не смотря на довольно большие расхождения в значениях 𝑥 и 𝑦, значения невязки оказались малыми. Это пример некорректно поставленной задачи (плохо обусловленной), когда небольшие изменения начальных входных данных приводят к сильным изменениям в ответе. ∗ Погрешность вычисления производной. Во многих задачах математической физики неизвестен точный вид функции, известны только значения функции в некоторых точках, заданные в виде таблицы. В этом случае возникает необходимость вычислить производную по этим значениям. Вычисление производной можно приблизить различными способами. Например, используя разложение функции в трех точках: 𝑓(𝑥), 𝑓(𝑥 + ℎ), 𝑓(𝑥 − ℎ). Используя ряд Тейлора получим 1 𝑓(𝑥 + ℎ) = 𝑓(𝑥) + 𝑓 ′ (𝑥)ℎ + 𝑓 ″ (𝑥)ℎ2 + 𝑜(ℎ3 ), 2 1 𝑓(𝑥 − ℎ) = 𝑓(𝑥) − 𝑓 ′ (𝑥)ℎ + 𝑓 ″ (𝑥)ℎ2 + 𝑜(ℎ3 ). 2 Исходя из этих соотношений, можно получить различные приближенные функции для вычисления производной. 1. Производная вперед ℎ > 0 𝑓 ′ (𝑥) = 𝑓(𝑥 + ℎ) − 𝑓(𝑥) + 𝑜(ℎ). ℎ 2. Производная назад ℎ < 0 𝑓 ′ (𝑥) = 𝑓(𝑥) − 𝑓(𝑥 − ℎ) + 𝑜(ℎ). ℎ 3. Центральная разность 𝑓 ′ (𝑥) = 𝑓(𝑥 + ℎ) − 𝑓(𝑥 − ℎ) + 𝑜(ℎ2 ). 2ℎ Первые две формулы имеют погрешность поядка 𝑜(ℎ), они называются формулами первого порядка аппроксимации. Центральная разность имеет погрешность порядка 𝑜(ℎ2 ), формула второго порядка аппроксимации. Исходя из этих соотношений, можно сделать поспешный вывод, что чем меньше шаг ℎ, тем более точный результат для вычисления производной будет получен. Однако это предположение ошибочно. Рассмотрим на примере формулы дифференцирования вперед. 𝑓(𝑥) − 𝑓(𝑥 − ℎ) 𝑓 ′ (𝑥) = + 𝑜(ℎ). ℎ Для подготовки к экзаменам пользуйтесь учебной литературой. Об обнаруженных неточностях и замечаниях просьба писать на pulsar@ phystech. edu ! 7 ! Конспект не проходил проф. редактуру, создан студентами и, возможно, содержит смысловые ошибки. Следите за обновлениями на lectoriy.mipt.ru. Погрешность метода err состоит из двух ошибок. Из ошибки метода errмет и из ошибки округления errокр . Для данного примера 1 errмет = − 𝑓 ″ (𝜉)ℎ, 2 1 |errмет | ⩽ 𝑀2 ℎ, 2 ″ где 𝑀2 = max |𝑓 (𝜉)|, 𝑥 ⩽ 𝜉 ⩽ 𝑥 + ℎ. При малых ℎ, существенный вклад в ошибку округления дает errокр , связанная с тем, что значения 𝑓(𝑥) и 𝑓(𝑥 + ℎ) заданы с определенно точностью. |errокр | ⩽ 𝑀0 𝜀маш + 𝑀0 𝜀маш , ℎ где 𝑀0 = max |𝑓(𝜉)|, 𝑥 ⩽ 𝜉 ⩽ 𝑥 + ℎ. Рис. 1.3 Так как ошибка представляет собой сумму двух функций возрастающей и убывающей, то существует некоторое минимальное значение ошибки errмин и оптимальный шаг дифференцирования ℎопт , при котором она достигается. Вычислим оптимальный шаг дифференцирования. err = err′ = − 2𝑀0 𝜀маш 1 + 𝑀2 ℎ, ℎ 2 2𝑀0 𝜀маш 1 4𝑀0 𝜀маш + 𝑀2 = 0 ⇒ ℎ2 = , 2 ℎ 2 𝑀2 ℎопт = 2√ 𝑀0 𝜀маш . 𝑀2 Тогда errмин = Пример 5 Пусть 2𝑀0 𝜀маш 2√ u�0u�u�маш 2 + 1 𝑀 𝜀 ⋅ 2√ 0 маш = 2√𝑀0 𝑀2 𝜀маш . 2 𝑀2 𝑓(𝑥) = sin 𝑥. Тогда 𝑀0 = 𝑀2 ≈ 1, ! Для подготовки к экзаменам пользуйтесь учебной литературой. Об обнаруженных неточностях и замечаниях просьба писать на pulsar@ phystech. edu ! Конспект не проходил проф. редактуру, создан студентами и, возможно, содержит смысловые ошибки. Следите за обновлениями на lectoriy.mipt.ru. ℎопт = 4 ⋅ 10−4 , 8 err = 8 ⋅ 10−4 . Пусть теперь 𝑓(𝑥) = sin 100𝑥. 𝑀2 = 104 . 𝑀0 = 1, В этом случае оптимальный шаг уменьшится ℎопт = 4 ⋅ 10−6 , а ошибка увеличится err = 8 ⋅ 10−2 . Заметим, что при увеличении порядка аппроксимации, ℎопт тоже увеличится, а errмин уменьшится. Такие же оценки можно произвести для вычисления с двойной точностью, при 𝜀маш = 10−16 . ∗ Аналогичные формулы можно использовать и для вычисления второй производной. Вторая производная будет вычисляться, как производная от первой производной. 𝑓 ″ (𝑥) ≈ u�(u�+ℎ)−u�(u�) ℎ − ℎ u�(u�)−u�(u�−ℎ) ℎ , 𝑓(𝑥 + ℎ) − 2𝑓(𝑥) + 𝑓(𝑥 − ℎ) . ℎ2 В этом случае погрешность метода 𝑓 ″ (𝑥) ≈ errмет = 1 𝑀 ℎ2 , 12 4 где 𝑀4 = max |𝑓 (4) (𝜉)|, 𝑥 ⩽ 𝜉 ⩽ 𝑥 + ℎ. errокр ⩽ ! 4𝑀0 𝜀маш . ℎ2 Для подготовки к экзаменам пользуйтесь учебной литературой. Об обнаруженных неточностях и замечаниях просьба писать на pulsar@ phystech. edu ЛИТЕРАТУРА [1] Калиткин Н.Н., Альшина Е.А. Численный анализ. — М.: Академия, 2013. [2] Калиткин Н.Н., Корякин П.В. Методы математической физики. — М.: Академия, 2013. [3] Вержбицкий В.М. Численные методы. — М.: Высшая школа, 2000. [4] Лобанов А.И., Петров И.Б. Численные методы. [5] Аристова Е.Н., Завьялова Н.А.,Лобанов А.И. Практические занятия по вычислительной математике: учебное пособие. — М.: МФТИ, 2014.