Что такое вычислительная математика
- Исходный вариант статьи (И. Б. Петров, Что такое вычислительная математика?) опубликован в журнале «Потенциал».
Аннотация
правитьВ статье рассказывается о том, что это за наука — вычислительная математика, с помощью которой решаются задачи физики, которая проникла в химию, биологию, экономику, медицину, социологию и другие науки. Оказывается, что эта наука использует как математику, так и информатику, а иногда и знания рассматриваемой предметной области. Подходы и методы вычислительной математики своеобразны и красивы, а сама эта наука давно уже стала самостоятельной дисциплиной, изучаемой во всех университетах мира.
Введение
правитьНа первый взгляд кажется, что вычислительная математика — это та же математика, только с вычислениями конкретных величин в формулах. Иногда приходится слышать иную позицию: «Вычислительная математика? Это, кажется, что-то от информатики?» Однако и первая, и вторая точка зрения верны лишь отчасти. Да, у вычислительной математики много общего с математическими дисциплинами; порой говорят о том, что это одна из математических дисциплин.
Вычислительная математика — это наука о методах решения вычислительных задач на компьютере. Она появилась от необходимости решать практические задачи, такие, как управление сложными технологическими процессами, управление полётом ракет, моделирование физических процессов (процесса ядерного распада, химических реакций, роста кристаллов и др.), а не только создание всё более реалистичных и ярких компьютерных игрушек, как ныне думают многие школьники.
Задачами вычислительной математики занимались такие выдающиеся учёные, как Эйлер, Лагранж, Чебышёв, Якоби, Лежандр, фон Нейман и многие другие. Они, часто занимаясь сложными вычислениями вручную на бумаге, невольно заложили основы науки об эффективных безошибочных вычислениях на компьютерах.
Всем известно, что компьютеры имеют дело с числами с ограниченным количеством знаков после запятой[1]. Казалось бы, какая мелочь! Однако именно эти «мелочи» могут сильно исказить результаты численных расчётов. Появился важнейший раздел вычислительной математики — теория устойчивости вычислительных методов, то есть таких методов, которые позволяют на компьютере с «неточной» арифметикой получать точные (правдивые) результаты.
Как вычислительная математика решает прикладные задачи
правитьВо многих прикладных задачах искомым результатом является не одно число, а целая функция на отрезке. А как описать произвольную функцию на компьютере? Самый простой способ — это хранить значения функции в нескольких точках и «в уме» соединять их гладкой кривой. Таким образом, отрезок может рассматриваться как система нескольких выбранных точек , а непрерывная функция — как набор значений функции в этих точках. Очень важный объект — производная функции в точке — характеризует угол наклона прямой, касающейся графика функции. Вместо него приходится использовать отношение , где и ближайшие к выбранные точки. При решении задач на компьютерах приходится приближать не только числа, но и сами задачи несколько «округлять» и вместо идеальных непрерывных объектов рассматривать их дискретные приближения. Этот вынужденный шаг называется аппроксимацией задачи.
Как узнать, насколько адекватные результаты даёт компьютерная модель, которую вы построили, или, как принято говорить у вычислительных математиков, имеется ли сходимость решения модели к решению исходной «непрерывной» задачи? Кроме ряда сложных и красивых теорем, есть несколько простых хитростей, которые позволяют определить адекватность вашей модели:
- Точность вычислений. В машинных вычислениях всегда присутствует машинная погрешность, о чём уже упоминалось. И прежде чем верить результатам, полученным на компьютере, попробуйте увеличить точность всех расчетов на пару разрядов. Если это изменит результат в предыдущих знаках, значит, вычисления проводились с недостаточной точностью и нужно использовать более точные типы для представления чисел (например, в языке Си float заменить на double, а в языке Паскаль тип real заменить на extended).
- Обусловленность. В вычислительной практике большое значение имеет чувствительность решения к малым изменениям входных данных. Задача называется плохо обусловленной, если малые изменения входных данных приводят к заметным изменениям решения. Измерить эту обусловленность на практике очень просто. Нужно просто попробовать чуть-чуть поменять входные данные и посмотреть, как меняется результат. Собственно, нужно выяснить, с какой погрешностью заданы входные данные, и экспериментально проверить в каких пределах меняется результат при варьировании входных данных в пределах их погрешности.
- Зависимость от алгоритма и модели. Есть ещё один источник неадекватности численных результатов, полученных на компьютере. Это неточность выбранной модели и алгоритма вычисления. Здесь всё несколько сложнее, нежели в предыдущих пунктах. Но для богатых заказчиков можно предложить надёжное решение — следует дать одну и ту же задачу нескольким группам прикладных математиков. Они, скорее всего, построят разные модели и будут пользоваться разными алгоритмами. Если все выдадут один и тот же результат, значит задача хорошая — она устойчива к выбору модели и алгоритма, и не так важно каким способом её решать. Конечно, бывают и такие случаи, когда все делают одну и ту же ошибку. У начинающих вычислительных математиков есть несколько таких излюбленных ошибок.
Разумеется, если есть возможность сравнить результаты расчета с экспериментальными, то такие сравнения являются поводом для подтверждения верности расчетов. Что же касается исследования численных методов на аппроксимацию — то эта теория достаточно хорошо разработана, однако без вычислительных ошибок численных решений не бывает. Вопрос заключается в том, значительны ли они или незначительны, что, впрочем, также можно оценить.
Приведём некоторые примеры, демонстрирующие что «шутки с погрешностью плохи».
Пример 1: корни многочлена
правитьЕсть множество программ, позволяющие численно вычислять корни многочленов. Давайте рассмотрим уравнение
Это уравнение просто решить аналитически: ,
Предположим, что мы проводим вычисления на компьютере, имеющем точность . В этом случае последнее слагаемое в уравнение будет округлено до 16.0, и с позиции компьютера будет решаться уравнение , у которого один корень 2. Таким образом, малые погрешности в задании числа порядка привели к появлению погрешностей в определении корней уравнения порядка . Более того, вместо двух действительных и двух комплексных корней у нас получился лишь один действительный. Такие плохо обусловленные многочлены не редкость. Например, если в многочлене
коэффициент при изменить на малую величину порядка , то вместо максимального корня получим корень
Пример 2: cистема уравнений
правитьДругой пример плохо обусловленной задачи — это система двух линейных уравнений:
Решением является пара чисел
«Возмутим» правую часть первого уравнения на 0,01 (вместо 11 напишем 11,01) и получим новую, «возмущенную» систему, решением которой является пара чисел {11,01; 0,00}, не имеющая ничего общего с решением невозмущенной системы. Здесь изменение значения одного параметра на привело к совсем другому решению.
Пример 3: вычисление sin x
правитьВ математическом анализе показывается, что функция может быть представлена в виде ряда , причём этот ряд будет сходиться к значению при любых значениях x. После вычисления значения нашей функции при ( ) с четырьмя значащими цифрами и с учётом лишь членов ряда, больших , получим значение с той же точностью:
Теперь положим, что ( ). Если мы проведём вычисления с восемью значащими цифрами с учётом членов ряда, больших , то получим ошеломляющий результат;
Впрочем, в данном случае выход из положения достаточно прост — необходимо использовать формулы приведения: . А что делать, если нам необходимо вычислить экспоненту, представленную в виде ряда ? Очевидно, что нас и в этом случае ждут подобные сюрпризы. Однако и здесь существует выход: будем вычислять экспоненту с отрицательным показателем , а затем вычислим обратную величину: . Дело в том, что вычисляется как сумма знакопеременного ряда. После того, когда каждое следующее слагаемое в этой сумме станет меньше, чем предыдущее, по модулю, мы будем чётко представлять верхнюю и нижнюю оценку вычисляемого значения и будем знать, на каком слагаемом следует оборвать суммируемый ряд.
Пример 4: корень из двойки
правитьМы говорили о том, что на результат вычисления может оказать влияние выбор алгоритма решения задачи. Действительно, пусть нам нужно вычислить значение выражения После избавления от иррациональности в знаменателе, получим: или или Эти три формулы и будут нашими тремя алгоритмами вычисления числа A. Выберем два разных приближения корня из двойки. и
Проведём вычисления A по трём формулам для двух приближенных значений . Результаты вычислений представим в виде таблицы:
1-й способ | 7/5 | 0,004096 | 0,008000 | 1 |
2-й способ | 17/12 | 0,005233 | 0,004630 | -0,1(6) |
Видно, что первый «алгоритм» является более устойчивым к погрешностям входных данных.
Задачи для самостоятельного решения
правитьЧитателю предлагается добраться до компьютера и компилятора какого-нибудь языка программирования (Си или Pascal) и провести несколько незатейливых численных экспериментов.
Задача 1 (частичная сумма гармонического ряда).
правитьНапишите программу, которая суммирует первые миллион слагаемых гармонического ряда сначала с первого по последний элемент, а потом наоборот — с последнего по первый: . Убедитесь, что ассоциативный закон « » при вычислении на компьютере с конечной точностью не выполняется, что может привести к довольно сильному расхождению между результатом вычислений и реальным значением выражения.
Задача 2 («страшный» предел).
правитьНайдите с помощью компьютера значение выражения
при x, равном 1, 1/2, 1/4, 1/8, 1/10, 1/100, … (x измеряется в радианах). Как вы думаете, к чему это выражение на самом деле стремится по мере того, как x стремится к 0? дайте решение пожалуйста.
Задача 3 («башня» из степеней).
правитьРассмотрим функцию . Эта функция представляет собой бесконечную башню степеней. При некоторых такая бесконечная конструкция имеет смысл. Видно, что . Это значит, что при имеем и . Из этого можно ошибочно вывести, что при имеем . Это не так. Убедитесь в этом сами. Мы предлагаем вам изучить функцию , приблизив её «башней» степеней конечной высоты. А именно, рассмотрите и запрограммируйте рекурсивную функцию , . Напишите программу (или используйте GnuPlot, Mathematica, Maple или другие подобные инструменты), которая рисует график четырёх функций , , , на интервале (0;3). Из вида этих графиков сделайте выводы. При каких определена функция , то есть при каких значения при увеличении становятся все ближе и ближе друг к другу и к некоторому фиксированному числу? Когда числа из последовательности приближаются к некоторому числу , то говорят, что последовательность имеет предел и пишут при .
Уточним это понятие: какое бы маленькое положительное число мы ни выбрали, всегда найдется такой элемент последовательности , что он сам и все элементы последовательности после него оказываются удалены от числа A не более чем на
Последний вопрос нашей задачи можно переформулировать так: при каких значениях у последовательности есть предел, то есть существует некоторое число , зависящее от , к которому стремится последовательность ?
Примечания
править- ^ Это не совсем так. Есть системы символических вычислений, такие как Mathematica и MathCad, которые рассматривают рациональные числа, и числа вроде , с любой точностью. В последнем случае это означает, что система может по мере необходимости вычислить любое число знаков после запятой.