Основы Maxima
2.7.2 Массивы
Массивы в Maxima — совокупности однотипных объектов с индексами. Число индексов не должно превышать пяти. В Maxima существуют и функции с индексами (функции массива).
Возможно создание и использование переменных с индексами до объявления соответствующего массива. Такие переменные рассматриваются как элементы массивов с неопределёнными размерностями (так называемые хэш-массивы). Размеры неопределённых массивов растут динамически по мере присваивания значений элементам. Интересно, что индексы массивов с неопределёнными границами не обязательно должны быть числами. Для повышения эффективности вычислений рекомендуется преобразовывать массивы с неопределёнными границами в обычные массивы (для этого используется функция ).
Создание массива производится функцией array. Синтаксис обращения к функции: — создание массива с именем name и размерностями ; array(name,type,dim_1,... ,dim_n) — создание массива с именем name и элементами типа ; — создание нескольких массивов одинаковой размерноcти.
Индексы обычного массива — целые числа, изменяющиеся от 0 до .
Пример:
(%i1) array(a,1,1);
(%i2) a[0,0]:0; a[0,1]:1; a[1,0]:2; a[1,1]:3;
(%i6) listarray(a);
Функция , использованная в примере, преобразует массив в список. Синтаксис вызова: .
Аргумент может быть определённым или неопределённым массивом, функцией массива или функцией с индексами. Порядок включения элементов массива в список — по строкам.
Функция выводит информацию о массиве . Синтаксис вызова: Аргумент , как и в случае , может быть определённым или неопределённым массивом, функцией массива или функцией с индексами.
Пример использования:
(%i1) array (aa, 2, 3);
(%i2) aa [2, 3] : %pi;
(%i3) aa [1, 2] : %e;
(%i4) arrayinfo (aa);
(%i5) bb [FOO] : (a + b)^2;
(%i6) bb [BAR] : (c - d)^3;
(%i7) arrayinfo (bb);
(%i8) listarray (bb);
Функции и применимы и к функциям массива:
(%i9) cc [x, y] := y / x;
(%i10) cc[1,2];
(%i11) cc[2,1];
(%i12) arrayinfo(cc);
(%i13) listarray(cc);
Ещё один пример — создание и вывод информации о функциях с индексами:
(%i1) dd [x] (y) := y ^ x;
(%i2) dd[1](4);
(%i3) dd[a+b];
(%i4) arrayinfo(dd);
(%i5) listarray(dd);
Функция создаёт и возвращает массив Lisp. Тип массива может быть . Индекс может изменяться в пределах от 0 до .
Достоинство по сравнению с — возможность динамически управлять распределением памяти для массивов. Присваивание создаёт ссылку на массив. Когда массив больше не нужен, ссылка уничтожается присваиванием , память освобождается затем сборщиком мусора.
Примеры:
(%i1) A1 : make_array (fixnum, 8);
(%i2) A1[1]:8;
(%i3) A3 : make_array (any, 8);
(%i4) arrayinfo(A3);
Переменная содержит список имён массивов первого и второго видов, определённых на данный момент.
Пример:
(%i1) array(a,1,1);
(%i2) array(b,2,3);
(%i3) arrays;
Функция позволяет заполнять массивы значениями из другого массива или списка. Заполнения производится по строкам.
Примеры:
(%i1) array(a,1,1);
(%i2) fillarray(a,[1,2,3,4]);
(%i3) a[1,1];
(%i4) a2 : make_array (fixnum, 8);
(%i5) fillarray (a2, [1, 2, 3, 4, 5]);
Как видно из рассмотренных примеров, длина списка может и не совпадать с размерностью массива. Если указан тип массива, он должен заполняться элементами того же типа. Удаление массивов из памяти осуществляется функцией .
Кроме того, для изменения размерности массива имеется функция . Новый массив заполняется элементами старого по строкам. Если размер старого массива меньше, чем нового, остаток нового заполняется нулями или (в зависимости от типа массива).
2.7.3 Матрицы и простейшие операции с ними
В Maxima определены прямоугольные матрицы.
Основной способ создания матриц — использования функции matrix. Синтаксис вызова: . Каждая строка — список выражений, все строки одинаковой длины. На множестве матриц определены операции сложения, вычитания, умножения и деления. Эти операции выполняются поэлементно, если операнды — две матрицы, скаляр и матрица или матрица и скаляр. Возведение в степень возможно, если один из операндов — скаляр. Перемножение матриц (в общем случае некоммутативная операция) обозначается символом ". ". Операция умножения матрицы самой на себя может рассматриваться как возведение в степень. Возведение в степень -1 — как обращение (если это возможно).
Пример создания двух матриц:
(%i1) x: matrix ([17, 3], [-8, 11]);
(%i2) y: matrix ([%pi, %e], [a, b]);
Выполнение арифметических операций с матрицами:
(%i3) x+y;
(%i4) x-y;
(%i5) x*y;
(%i6) x/y;
Обратите внимание — операции выполняются поэлементно. При попытке выполнять арифметические операции, как представлено выше, над матрицами различных размеров, выдаётся ошибка.
Пример операций с матрицами и скалярами:
(%i9) x^3;
(%i10) 3^x;
Умножение матрицы на матрицу:
(%i11) x.y;
(%i12) y.x;
Очевидно, что для успешного перемножения матрицы должны быть согласованы по размерам. Возведение в степень -1 даёт обратную матрицу:
(%i13) x^^-1;
(%i14) x.(x^^-1);
Стоит обратить внимание, что операции x^^-1 и x^-1 дают разный результат!
Пример:
(%i2) x^-1;
(%i3) x^^-1;
Функция возвращает матрицу заданной размерности, составленную из элементов двухиндексного массива. Синтаксис вызова:
Индексы и указывают левый и правый нижний элементы матрицы в исходном массиве.
Пример:
(%i1) h [i, j] := 1 / (i + j - 1);
(%i2) genmatrix(h,3,3);
(%i3) array (a, fixnum, 2, 2);
(%i4) a [1, 1] : %e;
(%i5) a [2, 2] : %pi;
(%i6) genmatrix (a, 2, 2);
Функция возвращает матрицу заданной размерности, составленную из нулей (синтаксис вызова ).
(%i7) zeromatrix(2,2);
Функция возвращает единичную матрицу заданной размерности (синтаксис )
(%i9) ident(2);
Функция создаёт копию матрицы . Обратите внимание, что присваивание не создаёт копии матрицы (как и присваивание не создаёт копии списка).
Пример:
(%i1) a:matrix([1,2],[3,4]);
(%i2) b:a;
(%i3) b[2,2]:10;
(%i4) a;
Присваивание нового значения элементу матрицы изменяет и значение соответствующего элемента матрицы . Использование позволяет избежать этого эффекта.
Функции и позволят извлечь соответственно строку и столбец заданной матрицы, получая список. Синтаксис вызова:
- — возвращает -ю строку;
- — возвращает -й столбец.
Функции и добавляют к матрице строку или столбец соответственно. Синтаксис вызова:
Здесь — добавляемые строки или столбцы.
Пример:
(%i1) a:matrix([1,2],[3,4]);
(%i2) b:addrow(a,[10,20]);
(%i3) addcol(b,[x,y,z]);
Функция возвращает новую матрицу, состоящую из подматрицы заданной. Синтаксис вызова:
Подматрица строится следующим образом: из матрицы удаляются строки и .
Пример (используем последний результат из предыдущего примера, удаляем третью строку и третий столбец):
(%i6) submatrix(3,%,3);
Для заполнения матрицы значениями некоторой функции используется функция (аналог ). Синтаксис вызова: matrixmap(f,M). Функция matrixmap возвращает матрицу с элементами , равными .
Пример:
(%i1) a:matrix([1,2],[3,4]);
(%i2) f(x):=x^2;
(%i3) matrixmap(f,a);
Для работы с матрицами существует ещё много функций, но они относятся к решению различных задач линейной алгебры, поэтому обсуждаются ниже, в главе 3.2.