Модуль MVI_ARI
Интервальная векторно-матричная арифметика
В этом модуле предусмотрены все операции, функции и процедуры, необходимые для вычислений с интервальными векторами и матрицами.
Типы
Динамические типы для представления интервальных векторов и матриц, определенные как
type ivector = dynamic array [*] of interval;
imatrix = dynamic array [*] of ivector;
являются частью языкового ядра PASCAL-XSC. Фактические границы индексов устанавливаются при объявлении переменных этих типов.
Операции
Многие базовые интервальные векторно-матричные операции, применяемые в математике, являются в этом модуле предопределенными. В нем предусмотрены унарные операции +, — и четыре основные операции +, —, * и /, каждая с покомпонентным округлением до наименьшего включающего интервала. В некоторых случаях допускаются комбинации операндов разных типов. Операции + и — для интервальных векторов и матриц определяются покомпонентно следующим образом:
с := а ± Ь, где c[i] := a[i] ± b[i],
С := А ± В, где C[i,j] := A[i,j] ± B[i,j],
где а, b и с принадлежат к типу ivector, А, В и С — к типу imatrix.
Операции * и / определяются следующим образом:
s := а * Ь, где s := #* (for i := Ibound(a) to
ubound(a) sum (a[i]*b[i])),^ с := r * а, где c[i] := r * a[i],
с := a * г, где c[i] := a[i] * r,
с := a / г, где c[i] := a[i] / r,
|
с |
:= А* Ь, |
где |
c[i] |
:= A[i] * b,^ |
|
С |
:= г * А, |
где |
C[i,j] |
:= r * A[i,j], |
|
С |
:= А * г, |
где |
C[i,j] |
:= A[i,j] * r, |
|
С |
:= А / г, |
где |
C[i.j] |
:= A[i,j] / r, |
|
С |
:= А * В, |
где |
C[i.j] |
:= A[i] * B[*,j],* |
: скалярное
произведение с максимальной точностью,
где г и s принадлежат к типу interval, а, b и с — к типу ivector, А, В и С — к типу imatrix. Операции со смешанными типами операндов определяются соответствующим образом.
Операции отношения =, О, <, <=, >, >= определяются на основе операций = и <= в соответствии с (RD) (см. стр. 142). Если а и b принадлежат к типу ivector, А и В — к типу imatrix, то
а
А
b
В
a[i] A[i,j]
b[i] для всех i,
B[i,j] для всех i, j.
Операции в правых частях тождеств являются операциями для величин типа interval.
Кроме того, предусмотрены операторы in для отношений «содержится в» и «содержится внутри» и оператор >< для проверки на пустоту
|
Левый операнд |
Правый операнд |
|||||
|
integer real |
interval |
rvector |
ivector |
rmatrix |
imatrix |
|
|
унарные |
||||||
|
integer real |
* |
* |
||||
|
interval |
* |
* |
* |
* |
||
|
rvector |
*>/ |
+* |
о =, <>, in +* |
|||
|
ivector |
*,/ |
*,/ |
о +* |
О in, V, >< +*, ** |
||
|
rmatrix |
*,/ |
* |
+* |
о =, <>, in + * |
||
|
imatrix |
*,/ |
* |
* |
II t Л o V |
o in, V, >< +*, ** |
|
Операции модуля MVI_AR1 ое{ + , -, *}, v е {=, о, <, <=, >, >=} пересечения интервальных векторов и матриц. Эти операторы определяются покомпонентно.
Операции +* и ** обозначают интервальную оболочку и пересечение интервалов, как описано в разд. 3.2 (модуль I_ARI) для типа interval.
Пример 3.6.1.
Чтобы реализовать метод Рунге-Кутты, упомянутый в разд. 3.4 (модуль MV_ARI), с использованием интервальной арифметики, в исходную программу нужно внести лишь небольшие изменения. Переменные kl, к2, кЗ, к4, Y должны быть объявлены принадлежащими к типу ivcctor, а функция F должна быть определена с результатом типа ivcctor. Если при этом вместо модуля MV_ARI подключить модуль MVI_ARI, операторы
kl := h * F (х, Y);
k2 := h * F (х + h/2, Y + kl/2);
k3 := h * F (x + h/2, Y + k2/2);
k4 := h * F (x + h, Y + k3);
Y := Y + (kl + 2 * k2 + 2 * k3 + k4) / 6;
можно оставить без изменений. Все знаки операций обозначают теперь соответствующие интервальные операции. Несмотря на то, что полученный результат Y является интервалом, он не представляет собой включение точного решения обыкновенного дифференциального уравнения. Чтобы вычислить это включение, необходимо учесть погрешность метода, связанную с остановкой бесконечного математического процесса.
Функции преобразования типа для интервальных векторов
Следующие функции применяются для преобразований между типами rvector и ivector:
|
Функция |
Тип результата |
Значение |
|
intval (rvl,rv2) |
ivector |
Интервальный вектор iv, где iv[i] = intval(rvl[i], rv2[i]/*) |
|
intval (rv) |
ivector |
Интервальный вектор iv, где iv[i] = intval(rv[i]) |
|
inf (iv) |
rvector |
Вектор rv нижних границ, где rv[i] = inf(iv[i]) |
|
sup (iv) |
rvector |
Вектор rv верхних границ, где rv[i] — sup(iv[i]) |
rv, rvl, rv2 — выражения типа rvector, iv — выражение типа ivector : предполагается, что rvl <= rv2, иначе фиксируется ошибка.
Функции преобразования типа для интервальных матриц
Следующие функции применяются для преобразований между типами rmatrix и imatrix:
|
Функция |
Тип результата |
Значение |
|
intval (гМ1,гМ2) |
imatrix |
Интервальная матрица iM, где iM[i,j] = = intval(rMl [i, j], rM2[i, j]) (*) |
|
intval (гМ) |
imatrix |
Интервальная матрица iM, где iM[i,j] = intval(rM[i,j]) |
|
inf (iM) |
rmatrix |
Матрица rM нижних границ, где rM[i,j = inf(iM[i,j]) |
|
sup (iM) |
rmatrix |
Матрица гМ верхних границ, где rM[i, j] = sup(iM[i,j) |
гМ, гМ1, гМ2 — выражения типа rmatrix, iM — выражение типа imatrix bb : предполагается, что гМ1 <= гМ2, иначе фиксируется ошибка.
Совмещение операции присваивания
Покомпонентная инициализация переменных типов ivector и imatrix и преобразование типов из rvector в ivector и из rmatrix в imatrix могут осуществляться с помощью совмещенной операции присваивания:
|
Присваивание |
Значение |
||||||
|
iv |
:= r |
iv[j] |
:= |
intval |
(r) |
j = lb(iv),... |
,ub(iv) |
|
iv |
:= i |
iv[j] |
; = |
i |
j = lb(iv),... |
,ub(iv) |
|
|
iv |
:= rv |
iv |
: = |
intval |
(rv) |
||
|
iM |
:= r |
iM[j,k] |
:= |
intval |
(r) |
j = lb(iM,l),. k = lb(iM,2), |
..,ub(iM,l) ...,ub(iM,2) |
|
iM |
:= i |
iM[j,k] |
:= |
i |
j = lb(iM,l),. k = lb(iM,2), |
..,ub(iM,l) . ..,ub(iM,2) |
|
|
iM |
:= rM |
iM |
:= |
intval |
(rM) |
||
i — выражение типа interval, iv — переменная типа ivector, iM — переменная типа imatrix, г — выражение типа real, rv — выражение типа rvector, гМ — выражение типа rmatrix
Предопределенные функции
Предусмотрены функции id и null для порождения единичной матрицы и нулевой матрицы или нулевого вектора, а также функция transp для транспонирования матриц. Функции mid, diam и blow вычисляют среднюю точку, диаметр и эпсилон-расширение для каждой компоненты.
|
Функция |
Тип результата |
Значение |
|
null (iv) |
rvector |
Нулевой вектор с тем же индексным диапазоном, что и у iv |
|
null (iM) |
rmatrix |
Нулевая матрица с теми же индексными диапазонами, что и у iM |
|
null (iMl,iM2) |
rmatrix |
Нулевая матрица с теми же индексными диапазонами, что и у произведения iMl х iM2 |
|
id (iM) |
rmatrix |
Единичная матрица с теми же индексными диапазонами, что и у iM |
|
id (iMl,iM2) |
rmatrix |
Единичная матрица с теми же индексными диапазонами, что и у произведения iMl х iM2 |
|
mid (iv) |
rvector |
Вектор средних точек rv, где rv[i] = mid(iv[i]) |
|
diam (iv) |
rvector |
Вектор диаметров rv, где rv[i] = diam (iv[i]) |
|
mid (iM) |
rmatrix |
Матрица средних точек гМ, где rM[i,j = mid(iM[i,j]) |
|
diam (iM) |
rmatrix |
Матрица диаметров гМ, где = diam(iM[i, j) |
|
transp (iM) |
imatrix |
Транспонированная матрица iMt для матрицы iM с элементами iMt[i,j] = iMj, i] |
|
blow (iv,r) |
ivector |
Вектор эпсилон-расширений ive, где ive[i] = bkw(iv[i],r) |
|
blow (iM,r) |
imatrix |
Матрица эпсилон-расширений iMe, где = blow(iM[i, j], r) |
г — выражение типа real, iv, ive — выражения типа ivector, iM, iMl, iM2, iMt, iMe — выражения типа imatrix
Пример 3.6.2.
Интервальное включение для значения невязки
D — Е - R х А,
упомянутого в разд. 3.4 (модуль MV_ARI), можно вычислить, используя модуль MVI_ARI, переменные A, D и R типа imatrix и оператор
D := id (А) - R * А;
Наиболее точно включающую интервальную матрицу можно вычислить с помощью высокоточного выражения (см. разд. 2.4.4):
D := ## ( id (А) - R * А );
Процедуры ввода-вывода
В этом модуле предусмотрены процедуры
procedure read (var f: text; var a: ivector);
procedure read (var f: text; var A: imatrix);
procedure write (var f: text; a: ivector);
procedure write (var f: text; A: imatrix);
с необязательным параметром-файлом и произвольным количеством параметров ввода-вывода, но без спецификаций формата.
Интервальный вектор или интервальная матрица вводятся покомпонентно в соответствии с правилами ввода значений типа interval. Матрица вводится строка за строкой. Вывод интервального вектора или интервальной матрицы также выполняется покомпонентно в соответствии с форматом вывода для интервалов, принятым по умолчанию.