Материалы к занятиям: https://maxxk.github.io/programming-semester-5/
email:
В дисплейных классах рекомендуется просматривать в браузере Firefox.
В нём установлено расширение NoScript, обратите внимание на инструкцию, иначе значительная часть сайтов не будет работать.
Плавающая точка — метод представления подмножества рациональных чисел (бывает тип комплексных чисел с плавающей точкой):
$
x = (-1)^{{\color{#0CC}{sign}}} · 1.\overline{{\color{#F00} {significand}}} · 2^{{\color{#0C2}{exponent - bias}}}$
32-битное число (float):
Смещенный порядок (biased exponent): p = exp − 127
Нормированная мантисса (normalized significand): ведущий бит опускается и считается равным единице
На картинке мантисса — $ \color{#444}{1}.01000…0 $
Подробнее
Подробнее на Wikipedia (и далее — про стандарт IEEE 754)
Мантисса — двоичная дробь. Не всякая десятичная дробь представляется как конечная двоичная.
1/5 (0.2) записывается в double
как:
$0.2000000000000000\color{red}{11102230246251565404236316680908203125}$
⇒ для финансовых приложений нужно использовать десятичную запись с фиксированной точкой и строго заданными правилами округления
Денормализованные числа — порядок = 0, но мантисса не может быть записана в нормированном виде — число записывается в денормализованном виде, что вызывает потерю точности значащих цифр.
NaN (не-число) (все биты поряка установлены) — возвращается в операциях, результат которых не определён (0/0, $\sqrt{-1}$)
Infinity (±∞) — возвращается при делении на 0 или переполнении (в дисплейных классах вместо ∞ — исключение)
Floating Point Exception (SIGFPE):
==
)Segmentation Fault (SIGSEGV):
valgrind
)𝐌n — кольцо матриц n×n над ℂ (со сложением и умножением на константу можно рассматривать как векторное пространство над ℂ)
I — единичная матрица (E — матрица погрешности)
Для численных методов задача осложняется: даны значения $\hat{A}, \hat{b}$ с погрешностью, т.к. на практике не все действительные числа могут быть точно представлены в виде чисел с плавающей точкой; арифметические операции тоже вносят погрешность.
Векторная норма ‖·‖ : 𝐕 → ℝ_+:
Матричная норма — п.1–3 и:
Свойства:
Для нормы ‖ · ‖ на ℂn определим матричную (подчинённую, индуцированную) норму на 𝐌n по формуле:
‖A‖≡max‖x‖=1‖Ax‖.
Для подчинённой нормы ‖I‖=1 и ‖Ax‖⩽‖A‖·‖x‖
Основные нормы для этого курса:
Спектральная норма в первой задаче не используется.
Пусть x — точное решение системы Ax = b, а $\hat{x}$ — приближённое, полученное с помощью численных методов.
Назовём числом обусловленности (κ(A), cond(A)): $κ(A) ≡ ‖A‖·‖A^{-1}‖ \; \mbox{(для невырожденных матриц)} $
Невязка: $r ≡ b - A\hat{x}$
Относительная погрешность приближённого решения: $ \dfrac{‖x-\hat{x}‖}{‖x‖} ⩽ κ(A)\dfrac{‖r‖}{‖b‖}. $
Свойства числа обусловленности:
Тривиальная реализация:
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
c[i*n+j] = 0.;
for (k = 0; k < n; k++) {
c[i*n+j] = a[i*n+k] * b[k*n+j];
Блочная реализация (размер блока — порядка $\sqrt{\dfrac{L1}{3}}$)
for (i = 0; i < n/BLOCK; i++) {
for (j = 0; j < n/BLOCK; j++) {
zero_block(c, i, j);
for (k = 0; k < n/BLOCK; k++) {
multiply_block(a, b, temp, i, j, k);
put_block(c, temp, i, j);
Вычислительная сложность тривиального алгоритма — O(n3) (т.е. если реализация умножения работает 1 с. на матрице размера 1000 × 1000, то она будет работать 8 с. на матрице размера 2000 × 2000, 64 с. на матрице размера 4000 × 4000 и т.д.). Развёртывание цикла, блочные оптимизации и т.п. могут только уменьшить константу.
Минимальный теоретически возможный порядок — O(n2), т.к. результат зависит от всех 2n2 элементов входных матриц, но вопрос минимальной достижимой сложности на настоящее время не решён.
Лучший применимый на практике алгоритм — Strassen (1969), сложность — O(n2.807355), есть проблемы с численной устойчивостью.
Лучший алгоритм — Coppersmith-Winograd, с последующими улучшениями (2014) сложность — O(n2.3728639), но константа и производительность используемых операций не позволяет использовать его на практике с ощутимым преимуществом (проблемы с устойчивостью тоже никуда не деваются).
Невязка (residual) — вектор (матрица) погрешности вычислений. Нас интересует норма невязки.
Для «хороших» матриц наша цель по невязке порядка 10−16
Изменить программу, выполненную по заданию с прошлого занятия, следующим образом:
Добавить в программу выделение памяти под матрицу (размер задаётся ключом командной строки -n
) и генерацию матрицы по формулам по следующему слайду. Формула должна выбираться ключом командной строки.
Вычислить норму матрицы и вывести её на экран.
Измерять не время разбора аргументов командной строки, а время генерации и вычисления нормы матрицы.
Список задач
или lynx
в терминале.
i, j = 0…(n − 1):
Симметричная: aij = |i − j| — по возможности тестируйте на больших размерах этой или следующей матрицы
Симметричная без нулей на диагонали: aij = |i − j|+1
Матрица Гильберта: $H_{ij} = \dfrac{1}{i+j+1}$ — нет смысла тестировать на размерах >100
Для нормы 𝐋2 число обусловленности матрицы Гильберта 5 × 5:
κ(H)≈4.8 · 105
Сложность алгоритма O(nk) означает, что для задачи «размера» n выполнение алгоритма требует не более, чем C · nk (члены младших степеней можно отбросить путём увеличения константы).