Проект . Основные типы данных

Соглашение об именах

Выражения, моделирующие собой функции пространства , мы называем -функциями, не в честь пространства, а по имени пакета.

Выражения, моделирующие интегральные операторы из в , а точнее, их ядра, мы называем ядрами, не создавая терминологических конфликтов.

Все процедуры и глобальные переменные пакета имеют имена, начинающиеся с символов l2_. После них имена процедур имеют, как правило, прописные буквы K и/или F, указывающие на тип(ы) операндов, участвующих в операции, реализуемой процедурой: K для ядер (т.е. интегральных операторов) и F для -функций. Затем со строчной буквы следует обозначение реализуемой операции (в сокращенном виде).

Например, процедура для вычисления скалярного произведения двух -функций имеет имя l2_FinnerProd. Если бы была написана процедура для вычисления скалярного произведения ядер (в пространстве ), то она бы имела имя l2_KinnerProd.

Пакет содержит три специальные переменные. Границы интервала (ab) устанавливаются и хранятся в переменных l2_a и l2_b соответственно. Переменная l2_complex управляет выбором расчетных формул: для числового поля или . Эти переменные создаются и принимают свои значения при вызове процедуры l2_init.

Так как функции и ядра представляются не функциями, а выражениями, то две переменные, t и s, имеют сакральное значение для этого пакета, и не должны использоваться как-то иначе. Первая из них является универсальным обозначением аргумента всех рассматриваемых функций: x(t) –- а вторая используется вместе с первой для описания ядер интегральных операторов

Запрещено ограничивать переменные t и s предложением assume..., т.к. Maple V R4 не умеет subs переменные в выражениях, если они assumed.

-функции

Функции, являющиеся элементами пространства , описываются в нашем пакете кусочно-заданными выражениями. Они представляются в виде списка list

x := [B_0, E_1, B_1, E_2, B_2,...,E_n, B_n]:

где Bi – точки разбиения интервала (ab) на части, называемые здесь и далее границами. Ei -– выражения, по которым вычисляются значения функции x(t) для точек t в интервале (B_{i-1}B_i). Эти выражения обычно содержат переменную t.

Границы Bi должны составлять упорядоченную последовательность чисел (constant), причем должны выполняться неравенства

l2_a <= B_0 < B_n <= l2_b.

Эти условия можно проверить процедурой l2_Fcheck.

Если между l2_a и B_0 имеется строгое неравенство, это означает, что x(t) = 0 в интервале (aB_0). Аналогичное соглашение имеет место и для интервала (B_nb).

Список, состоящий ровно из одного элемента, как, например, [E], воспринимается, как функция, равная E на всем интервале (ab).

Если список x пуст или состоит из 2-х элементов, то это воспринимается как функция, тождественно равная 0.

Таким образом, для пространства (0, 3) выражения [ ][0], [0, 0, 3], [1, 0, 2], [1, 2t] означают одно и то же – тождественный ноль.

Пример: функцию

y(x) = |x - 1| - 1

из пространства (0, 2) можно задать в виде

y := [0, abs(t-1) - 1, 2]:

или в виде

y := [0, t, 1, 2-t, 2]:

Второй из способов предпочтительнее, т.к. меньше загружает Maple вычислительной работой.

Обратите внимание, что вместо аргумента x мы использовали специальную переменную t!

 

Ядра интегральных операторов

выражаются в виде списка list

x := [B_0, D_1, B_1, D_2, B_2,..., D_m, B_m]:

где B_i -– точки разбиения интервала (ab) на части, D_i -– списки, похожие на -функции. Разница в том, что в них в качестве аргумента используется переменная s вместо t, а t может возникать как параметр, от которого могут зависеть как границы, так и выражения списка Di.

Границы B_i должны составлять упорядоченную последовательность чисел (constant), причем должны выполняться неравенства

l2_a <= B_0 < B_m <= l2_b

Если между l2_a и B_0 имеется строгое неравенство, это означает, что K(ts) = 0 для t в интервале (aB_0) и всех s. Аналогичное соглашение имеет место и для отрезка (B_mb).

Если ядро выражено списком, состоящим ровно из одного элемента (списка), как, например, K := [D], то оно определяется списком D для всех t из интервала (ab).

Если список K пуст или состоит из 2-х элементов, то это воспринимается как ядро, тождественно равное 0.

Границы L_ij списка Di должны составлять последовательность линейных выражений вида

c_1 * t + c_0

где c_0 и c_1 – числа (constant), строго возрастающую при каждом t из интервала (B_{i-1}B_i).

Эти условия можно проверить процедурой l2_Kcheck.

Смысл всех этих элементов структуры ядра в следующем. Если

D_i = [L_i0, E_i1, L_i1, E_i2, L_i2,..., E_in, L_in],

где L_ij – границы, а E_ij -– выражения списка D_i, то они должны подбираться так, что

K(ts) = E_ij(ts), если B_{i-1} < t < B_i и L_i{j-1}(t) < s < L_ij(t).

Примеры: 1) оператор

в пространстве (0, 1) задается ядром

K := [0, [0, s, 1-t, 0, 1], 1]:

или, проще, в виде

K := [0, [0, s, 1-t], 1]:

2) Оператор

в пространстве (0, 3) задается ядром

K := [0, [0, s, t], 1, [], 2, [t], 3]:

Обратите внимание, что вместо аргумента x мы использовали специальную переменную t!