Линейная алгебра для студентов-машиностроителей. В 2 частях. Ч.1. Учебное пособие
.pdf
представление a, абсолютную погрешность ∆a и относительную погрешность δ(a):
∆a = a−a ;
δ(a)= a−aa .
Представленное приближенно в компьютере число записыва-
ют так: a =a±∆a; a =a(1±δ(a)), δ(a) <εм.
Не зная точного значения числа a, эти погрешности вычислить невозможно. Но можно оценить их сверху. Например, если δ(a)≤10−N, то число a имеет N верных десятичных знаков. Таким
образом, числа одинарной точности содержат 6 верных десятичных знаков, а двойной точности – 15 знаков.
Так как числа с плавающей запятой расположены на диапазоне неравномерно (ближе к нулю гуще, дальше от него – все реже и реже), абсолютная погрешность ∆a может быть очень большой.
Описанные выше типы реализованы в аппаратуре. Так, например, современные центральные процессоры (англ. central processing unit, CPU) чаще всего эффективно работают с обоими типа-
ми, графические процессоры (англ. graphics processing unit, GPU)
на игровых видеокартах содержат большое количество вычислительных блоков для чисел с одинарной точностью (от 16:1 до 64:1) [37], поскольку результаты расчета трехмерных сцен выводятся на экран с ограниченным числом пикселей (миллион – два десятка миллионов) и очень высокая точность расчетов не требуется.
Упрофессиональных видеокарт это соотношение обычно 2:1.
Вустройствах для специализированных вычислений, например в программируемых логических матрицах (англ. field-programmable gate array, FPGA) или интегральных схемах специального назначе-
ния (англ. application-specific integrated circuit, ASIC), чаще исполь-
зуется формат чисел с фиксированной запятой. Такие вычисления (например, обработка сигналов, майнинг криптовалюты) требуют более высокой производительности/энергоэффективности и/или высокойточностивнеоченьбольшомдиапазонечисел(рис.2.5[38]).
41
Рис. 2.5. Сравнение аппаратных платформ
В стандарте представлено несколько типов чисел с плавающей запятой, например половинной точности (англ. binary16, или half)
и четверной точности (англ. binary128, quadruple, или long double).
Они реже реализуются в аппаратуре, хотя могут быть полезны в ситуациях, когда нужно увеличить скорость вычислений или диапазон представимых чисел и их точность [39]. Здесь, конечно, давно назрел вопрос: а зачем нужна такая большая точность, как в формате двойной или даже одинарной точности? Все дело в арифметических операциях, из-за которых накапливается ошибка.
2.5.2.Арифметические операции над числами
сплавающей запятой
Вначале рассмотрим специальные числа. Бесконечности возникаюткакприпереполнении,такиприделенииненулевогочисла на нуль:
±c0 = ±∞,c , c >0; ±c0 = ∞, c , c<0.
Нуль тоже имеет знак, но при сравнении +0 и –0 они одинаковы. В стандарте знак сохранили умышленно, чтобы выражения, которые в результате переполнения или потери значимости превращаются в бесконечность или в нуль, при умножении и делении все же могли представить максимально корректный результат.
42
Например, если бы у нуля не было знака, выражение |
1 |
= x не вы- |
|||||
1 |
|||||||
|
|
|
|
|
|
||
полнялось бы верно при x = –∞, так как 1 |
|
1 |
|
x |
|
||
= 0, а |
= +∞. |
||||||
|
|||||||
|
−∞ |
0 |
|
|
|
||
Не число NaN используется для того, чтобы арифметическая операция всегда могла вернуть какое-то небессмысленное значение. Разделяют тихий и сигнальный NaN: первый, попав в любую операцию,возвращаетNaN,второйвызываетисключительнуюситуацию. Обычно тихий или сигнальный определяется старшим битом мантиссы (при желании можно в мантиссу записывать дополнительнуюинформацию,ностандартомэтонерегламентировано).
Как получить NaN? Например, из классических неопределенностей
∞∞, 00 ,∞−∞,0∞.
По определению NaN ≠ NaN, поэтому для проверки значения переменной нужно сравнить ее с собой. Если в арифметическом выражении появился NaN, результатом выражения всегда будет NaN (это можно использовать для заполнения им недостающих данных при вычислениях).
В зависимости от реализации неопределенности, связанные с возведением в степень (как и ряд других ситуаций), могут возвра-
щать не NaN [40].
MATLAB: clear
[2 + Inf, 2 - Inf, 2 * Inf, 2 / Inf] [0 / Inf, -Inf / 0, 2 / 0, -2 / 0] 1 / (1 / -Inf) == -Inf
[Inf / Inf, 0 / 0, Inf - Inf, 0 * Inf]
[0^0, Inf^0, 1^Inf] % математически NaN, но реализованы выдавать 1
[NaN + 2, NaN - 2, NaN * 2, NaN / 2, NaN * 0, ...
NaN / 0, 0 / NaN, NaN * Inf, NaN / Inf, Inf / NaN] % любая опера-
ция с NaN дает NaN
43
[2 ^ NaN, NaN ^ 2, NaN ^ Inf, Inf ^ NaN, 1 ^ NaN, NaN ^ 0] [NaN == NaN, NaN > NaN, NaN < NaN]
Как реализованы арифметические операции с числами, представлено в [41, 42]. Отметим, что при вычислениях с плавающей запятой операция округления может потребоваться после выполнения любой арифметической операции. Так, умножение или деление двух чисел сводится к умножению или делению мантисс и к сложению или вычитанию порядков. Поскольку в общем случае количество разрядов мантисс произведений и частных может быть больше допустимой разрядности мантиссы, то требуется округление мантиссы результата.
При сложении или вычитании чисел с плавающей точкой операндыдолжныбытьпредварительноприведеныкодномупорядку. Это осуществляется сдвигом вправо мантиссы числа, имеющего меньший порядок, и увеличением в соответствующее число раз порядка данного числа. Сдвиг мантиссы вправо может привести к потере младших разрядов мантиссы, т. е. появляется погрешность округления.
В стандарте представлено несколько режимов округления, из которых чаще всего для балансировки накапливающихся округлений используется округление к ближайшему числу, а полуцелых чисел – к ближайшему четному числу. Так, 12,5 округляется до 12, а13,5–до14.Приэтомпогрешностьокруглениясоставитнеболь- ше половины от εм.
Проведем оценку относительных погрешностей для арифметических операций с числами одного знака с плавающей запятой [43] (без учета погрешности округления, которую можно добавить отдельно):
δ(a |
+b)≤ |
|
a |
|
δ(a) |
+ |
|
b |
|
δ(b) |
|
≤εм; |
|||||||||||||||||
|
|
|
|
|
|||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
a |
+b |
|
|
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
δ(a−b)≤ |
|
a |
|
δ(a)+ |
|
b |
|
δ(b) |
≤ |
|
|
a+b |
|
|
εм; |
||||||||||||||
|
|
|
|
|
|
|
|
||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
a−b |
|
|
|
|
|
|
|
|
|
|
a−b |
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
δ(a b)≤δ(a)+δ(b)+δ(a)δ(b)≤ 2εм +εм2 ≈ 2εм;
44
a |
|
|
δ(a)+δ(b) |
|
|
2εм |
|
|
δ |
|
= |
|
|
≤ |
|
|
≈ 2εм. |
|
−δ(b) |
|
−δ(b) |
|||||
b |
|
1 |
1 |
|
||||
Доказательство – это упражнение 2.2. Из первого неравенства следует, что при суммировании чисел одного знака потеря точности будет только из-за округления. При умножении и делении может наблюдаться дополнительное накопление погрешности. При вычитании ближайших чисел одного знака может произойти
катастрофическая потеря точности (от англ. catastrophic cancellation) – модуль разности в знаменателе станет очень большим, что приведет к заметной потере точности в результате операции.
Пример 2.5. Найти значения произведения при различных натуральных значениях n и оценить влияние погрешности арифметических операций на вычисления в формате чисел с плавающей запятой одинарной и двойной точности в MATLAB:
|
+ |
1 n |
1 |
. |
|
|
|
n |
Вкачествеориентираберетсяизвестныйпределэтоговыражения:
|
+ |
1 n |
|
lim 1 |
|
=e. |
|
n→∞ |
|
n |
|
Решение. При достаточно больших значениях n ориентир можно считать очень близким к точному значению. Зададим его таким (чтобы не задействовать длинную арифметику) и построим в MATLAB график модуля разности значения этого произведения и числа e, деленного на модуль числа e (т. е. на условную относительную погрешность) от n.
MATLAB: clear
true_val = exp(1); % в пределах точности типа double N_values = 1000:1000:1000000;
error_single = zeros(1,length(N_values)); error_double = zeros(1,length(N_values)); for i = 1:length(N_values)
45
N = N_values(i); prod_single = single(1); prod_double = 1;
for j = 1:N
prod_single = prod_single * single(1+1/N); prod_double = prod_double * (1 + 1/N); end
error_single(i) = abs(prod_single - true_val) / abs(true_val); error_double(i) = abs(prod_double - true_val) / abs(true_val); end
figure
plot(N_values,error_single,'DisplayName','Одинарная точность') hold on
plot(N_values,error_double,'DisplayName','Двойная точность') xlabel('n')
ylabel('Относительная погрешность') ax = gca;
ax.XScale = 'log'; ax.YScale = 'log'; grid on legend('show')
Из рис. 2.6 следует, что при значениях n больше нескольких тысяч накопление погрешности приводит к снижению точности расчетов для чисел одинарной точности (синий цвет). При этом накопление погрешности растет практически линейно, пропорционально числу операций. Для чисел двойной точности и значениях n вплоть до миллиона такого не наблюдается, отклонение результата от числа e еще больше, чем накопленная погрешность.
Множество чисел с плавающей запятой не является ни полем, ни кольцом, ни даже группой! Действительно, нет «настоящего» нуля(так,например,0NaN≠0),дляNaNнетобратногоэлемента, неверны законы ассоциативности по сложению и умножению, а такжедистрибутивности.Выполняютсятолькокоммутативныезаконы сложения и умножения.
46
(δ)(е)
10–1
10–2
10–3
10–4
10–5
10–6 |
|
|
|
|
|
10–7 |
103 |
104 |
n |
105 |
106 |
|
|
|
|
|
Рис. 2.6. Накопление погрешности для чисел одинарной точности:
– одинарная точность;
– двойная точность
MATLAB: clear
0 * NaN == NaN % нуль не является нулевым элементом для NaN (2^53+1)+-1==2^53+(1+-1)%нетассоциативностисложения
(10^-10 * 10) * 10^15 == 10^-10 * (10 * 10^15) % нет ассоциативности умножения
(10^-16 + 1) * 10 == 10^-16 * 10 + 1 * 10 % нет дистрибутивности Тем не менее даже с учетом этих факторов числа с плавающей
запятой удобны для проведения вычислений на компьютере. Таким образом, сделаем следующие выводы:
1.Диапазон и точность представления вещественных чисел как чисел с плавающей запятой ограничены. Выбор формата (одинарная, двойная точность и др.) определяется из характера вычислений и поддержки его аппаратурой.
2.На всем диапазоне представимые числа распределены нерав-
номерно (соседние крупные числа находятся дальше друг от друга, чем маленькие).
3. Арифметические операции накапливают погрешность и в общем случае неассоциативны и недистрибутивны.
47
4.Необходимо избегать вычитания близких чисел одного знака или сложения близких по модулю чисел разных знаков, это может привести к значительной потере точности.
5.Вместо прямого сравнения чисел с плавающей точкой на равенство или неравенство надежнее выполнять оценку расстояния между ними (см., например, [44]).
УПРАЖНЕНИЯ
Упражнение 2.1. Найти представление 0,15625 в формате числа с плавающей запятой одинарной точности.
Упражнение 2.2. Пусть a и b – ненулевые числа одного знака. Доказать правильность оценки погрешности арифметических опера-
ций над числами с плавающей запятой:
δ(a |
+b)≤ |
|
a |
|
δ(a) |
+ |
|
b |
|
δ(b) |
|
≤εм; |
||||||||||||||||
|
|
|
|
|
||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
a |
+b |
|
|
|
|
|
|
|
|||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
δ(a−b)≤ |
|
a |
|
δ(a)+ |
|
b |
|
δ(b) |
≤ |
|
|
a+b |
|
εм; |
||||||||||||||
|
|
|
|
|
|
|
||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
a−b |
|
|
|
|
|
|
|
|
|
|
a−b |
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
δ(a b)≤δ(a)+δ(b)+δ(a) δ(b)≤ 2εм +εм2 ≈ 2εм;
a |
|
|
δ(a)+δ(b) |
|
|
2εм |
|
|
δ |
|
= |
|
|
≤ |
|
|
≈ 2εм. |
|
−δ(b) |
|
−δ(b) |
|||||
b |
|
1 |
1 |
|
||||
Упражнение 2.3. Не всегда очевидно, что в задаче не хватает выбранной точности. Рассмотрим задачу вычисления значений функции, заданной рекурсивно (логистическое отображение Фейгенбаума [45] – пример того, как сложное, хаотическое поведение может возникать из очень
простых нелинейных уравнений): f (k)= r f (k −1) (1− f (k −1)), k , |
|
f (0)=c 0;1 . |
|
|
|
Оцените в MATLAB, насколько быстро с ростом k нужно увеличивать точность представления, построив график функции и используя форматы хранения с плавающейзапятойодинарной идвойнойточности.Параметрызадайтеr =4(дляэтогочастногослучаяестьнерекурсивнаяформула), а значение с возьмите, например, 0,22.
В качестве точного |
значения функции берется подсчитанное |
с запасом значение |
с помощью длинной арифметики [46]: |
f (k)=sin2 (2k arcsin
c).
48
Г л а в а 3
МАТРИЦЫ
3.1. Понятие матрицы
Матрица – это математический объект, записываемый в виде прямоугольной таблицы элементов (чаще всего чисел). Обычно матрицы обозначаются прописными латинскими буквами (A, B, C, …). Записать матрицу можно так:
a |
a |
… a |
|
|
|
|
||
|
11 |
12 |
|
1n |
|
|
|
|
A = a21 |
a22 |
… a2n |
=(aij ) |
m×n |
, |
|||
|
… |
… |
… |
… |
|
|
|
|
|
|
a |
… |
a |
|
|
|
|
a |
|
|
|
|
||||
|
m1 |
m2 |
|
mn |
|
|
|
|
где aij – элемент, находящийся на пересечении i-й строки и j-го столбца.
Две матрицы называются равными, если они имеют одинаковые размеры и их соответствующие элементы равны. Особенно распространены квадратные матрицы, у которых m = n. Это число называется порядком квадратной матрицы. Существуют матрицы, состоящие из одной строки (m = 1) или из одного столбца (n = 1). Такие матрицы называют векторами:
0 |
2 |
|
|
8 |
|
|
|
−3 |
|
||||
A = |
1 |
−3 |
, B=(4 6 |
−1), C = |
, |
|
|
|
|
3 |
|
||
|
|
|
|
|
|
|
где A – квадратная матрица второго порядка (m = n = 2); B – век- тор-строка: C – вектор-столбец.
Матрицу любого размера, состоящую только из нулей, будем называть нулевой и обозначать O:
0 |
0 |
… |
0 |
||
|
|
… |
|
|
|
O = … |
… … . |
||||
|
0 |
0 |
… |
0 |
|
|
|
||||
В квадратной матрице элементы a11,a22, …,ann составляют так называемую главную диагональ (отмечена синим цветом). Другая
49
подобная диагональ из a1n,a2(n−1),…,an1 |
называется побочной (от- |
|||
мечена оранжевым цветом): |
|
|
|
|
a11 |
a12 |
… a1n |
||
a |
a |
… |
a |
|
21 |
22 |
|
2n . |
|
… |
… |
… |
… |
|
|
a |
… |
a |
|
a |
|
|||
n1 |
n2 |
|
nn |
|
Квадратную матрицу, элементы которой симметричны относительно главной диагонали, называют симметричной.
Квадратная матрица считается диагональной, если все элементы, не находящиеся на главной диагонали, равны нулю. На главной диагонали могут быть любые значения. Если все они равны единице, то диагональная матрица называется единичной. Обозначим ее буквой E (в англоязычной литературе обычно I, от англ. identity), а диагональную (от англ. diagonal) матрицу – буквой D:
1 |
0 |
… 0 |
a11 |
0 |
… 0 |
|||||
|
0 |
1 |
… |
0 |
|
|
0 |
a |
… |
0 |
E = |
|
|
|
|
|
; D = |
|
22 |
|
. |
… … … … |
|
… … |
… … |
|||||||
|
0 |
0 |
… |
1 |
|
|
0 |
0 |
… |
|
|
|
|
a |
|||||||
|
|
|
|
|
|
|
|
|
|
nn |
Квадратная матрица, у которой все элементы ниже главной диагонали равны нулю, называется верхнетреугольной матрицей:
a11 |
a12 |
… |
a1n |
|
|
0 |
a |
… |
a |
|
|
22 |
|
2n . |
… |
… |
… |
… |
|
|
0 |
0 |
… |
|
|
a |
|||
|
|
|
|
nn |
Квадратная матрица, у которой все элементы выше главной диагонали равны нулю, называется нижнетреугольной матрицей:
a11 |
0 |
… |
0 |
|
a |
a |
… |
0 |
|
21 |
22 |
|
|
. |
… |
… |
… |
… |
|
|
a |
… |
a |
|
a |
|
|||
n1 |
n2 |
|
nn |
|
50
