![]() |
Проект |
Соглашение об именах
Выражения, моделирующие собой функции пространства , мы называем
-функциями, не в честь пространства, а по имени пакета.
Выражения, моделирующие интегральные операторы из в
,
а точнее, их ядра, мы называем ядрами, не создавая терминологических конфликтов.
Все процедуры и глобальные переменные пакета имеют имена, начинающиеся
с символов l2_. После них имена процедур имеют, как правило, прописные буквы
K и/или F, указывающие на тип(ы) операндов,
участвующих в операции, реализуемой процедурой: K для ядер (т.е. интегральных
операторов) и F для -функций. Затем со строчной буквы
следует обозначение реализуемой операции (в сокращенном виде).
Например, процедура для вычисления скалярного произведения двух -функций
имеет имя l2_FinnerProd. Если бы была написана процедура для вычисления скалярного
произведения ядер (в пространстве
), то она бы имела имя l2_KinnerProd.
Пакет содержит три специальные переменные. Границы интервала (a, b) устанавливаются
и хранятся в переменных 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 – точки разбиения интервала (a, b) на части, называемые здесь и далее границами. 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 в интервале (a, B_0). Аналогичное соглашение имеет место и для интервала (B_n, b).
Список, состоящий ровно из одного элемента, как, например, [E], воспринимается, как функция, равная E на всем интервале (a, b).
Если список 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 -– точки разбиения интервала (a, b)
на части, D_i -– списки,
похожие на -функции. Разница в том, что в них в качестве аргумента используется
переменная s вместо t, а t
может возникать как параметр, от которого могут зависеть как границы, так и выражения списка Di.
Границы B_i должны составлять упорядоченную последовательность чисел (constant), причем должны выполняться неравенства
l2_a <= B_0 < B_m <= l2_b
Если между l2_a и B_0 имеется строгое неравенство, это означает, что K(t, s) = 0 для t в интервале (a, B_0) и всех s. Аналогичное соглашение имеет место и для отрезка (B_m, b).
Если ядро выражено списком, состоящим ровно из одного элемента (списка), как, например, K := [D], то оно определяется списком D для всех t из интервала (a, b).
Если список 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(t, s) = E_ij(t, s), если 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!