Справочник Ada 2012
G.3.1 Вещественные векторы и матрицы
Статическая семантика
В общем пакете библиотеки Numerics.Generic_Real_Arrays содержится следующее объявление:
generic
type Real is digits <>;
package Ada.Numerics.Generic_Real_Arrays is
pragma Pure(Generic_Real_Arrays);
type Real is digits <>;
package Ada.Numerics.Generic_Real_Arrays is
pragma Pure(Generic_Real_Arrays);
-- Типы
type Real_Vector is array (Integer range <>) of Real'Base;
type Real_Matrix is array (Integer range <>, Integer range <>)
of Real'Base;
type Real_Matrix is array (Integer range <>, Integer range <>)
of Real'Base;
-- Подпрограммы для типов Real_Vector
-- Арифметические операции над Real_Vector
function "+" (Right : Real_Vector) return Real_Vector;
function "-" (Right : Real_Vector) return Real_Vector;
function "abs" (Right : Real_Vector) return Real_Vector;
function "-" (Right : Real_Vector) return Real_Vector;
function "abs" (Right : Real_Vector) return Real_Vector;
function "+" (Left, Right : Real_Vector) return Real_Vector;
function "-" (Left, Right : Real_Vector) return Real_Vector;
function "-" (Left, Right : Real_Vector) return Real_Vector;
function "*" (Left, Right : Real_Vector) return Real'Base;
function "abs" (Right : Real_Vector) return Real'Base;
-- Масштабирование Real_Vector
function "*" (Left : Real'Base; Right : Real_Vector)
return Real_Vector;
function "*" (Left : Real_Vector; Right : Real'Base)
return Real_Vector;
function "/" (Left : Real_Vector; Right : Real'Base)
return Real_Vector;
return Real_Vector;
function "*" (Left : Real_Vector; Right : Real'Base)
return Real_Vector;
function "/" (Left : Real_Vector; Right : Real'Base)
return Real_Vector;
-- Другие операции Real_Vector
function Unit_Vector (Index : Integer;
Order : Positive;
First : Integer := 1) return Real_Vector;
Order : Positive;
First : Integer := 1) return Real_Vector;
-- Подпрограммы для типов Real_Matrix
-- Арифметические операции над Real_Matrix
function "+" (Right : Real_Matrix) return Real_Matrix;
function "-" (Right : Real_Matrix) return Real_Matrix;
function "abs" (Right : Real_Matrix) return Real_Matrix;
function Transpose (X : Real_Matrix) return Real_Matrix;
function "-" (Right : Real_Matrix) return Real_Matrix;
function "abs" (Right : Real_Matrix) return Real_Matrix;
function Transpose (X : Real_Matrix) return Real_Matrix;
function "+" (Left, Right : Real_Matrix) return Real_Matrix;
function "-" (Left, Right : Real_Matrix) return Real_Matrix;
function "*" (Left, Right : Real_Matrix) return Real_Matrix;
function "-" (Left, Right : Real_Matrix) return Real_Matrix;
function "*" (Left, Right : Real_Matrix) return Real_Matrix;
function "*" (Left, Right : Real_Vector) return Real_Matrix;
function "*" (Left : Real_Vector; Right : Real_Matrix)
return Real_Vector;
function "*" (Left : Real_Matrix; Right : Real_Vector)
return Real_Vector;
return Real_Vector;
function "*" (Left : Real_Matrix; Right : Real_Vector)
return Real_Vector;
-- Масштабирование Real_Matrix
function "*" (Left : Real'Base; Right : Real_Matrix)
return Real_Matrix;
function "*" (Left : Real_Matrix; Right : Real'Base)
return Real_Matrix;
function "/" (Left : Real_Matrix; Right : Real'Base)
return Real_Matrix;
return Real_Matrix;
function "*" (Left : Real_Matrix; Right : Real'Base)
return Real_Matrix;
function "/" (Left : Real_Matrix; Right : Real'Base)
return Real_Matrix;
-- Обращение Real_Matrix и связанные операции
function Solve (A : Real_Matrix; X : Real_Vector) return Real_Vector;
function Solve (A, X : Real_Matrix) return Real_Matrix;
function Inverse (A : Real_Matrix) return Real_Matrix;
function Determinant (A : Real_Matrix) return Real'Base;
function Solve (A, X : Real_Matrix) return Real_Matrix;
function Inverse (A : Real_Matrix) return Real_Matrix;
function Determinant (A : Real_Matrix) return Real'Base;
-- Собственные значения и векторы вещественной симметричной матрицы
function Eigenvalues (A : Real_Matrix) return Real_Vector;
procedure Eigensystem (A : in Real_Matrix;
Values : out Real_Vector;
Vectors : out Real_Matrix);
Values : out Real_Vector;
Vectors : out Real_Matrix);
-- Другие операции Real_Matrix
function Unit_Matrix (Order : Positive;
First_1, First_2 : Integer := 1)
return Real_Matrix;
First_1, First_2 : Integer := 1)
return Real_Matrix;
end Ada.Numerics.Generic_Real_Arrays;
Пакет библиотеки Numerics.Real_Arrays объявлен чистым и определяет те же типы и подпрограммы, что и Numerics.Generic_Real_Arrays, за исключением того, что предопределенный тип Float систематически подставляется вместо Real'Base на протяжении всего текста. Аналогичным образом определены непараметрические аналоги для каждого из других предопределенных типов чисел с плавающей точкой, с именами Numerics.Short_Real_Arrays, Numerics.Long_Real_Arrays и т. д.
Два типа определены и экспортированы пакетом Numerics.Generic_Real_Arrays. Составной тип Real_Vector предназначен для представления вектора с компонентами типа Real; он определяется как неявный одномерный массив с индексом типа Integer. Составной тип Real_Matrix предназначен для представления матрицы с компонентами типа Real; он определяется как неявный двумерный массив с индексами типа Integer.
Действие различных подпрограмм описано ниже. В большинстве случаев подпрограммы описываются в терминах соответствующих скалярных операций типа Real; любое исключение, поднятое этими операциями, распространяется на операцию массива. Более того, точность результата для каждого отдельного компонента определяется, как и для скалярной операции, за исключением случаев, оговоренных отдельно.
В случае тех операций, которые определены как включающие внутреннее произведение, может быть поднято исключение Constraint_Error, если промежуточный результат находится вне диапазона Real'Base, даже если математический конечный результат не будет.
function "+" (Right : Real_Vector) return Real_Vector;
function "-" (Right : Real_Vector) return Real_Vector;
function "abs" (Right : Real_Vector) return Real_Vector;
function "-" (Right : Real_Vector) return Real_Vector;
function "abs" (Right : Real_Vector) return Real_Vector;
Каждая операция возвращает результат применения соответствующей операции типа Real к каждому компоненту Right. Диапазон индексов результата — Right'Range.
function "+" (Left, Right : Real_Vector) return Real_Vector;
function "-" (Left, Right : Real_Vector) return Real_Vector;
function "-" (Left, Right : Real_Vector) return Real_Vector;
Каждая операция возвращает результат применения соответствующей операции типа Real к каждому компоненту Left и соответствующему компоненту Right. Диапазон индексов результата — Left'Range. Constraint_Error генерируется, если Left'Length не равен Right'Length.
function "*" (Left, Right : Real_Vector) return Real'Base;
Эта операция возвращает внутреннее произведение Left и Right. Constraint_Error генерируется, если Left'Length не равен Right'Length. Эта операция включает внутреннее произведение.
function "abs" (Right : Real_Vector) return Real'Base;
Эта операция возвращает L2-норму Right (квадратный корень из внутреннего произведения вектора на себя).
function "*" (Left : Real'Base; Right : Real_Vector) return Real_Vector;
Эта операция возвращает результат умножения каждого компонента Right на скаляр Left с использованием операции "*" типа Real. Диапазон индексов результата — Right'Range.
function "*" (Left : Real_Vector; Right : Real'Base) return Real_Vector;
function "/" (Left : Real_Vector; Right : Real'Base) return Real_Vector;
function "/" (Left : Real_Vector; Right : Real'Base) return Real_Vector;
Каждая операция возвращает результат применения соответствующей операции типа Real к каждому компоненту Left и к скаляру Right. Диапазон индексов результата — Left'Range.
function Unit_Vector (Index : Integer;
Order : Positive;
First : Integer := 1) return Real_Vector;
Order : Positive;
First : Integer := 1) return Real_Vector;
Эта функция возвращает единичный вектор с Order компонентами и нижней границей First. Все компоненты установлены в 0.0, за исключением компонента Index, который установлен в 1.0. Constraint_Error генерируется, если Index < First, Index > First + Order – 1 или если First + Order – 1 > Integer'Last.
function "+" (Right : Real_Matrix) return Real_Matrix;
function "-" (Right : Real_Matrix) return Real_Matrix;
function "abs" (Right : Real_Matrix) return Real_Matrix;
function "-" (Right : Real_Matrix) return Real_Matrix;
function "abs" (Right : Real_Matrix) return Real_Matrix;
Каждая операция возвращает результат применения соответствующей операции типа Real к каждому компоненту Right. Диапазоны индексов результата — те же, что и у Right.
function Transpose (X : Real_Matrix) return Real_Matrix;
Эта функция возвращает транспонированную матрицу X. Первый и второй диапазоны индексов результата — X'Range(2) и X'Range(1) соответственно.
function "+" (Left, Right : Real_Matrix) return Real_Matrix;
function "-" (Left, Right : Real_Matrix) return Real_Matrix;
function "-" (Left, Right : Real_Matrix) return Real_Matrix;
Каждая операция возвращает результат применения соответствующей операции типа Real к каждому компоненту Left и соответствующему компоненту Right. Диапазоны индексов результата — те же, что и у Left. Constraint_Error генерируется, если Left'Length(1) не равен Right'Length(1) или Left'Length(2) не равен Right'Length(2).
function "*" (Left, Right : Real_Matrix) return Real_Matrix;
Эта операция реализует стандартную математическую операцию умножения матриц. Первый и второй диапазоны индексов результата — Left'Range(1) и Right'Range(2) соответственно. Constraint_Error генерируется, если Left'Length(2) не равен Right'Length(1). Данная операция включает внутренние произведения.
function "*" (Left, Right : Real_Vector) return Real_Matrix;
Эта операция возвращает внешнее произведение вектора Left (столбец) на вектор Right (строка) с использованием операции "*" типа Real для вычисления отдельных компонентов. Первый и второй диапазоны индексов результата — Left'Range и Right'Range соответственно.
function "*" (Left : Real_Vector; Right : Real_Matrix) return Real_Vector;
Данная операция выполняет стандартное математическое умножение (строки) вектора Left на матрицу Right. Диапазон индексов (строки) результата — Right'Range(2). Ошибка Constraint_Error возникает, если Left'Length не равен Right'Length(1). Данная операция использует скалярные произведения.
function "*" (Left : Real_Matrix; Right : Real_Vector) return Real_Vector;
Данная операция выполняет стандартное математическое умножение матрицы Left на (столбец) вектор Right. Диапазон индексов (столбца) результата — Left'Range(1). Ошибка Constraint_Error возникает, если Left'Length(2) не равен Right'Length. Данная операция использует скалярные произведения.
function "*" (Left : Real'Base; Right : Real_Matrix) return Real_Matrix;
Данная операция возвращает результат умножения каждого компонента Right на скаляр Left с использованием операции "*" типа Real. Диапазоны индексов результата совпадают с диапазонами индексов Right.
function "*" (Left : Real_Matrix; Right : Real'Base) return Real_Matrix;
function "/" (Left : Real_Matrix; Right : Real'Base) return Real_Matrix;
function "/" (Left : Real_Matrix; Right : Real'Base) return Real_Matrix;
Каждая операция возвращает результат применения соответствующей операции типа Real к каждому компоненту Left и скаляру Right. Диапазоны индексов результата совпадают с диапазонами индексов Left.
function Solve (A : Real_Matrix; X : Real_Vector) return Real_Vector;
Эта функция возвращает вектор Y, такой что X приблизительно равен A * Y. Это стандартная математическая операция для решения одной системы линейных уравнений. Диапазон индексов результата — A'Range(2). Ошибка Constraint_Error возникает, если A'Length(1), A'Length(2) и X'Length не равны. Ошибка Constraint_Error возникает, если матрица A плохо обусловлена.
function Solve (A, X : Real_Matrix) return Real_Matrix;
Эта функция возвращает матрицу Y, такую что X приблизительно равен A * Y. Это стандартная математическая операция для решения нескольких систем линейных уравнений. Диапазоны индексов результата — A'Range(2) и X'Range(2). Ошибка Constraint_Error возникает, если A'Length(1), A'Length(2) и X'Length(1) не равны. Ошибка Constraint_Error возникает, если матрица A плохо обусловлена.
function Inverse (A : Real_Matrix) return Real_Matrix;
Эта функция возвращает матрицу B, такую что A * B приблизительно равна единичной матрице. Диапазоны индексов результата — A'Range(2) и A'Range(1). Ошибка Constraint_Error возникает, если A'Length(1) не равен A'Length(2). Ошибка Constraint_Error возникает, если матрица A плохо обусловлена.
function Determinant (A : Real_Matrix) return Real'Base;
Эта функция возвращает определитель матрицы A. Ошибка Constraint_Error возникает, если A'Length(1) не равен A'Length(2).
function Eigenvalues(A : Real_Matrix) return Real_Vector;
Эта функция возвращает собственные значения симметричной матрицы A в виде вектора, отсортированного по убыванию. Ошибка Constraint_Error возникает, если A'Length(1) не равен A'Length(2). Диапазон индексов результата — A'Range(1). Ошибка Argument_Error возникает, если матрица A не симметрична.
procedure Eigensystem(A : in Real_Matrix;
Values : out Real_Vector;
Vectors : out Real_Matrix);
Values : out Real_Vector;
Vectors : out Real_Matrix);
Эта процедура вычисляет как собственные значения, так и собственные векторы симметричной матрицы A. Параметр Values такой же, как полученный при вызове функции Eigenvalues. Параметр Vectors — матрица, столбцы которой являются собственными векторами матрицы A. Порядок столбцов соответствует порядку собственных значений. Собственные векторы нормированы и попарно ортогональны (ортонормированы), в том числе при наличии повторяющихся собственных значений. Ошибка Constraint_Error возникает, если A'Length(1) не равен A'Length(2), или если Values'Range не равен A'Range(1), или если диапазоны индексов параметра Vectors не совпадают с диапазонами индексов A. Ошибка Argument_Error возникает, если матрица A не симметрична. Ошибка Constraint_Error также может возникнуть в случаях, определённых реализацией, если используемый алгоритм не сходится достаточно быстро.
function Unit_Matrix (Order : Positive;
First_1, First_2 : Integer := 1) return Real_Matrix;
First_1, First_2 : Integer := 1) return Real_Matrix;
Эта функция возвращает квадратную единичную матрицу с Order**2 компонентами и нижними границами First_1 и First_2 (для первого и второго диапазонов индексов соответственно). Все компоненты равны 0.0, за исключением элементов главной диагонали, которые равны 1.0. Ошибка Constraint_Error возникает, если First_1 + Order – 1 > Integer'Last или First_2 + Order – 1 > Integer'Last.
Требования к реализации
Требования к точности для подпрограмм Solve, Inverse, Determinant, Eigenvalues и Eigensystem определены реализацией.
Для операций, не включающих скалярное произведение, требования к точности соответствуют соответствующим операциям типа Real как в строгом, так и в ослабленном режиме (см. G.2).
Для операций, включающих скалярное произведение, требования к точности в ослабленном режиме не заданы. В строгом режиме модуль абсолютной погрешности скалярного произведения X*Y не должен превышать g*abs(X)*abs(Y), где g определяется как
g = X'Length * Real'Machine_Radix**(1 – Real'Model_Mantissa)
Для L2-нормы требования к точности в ослабленном режиме не заданы. В строгом режиме относительная погрешность нормы не должна превышать g / 2.0 + 3.0 * Real'Model_Epsilon, где g определяется как выше.
Требования к документации
Реализации должны документировать любые приёмы, используемые для уменьшения ошибок округления, такие как арифметика с расширенной точностью.
Разрешения для реализации
Негенерические эквивалентные пакеты могут, но не обязаны быть фактическими инстанциациями генерического пакета для соответствующего предопределённого типа.
Рекомендации по реализации
Реализации должны реализовывать функции Solve и Inverse, используя устоявшиеся методы, такие как LU-разложение со сменой строк, за которым следует прямая и обратная подстановка. Реализации рекомендуется уточнять результат путём итерации по остаткам; если это делается, то это должно быть задокументировано.
Не предполагается, что необходимо принимать какие-либо специальные меры для определения того, является ли матрица плохо обусловленной. Естественно возникающее переполнение (включая деление на ноль), которое возникнет при выполнении этих функций с плохо обусловленной матрицей и, таким образом, вызовет ошибку Constraint_Error, достаточно.
Проверка того, является ли матрица симметричной, должна выполняться путём использования оператора равенства для сравнения соответствующих компонентов.
Реализация должна минимизировать обстоятельства, при которых алгоритм, используемый для Eigenvalues и Eigensystem, не сходится.