Что такое вычислительная математика
Опубликовано: 02.10.2018
Исходный вариант статьи (И. Б. Петров, Что такое вычислительная математика?) опубликован в журнале «Потенциал» .В статье рассказывается о том, что это за наука — вычислительная математика, с помощью которой решаются задачи физики, которая проникла в химию, биологию, экономику, медицину, социологию и другие науки. Оказывается, что эта наука использует как математику , так и информатику , а иногда и знания рассматриваемой предметной области. Подходы и методы вычислительной математики своеобразны и красивы, а сама эта наука давно уже стала самостоятельной дисциплиной, изучаемой во всех университетах мира.
На первый взгляд кажется, что вычислительная математика — это та же математика, только с вычислениями конкретных величин в формулах. Иногда приходится слышать иную позицию: «Вычислительная математика? Это, кажется, что-то от информатики?» Однако и первая, и вторая точка зрения верны лишь отчасти. Да, у вычислительной математики много общего с математическими дисциплинами; порой говорят о том, что это одна из математических дисциплин.
Вычислительная математика — это наука о методах решения вычислительных задач на компьютере. Она появилась от необходимости решать практические задачи, такие, как управление сложными технологическими процессами, управление полётом ракет , моделирование физических процессов (процесса ядерного распада , химических реакций , роста кристаллов и др.), а не только создание всё более реалистичных и ярких компьютерных игрушек, как ныне думают многие школьники.
Задачами вычислительной математики занимались такие выдающиеся учёные, как Эйлер , Лагранж , Чебышёв , Якоби , Лежандр , фон Нейман и многие другие. Они, часто занимаясь сложными вычислениями вручную на бумаге, невольно заложили основы науки об эффективных безошибочных вычислениях на компьютерах.Всем известно, что компьютеры имеют дело с числами с ограниченным количеством знаков после запятой [1] . Казалось бы, какая мелочь! Однако именно эти «мелочи» могут сильно исказить результаты численных расчётов. Появился важнейший раздел вычислительной математики — теория устойчивости вычислительных методов , то есть таких методов, которые позволяют на компьютере с «неточной» арифметикой получать точные (правдивые) результаты.
Как вычислительная математика решает прикладные задачи [ править ]
Во многих прикладных задачах искомым результатом является не одно число, а целая функция на отрезке. А как описать произвольную функцию на компьютере? Самый простой способ — это хранить значения функции в нескольких точках и «в уме» соединять их гладкой кривой. Таким образом, отрезок может рассматриваться как система нескольких выбранных точек
{
x
k
}
k
=
0
K
{\displaystyle \left\{{x_{k}}\right\}_{k=0}^{K}\,\!}
, а непрерывная функция — как набор
{
f
k
}
k
=
0
K
{\displaystyle \left\{{f_{k}}\right\}_{k=0}^{K}\,\!}
значений функции в этих точках. Очень важный объект
f
′
(
x
)
{\displaystyle f'(x)\,\!}
— производная функции в точке
x
{\displaystyle x}
— характеризует угол наклона прямой, касающейся графика функции. Вместо него приходится использовать отношение
f
k
+
1
−
f
k
x
k
+
1
−
x
k
{\displaystyle {{f_{k+1}-f_{k}} \over {x_{k+1}-x_{k}}}\,\!}
, где
x
k
{\displaystyle x_{k}\,\!}
и
x
k
+
1
{\displaystyle x_{k+1}\,\!}
ближайшие к
x
{\displaystyle x\,\!}
выбранные точки. При решении задач на компьютерах приходится приближать не только числа, но и сами задачи несколько «округлять» и вместо идеальных непрерывных объектов рассматривать их дискретные приближения. Этот вынужденный шаг называется аппроксимацией задачи .
Как узнать, насколько адекватные результаты даёт компьютерная модель, которую вы построили, или, как принято говорить у вычислительных математиков, имеется ли сходимость решения модели к решению исходной «непрерывной» задачи? Кроме ряда сложных и красивых теорем, есть несколько простых хитростей, которые позволяют определить адекватность вашей модели:
Точность вычислений . В машинных вычислениях всегда присутствует машинная погрешность, о чём уже упоминалось. И прежде чем верить результатам, полученным на компьютере, попробуйте увеличить точность всех расчетов на пару разрядов. Если это изменит результат в предыдущих знаках, значит, вычисления проводились с недостаточной точностью и нужно использовать более точные типы для представления чисел (например, в языке Си float заменить на double, а в языке Паскаль тип real заменить на extended). Обусловленность . В вычислительной практике большое значение имеет чувствительность решения к малым изменениям входных данных. Задача называется плохо обусловленной, если малые изменения входных данных приводят к заметным изменениям решения. Измерить эту обусловленность на практике очень просто. Нужно просто попробовать чуть-чуть поменять входные данные и посмотреть, как меняется результат. Собственно, нужно выяснить, с какой погрешностью заданы входные данные, и экспериментально проверить в каких пределах меняется результат при варьировании входных данных в пределах их погрешности. Зависимость от алгоритма и модели . Есть ещё один источник неадекватности численных результатов, полученных на компьютере. Это неточность выбранной модели и алгоритма вычисления. Здесь всё несколько сложнее, нежели в предыдущих пунктах. Но для богатых заказчиков можно предложить надёжное решение — следует дать одну и ту же задачу нескольким группам прикладных математиков. Они, скорее всего, построят разные модели и будут пользоваться разными алгоритмами. Если все выдадут один и тот же результат, значит задача хорошая — она устойчива к выбору модели и алгоритма, и не так важно каким способом её решать. Конечно, бывают и такие случаи, когда все делают одну и ту же ошибку. У начинающих вычислительных математиков есть несколько таких излюбленных ошибок.Разумеется, если есть возможность сравнить результаты расчета с экспериментальными, то такие сравнения являются поводом для подтверждения верности расчетов. Что же касается исследования численных методов на аппроксимацию — то эта теория достаточно хорошо разработана, однако без вычислительных ошибок численных решений не бывает. Вопрос заключается в том, значительны ли они или незначительны, что, впрочем, также можно оценить.
Приведём некоторые примеры, демонстрирующие что «шутки с погрешностью плохи».
Пример 1: корни многочлена [ править ]
Есть множество программ, позволяющие численно вычислять корни многочленов. Давайте рассмотрим уравнение
x
4
−
4
x
3
+
8
x
2
−
16
x
+
15.
9...9
⏟
8
=
(
x
−
2
)
4
−
10
−
8
=
0
;
{\displaystyle x^{4}-4x^{3}+8x^{2}-16x+15.\underbrace {9...9} _{8}=(x-2)^{4}-10^{-8}=0;\,\!}
Это уравнение просто решить аналитически:
(
x
−
2
)
2
=
10
−
4
{\displaystyle (x-2)^{2}=10^{-4}\,\!}
,
x
1
,
2
=
2
±
0.01
;
x
3
,
4
=
2
±
0
,
01
i
.
{\displaystyle x_{1,2}=2\pm 0.01;{\rm {}}x_{3,4}=2\pm 0,01i.\,\!}
Предположим, что мы проводим вычисления на компьютере, имеющем точность
δ
M
>
10
−
8
{\displaystyle \delta _{M}>10^{-8}\,\!}
. В этом случае последнее слагаемое в уравнение будет округлено до 16.0, и с позиции компьютера будет решаться уравнение
(
x
−
2
)
4
=
0
{\displaystyle \left({x-2}\right)^{4}=0\,\!}
, у которого один корень 2. Таким образом, малые погрешности в задании числа порядка
10
−
8
{\displaystyle 10^{-8}\,\!}
привели к появлению погрешностей в определении корней уравнения порядка
10
−
2
{\displaystyle 10^{-2}\,\!}
. Более того, вместо двух действительных и двух комплексных корней у нас получился лишь один действительный. Такие плохо обусловленные многочлены не редкость. Например, если в многочлене
(
x
−
1
)
(
x
−
2
)
…
(
x
−
20
)
=
x
20
−
210
x
19
+
…
{\displaystyle \left({x-1}\right)\left({x-2}\right)\ldots \left({x-20}\right)=x^{20}-210x^{19}+\ldots \,\!}
коэффициент при
x
19
{\displaystyle x^{19}\,\!}
изменить на малую величину порядка
10
−
7
{\displaystyle 10^{-7}\,\!}
, то вместо максимального корня
x
20
=
20
{\displaystyle x_{20}=20\,\!}
получим корень
x
20
≈
20
,
8
{\displaystyle x_{20}\approx 20,8\,\!}
Пример 2: cистема уравнений [ править ]
Другой пример плохо обусловленной задачи — это система двух линейных уравнений:
{
u
+
10
v
=
11
,
100
u
+
1001
v
=
1101.
{\displaystyle \left\{{\begin{matrix}u+10v=11,\\100u+1001v=1101.\end{matrix}}\right.\,\!}
«Возмутим» правую часть первого уравнения на 0,01 (вместо 11 напишем 11,01) и получим новую, «возмущенную» систему, решением которой является пара чисел {11,01; 0,00}, не имеющая ничего общего с решением невозмущенной системы. Здесь изменение значения одного параметра на
0
,
1
%
{\displaystyle 0,1\%\,\!}
привело к совсем другому решению.
Пример 3: вычисление sin x [ править ]
В математическом анализе показывается, что функция
sin
x
{\displaystyle \sin x\,\!}
может быть представлена в виде ряда
sin
x
=
x
−
x
3
3
!
+
x
5
5
!
−
x
7
7
!
+
.
.
.
{\displaystyle \sin x=x-{{x^{3}} \over {3!}}+{{x^{5}} \over {5!}}-{{x^{7}} \over {7!}}+...\,\!}
, причём этот ряд будет сходиться к значению
sin
x
{\displaystyle \sin x\,\!}
при любых значениях x. После вычисления значения нашей функции при
x
=
0
,
5236
{\displaystyle x{\rm {=0}}{\rm {,5236}}\,\!}
(
x
≈
30
∘
{\displaystyle x\approx 30^{\circ }\,\!}
) с четырьмя значащими цифрами и с учётом лишь членов ряда, больших
10
−
4
{\displaystyle {10^{-4}}\,\!}
, получим значение
sin
x
{\displaystyle \sin x\,\!}
с той же точностью:
sin
(
0
,
5236
)
=
0
,
5000.
{\displaystyle \sin(0,5236)=0,5000.\,\!}
Теперь положим, что
x
=
25
,
66
{\displaystyle x{\rm {=25}}{\rm {,66}}\,\!}
(
x
≈
1470
∘
{\displaystyle x\approx 1470^{\circ }\,\!}
). Если мы проведём вычисления с восемью значащими цифрами с учётом членов ряда, больших
10
−
8
{\displaystyle {10^{-8}}\,\!}
, то получим ошеломляющий результат;
sin
(
25
,
66
)
=
24
,
.
.
.
{\displaystyle \sin(25,66)=24,...\,\!}
Впрочем, в данном случае выход из положения достаточно прост — необходимо использовать формулы приведения:
sin
1470
∘
=
sin
30
∘
{\displaystyle \sin 1470^{\circ }=\sin 30^{\circ }\,\!}
. А что делать, если нам необходимо вычислить экспоненту, представленную в виде ряда
e
x
=
1
+
x
+
x
2
2
!
+
x
3
3
!
+
.
.
.
{\displaystyle e^{x}=1+x+{{x^{2}} \over {2!}}+{{x^{3}} \over {3!}}+...\,\!}
? Очевидно, что нас и в этом случае ждут подобные сюрпризы. Однако и здесь существует выход: будем вычислять экспоненту с отрицательным показателем
e
−
x
=
1
−
x
+
x
2
2
!
−
x
3
3
!
+
.
.
.
{\displaystyle e^{-x}=1-x+{{x^{2}} \over {2!}}-{{x^{3}} \over {3!}}+...\,\!}
, а затем вычислим обратную величину:
e
x
=
1
e
−
x
=
1
1
−
x
+
x
2
2
!
−
x
3
3
!
+
.
.
.
{\displaystyle e^{x}={1 \over {e^{-x}}}={1 \over {1-x+{{x^{2}} \over {2!}}-{{x^{3}} \over {3!}}+...}}\,\!}
. Дело в том, что
e
−
x
{\displaystyle e^{-x}\,\!}
вычисляется как сумма знакопеременного ряда. После того, когда каждое следующее слагаемое в этой сумме станет меньше, чем предыдущее, по модулю, мы будем чётко представлять верхнюю и нижнюю оценку вычисляемого значения и будем знать, на каком слагаемом следует оборвать суммируемый ряд.
Пример 4: корень из двойки [ править ]
Мы говорили о том, что на результат вычисления может оказать влияние выбор алгоритма решения задачи. Действительно, пусть нам нужно вычислить значение выражения
A
=
(
2
−
1
2
+
1
)
3
.
{\displaystyle A=\left({{{\sqrt {2}}-1} \over {{\sqrt {2}}+1}}\right)^{3}.\,\!}
После избавления от иррациональности в знаменателе, получим:
A
=
(
2
−
1
)
6
{\displaystyle A=\left({{\sqrt {2}}-1}\right)^{6}\,\!}
или
A
=
(
3
−
2
2
)
3
{\displaystyle A=\left({3-2{\sqrt {2}}}\right)^{3}\,\!}
или
A
=
99
−
70
2
.
{\displaystyle A=99-70{\sqrt {2}}.\,\!}
Эти три формулы и будут нашими тремя алгоритмами вычисления числа A. Выберем два разных приближения корня из двойки.
2
≈
7
5
=
1
,
4
{\displaystyle {\sqrt {2}}\approx {7 \over 5}=1,4\,\!}
и
2
=
17
12
≈
1
,
416666...
{\displaystyle {\sqrt {2}}={{17} \over {12}}\approx 1,416666...\,\!}
Проведём вычисления A по трём формулам для двух приближенных значений
2
{\displaystyle {\sqrt {2}}\,\!}
. Результаты вычислений представим в виде таблицы:
Видно, что первый «алгоритм»
A
=
(
2
−
1
)
6
{\displaystyle A=\left({{\sqrt {2}}-1}\right)^{6}\,\!}
является более устойчивым к погрешностям входных данных.
Задачи для самостоятельного решения [ править ]
Читателю предлагается добраться до компьютера и компилятора какого-нибудь языка программирования (Си или Pascal) и провести несколько незатейливых численных экспериментов.
Задача 1 (частичная сумма гармонического ряда). [ править ]
Напишите программу, которая суммирует первые миллион слагаемых гармонического ряда сначала с первого по последний элемент, а потом наоборот — с последнего по первый:
A
=
1
1
+
1
2
+
1
3
+
…
+
1
10
6
=
1
10
6
+
…
1
3
+
1
2
+
1
1
{\displaystyle A={1 \over 1}+{1 \over 2}+{1 \over 3}+\ldots +{1 \over {10^{6}}}={1 \over {10^{6}}}+\ldots {1 \over 3}+{1 \over 2}+{1 \over 1}\,\!}
. Убедитесь, что ассоциативный закон «
(
a
+
b
)
+
c
=
a
+
(
b
+
c
)
{\displaystyle (a+b)+c=a+(b+c)\,\!}
» при вычислении на компьютере с конечной точностью не выполняется, что может привести к довольно сильному расхождению между результатом вычислений и реальным значением выражения.
Задача 2 («страшный» предел). [ править ]
Найдите с помощью компьютера значение выражения
sin
(
tan
(
x
)
)
−
tan
(
sin
(
x
)
)
arcsin
(
arctan
(
x
)
)
−
arctan
(
arcsin
(
x
)
)
{\displaystyle {\frac {\sin(\tan(x))-\tan(\sin(x))}{\arcsin(\arctan(x))-\arctan(\arcsin(x))}}\,\!}
при x, равном 1, 1/2, 1/4, 1/8, 1/10, 1/100, … (x измеряется в радианах). Как вы думаете, к чему это выражение на самом деле стремится по мере того, как x стремится к 0? дайте решение пожалуйста.
Задача 3 («башня» из степеней). [ править ]
Рассмотрим функцию
f
(
x
)
=
x
x
x
⋅
⋅
⋅
{\displaystyle f(x)=x^{x^{x^{\cdot ^{\cdot ^{\cdot }}}}}\,\!}
. Эта функция представляет собой бесконечную башню степеней. При некоторых
x
{\displaystyle x}
такая бесконечная конструкция имеет смысл. Видно, что
f
(
x
)
=
x
f
(
x
)
{\displaystyle f(x)=x^{f(x)}\,\!}
. Это значит, что при
f
(
x
)
=
a
{\displaystyle f(x)=a\,\!}
имеем
a
=
x
a
{\displaystyle a=x^{a}\,\!}
и
x
=
a
1
/
a
{\displaystyle x=a^{1/a}\,\!}
. Из этого можно ошибочно вывести, что при
x
=
3
1
/
3
=
3
3
{\displaystyle x=3^{1/3}={\sqrt[{3}]{3}}\,\!}
имеем
f
(
x
)
=
3
{\displaystyle f(x)=3\,\!}
. Это не так. Убедитесь в этом сами. Мы предлагаем вам изучить функцию
f
(
x
)
{\displaystyle f(x)\,\!}
, приблизив её «башней» степеней конечной высоты. А именно, рассмотрите и запрограммируйте рекурсивную функцию
F
n
(
x
)
=
x
F
n
−
1
(
x
)
{\displaystyle F_{n}(x)=x^{F_{n-1}(x)}\,\!}
,
F
1
(
x
)
=
x
{\displaystyle F_{1}(x)=x\,\!}
. Напишите программу (или используйте GnuPlot , Mathematica , Maple или другие подобные инструменты), которая рисует график четырёх функций
F
1000
(
x
)
{\displaystyle F_{1000}(x)\,\!}
,
F
1001
(
x
)
{\displaystyle F_{1001}(x)\,\!}
,
F
1002
(
x
)
{\displaystyle F_{1002}(x)\,\!}
,
F
1003
(
x
)
{\displaystyle F_{1003}(x)\,\!}
на интервале (0;3). Из вида этих графиков сделайте выводы. При каких
x
{\displaystyle x}
определена функция
f
(
x
)
{\displaystyle f(x)\,\!}
, то есть при каких
x
{\displaystyle x}
значения
F
n
(
x
)
{\displaystyle F_{n}(x)\,\!}
при увеличении
n
{\displaystyle n}
становятся все ближе и ближе друг к другу и к некоторому фиксированному числу? Когда числа из последовательности
a
1
,
a
2
,
…
,
a
n
,
…
{\displaystyle a_{1},\;a_{2},\;\;\ldots ,\;a_{n},\;\ldots \,\!}
приближаются к некоторому числу
A
{\displaystyle A}
, то говорят, что последовательность
a
i
{\displaystyle a_{i}\,\!}
имеет предел
A
{\displaystyle A}
и пишут
a
n
→
A
{\displaystyle a_{n}\to A\,\!}
при
n
→
∞
{\displaystyle n\to \infty \,\!}
.
Уточним это понятие: какое бы маленькое положительное число
ε
{\displaystyle \varepsilon \,\!}
мы ни выбрали, всегда найдется такой элемент последовательности
a
M
{\displaystyle a_{M}\,\!}
, что он сам и все элементы последовательности после него оказываются удалены от числа A не более чем на
ε
{\displaystyle \varepsilon \,\!}
Последний вопрос нашей задачи можно переформулировать так: при каких значениях
x
{\displaystyle x}
у последовательности
a
1
=
F
1
(
x
)
,
a
2
=
F
2
(
x
)
,
a
3
=
F
3
(
x
)
,
…
{\displaystyle a_{1}=F_{1}(x),\;a_{2}=F_{2}(x),\;a_{3}=F_{3}(x),\;\ldots \,\!}
есть предел, то есть существует некоторое число
A
{\displaystyle A}
, зависящее от
x
{\displaystyle x}
, к которому стремится последовательность
a
i
=
F
i
(
x
)
{\displaystyle a_{i}=F_{i}(x)\,\!}
?