Основы Maxima
2.7 Типы данных, переменные и функции
Для хранения результатов промежуточных расчётов применяются переменные. Заметим, что при вводе названий переменных, функций и констант важен регистр букв, так переменные и
— две разные переменные. Присваивание значения переменной осуществляется с использованием символа : (двоеточие), например x:5. Если необходимо удалить значение переменной (очистить её), то применяется метод
:
— удалить значение переменной
;
— удалить значения всех используемых ранее переменных.
Зарезервированные слова, использование которых в качестве имён переменных вызывает синтаксическую ошибку: .
2.7.1 Списки
Списки — базовые строительные блоки для Maxima и Lisp. Все прочие типы данных (массивы, хэш-таблицы, числа) представляются как списки. Чтобы задать список, достаточно записать его элементы через запятую и ограничить запись квадратными скобками. Список может быть пустым или состоять из одного элемента.
(%i1) list1:[1,2,3,x,x+y];
![[1,2,3,x,y+x]\leqno{(\%o1) }](/sites/default/files/tex_cache/14a4bc0cf3454e9e65c0523275399f4e.png)
(%i2) list2:[];
![[]\leqno{(\%o2) }](/sites/default/files/tex_cache/10d9e3a7ac2779a1d56211c2664aea56.png)
(%i3) list3:[3];
![[3]\leqno{(\%o3) }](/sites/default/files/tex_cache/385d7faf5b1ae08f224e115161dbc2e7.png)
Элементом списка может и другой список
(%i4) list4:[1,2,[3,4],[5,6,7]];
![1,2,[3,4],[5,6,7]]\leqno{(\%o4) }](/sites/default/files/tex_cache/621805ffc11aefc10e759f6582cdf712.png)
Ссылка на элемент списка производится по номеру элемента списка:
(%i4) list4:[1,2,[3,4],[5,6,7]];
![[1,2,[3,4],[5,6,7]]\leqno{(\%o4) }](/sites/default/files/tex_cache/f1be2939fd0ad970d1fe32791e31298c.png)
(%i5) list4[1];

(%i6) list4[3];
![[3,4]\leqno{(\%o6) }](/sites/default/files/tex_cache/7e04b7e3ecda46d827354bd9c8758ea7.png)
(%i7) list4[3][2];

2.7.1.1 Функции для элементарных операций со списками
Функция возвращает число элементов списка (при этом элементы списка сами могут быть достаточно сложными конструкциями):
(%i8) length(list4);

(%i9) length(list3);

Функция возвращает копию списка expr:
(%i1) list1:[1,2,3,x,x+y];
![[1,2,3,x,y+x]\leqno{(\%o1) }](/sites/default/files/tex_cache/14a4bc0cf3454e9e65c0523275399f4e.png)
(%i2) list2:copylist(list1);
![[1,2,3,x,y+x]\leqno{(\%o2) }](/sites/default/files/tex_cache/6043b729d768424a1d3f1c89f4552283.png)
Функция создаёт список, каждый элемент которого генерируется из некоторого выражения. Возможны два варианта вызова этой функции:
-
— возвращает список,
-й элемент которого равен
, при этом индекс
меняется от
до
-
— возвращает список,
-й элемент которого равен
, при этом индекс
меняется от 1 до
.
Примеры:
(%i1) makelist(concat(x,i),i,1,6);
![[x1,x2,x3,x4,x5,x6]\leqno{(\%o1) }](/sites/default/files/tex_cache/d60260e50ccff4d096af376893a41c38.png)
(%i2) list:[1,2,3,4,5,6,7];
![[1,2,3,4,5,6,7]\leqno{(\%o2) }](/sites/default/files/tex_cache/df628f88bb540b4fa033a8b977f66fd7.png)
(%i3) makelist(exp(i),i,list);
![[e,{e}^{2},{e}^{3},{e}^{4},{e}^{5},{e}^{6},{e}^{7}]\leqno{(\%o3) }](/sites/default/files/tex_cache/9f931000be20e2796fe88c8db64eec56.png)
Во многом аналогичные действия выполняет функция

Эта функция строит список путём вычисления выражения , зависящего от
, к каждому элементу списка
(аналогично form, зависящая и от
, применяется к
и т.д.).
Пример:
(%i1) create_list(x^i,i,[1,3,7]);
![[x,{x}^{3},{x}^{7}]\leqno{(\%o1) }](/sites/default/files/tex_cache/157d637d946bed73d6882c8313ca9e60.png)
(%i2) create_list([i,j],i,[a,b],j,[e,f,h]);
![[[a,e],[a,f],[a,h],[b,e],[b,f],[b,h]]\leqno{(\%o2) }](/sites/default/files/tex_cache/fa443a20944c7278cfa3d9172b1e0bc7.png)
Функция append позволяет склеивать списки. При вызове
append (list_1, \dots, list_n)
возвращается один список, в котором за элементами следуют элементы
и т.д. вплоть до
.
Пример:
(%i1) append([1],[2,3],[4,5,6,7]);
![[1,2,3,4,5,6,7]\leqno{(\%o1) }](/sites/default/files/tex_cache/72968db2ba8af5da31e9409cac33b3c9.png)
Создать новый список, компонуя элементы двух списков поочерёдно в порядке следования, позволяет функция . Новый список содержит
, затем
, затем
и т.д.
Пример:
(%i1) join([1,2,3],[10,20,30]);
![[1,10,2,20,3,30]\leqno{(\%o1) }](/sites/default/files/tex_cache/c3591833d8d9313d80bbff378ca96ee9.png)
(%i2) join([1,2,3],[10,20,30,40]);
![[1,10,2,20,3,30]\leqno{(\%o2) }](/sites/default/files/tex_cache/4f6c048ee15515732ab466f136fc2c53.png)
Длина полученного списка ограничивается минимальной длиной списков и
.
Функция создаёт новый список, первым элементом которого будет
, а остальные — элементы списка
. Функция
также создаёт новый список, первые элементы которого — элементы списка
, а последний — новый элемент
.
Пример:
(%i1) cons(x,[1,2,3]);
![[x,1,2,3]\leqno{(\%o1) }](/sites/default/files/tex_cache/7bffe951877c50ee3dace4c526307f43.png)
(%i2) endcons(x,[1,2,3]);
![[1,2,3,x]\leqno{(\%o2) }](/sites/default/files/tex_cache/6ff4f20771871469182a44fc0fc901c2.png)
Функция меняет порядок элементов в списке на обратный
(%i5) list1:[1,2,3,x];
![[1,2,3,x]\leqno{(\%o5) }](/sites/default/files/tex_cache/321e93d35e24d9d588e286fdcc19a011.png)
(%i6) list2:reverse(list1);
![[x,3,2,1]\leqno{(\%o6) }](/sites/default/files/tex_cache/0fe1e890cc9f86fcf676202f7e63a667.png)
Функция возвращает
, если
является элементом списка
, и
в противном случае.
Пример:
(%i1) member (8, [8, 8.0, 8b0]);

(%i2) member (8, [8.0, 8b0]);

(%i3) member (b, [[a, b], [b, c]]);

(%i4) member ([b, c], [[a, b], [b, c]]);

Функция выделяет остаток после удаления первого элемента списка
. Можно удалить первые n элементов, используя вызов
. Функция
выделяет последний элемент списка
(аналогично
— первый элемент списка).
Примеры:
(%i1) list1:[1,2,3,4,a,b];
![[1,2,3,4,a,b]\leqno{(\%o1) }](/sites/default/files/tex_cache/360da5772b6c0a7db5e8eb6d90d74924.png)
(%i2) rest(list1);
![[2,3,4,a,b]\leqno{(\%o2) }](/sites/default/files/tex_cache/1a6d2337ba20c19f2c7d54cdd5e9b395.png)
(%i3) rest(%);
![[3,4,a,b]\leqno{(\%o3) }](/sites/default/files/tex_cache/3364f6123e484ce547cfb5eaa2bbf6fb.png)
(%i4) last(list1);

(%i5) rest(list1,3);
![[4,a,b]\leqno{(\%o5) }](/sites/default/files/tex_cache/e3d715ca4423cf92e3570596aa04c242.png)
Суммирование и перемножение списков (как и прочих выражений) осуществляется функциями и
. Функция
суммирует значения выражения expr при изменении индекса
от
до
. Функция
перемножает значения выражения
при изменении индекса
от
до
.
Пример:
(%i1) product (x + i*(i+1)/2, i, 1, 4);

(%i2) sum (x + i*(i+1)/2, i, 1, 4);

(%i3) product (i^2, i, 1, 4);

(%i4) sum (i^2, i, 1, 4);

2.7.1.2 Функции, оперирующие с элементами списков
Функция позволяет применить функцию (оператор, символ операции)
к частям выражений
. При использовании со списками применяет
к каждому элементу списка. Следует обратить внимание, что
— именно имя функции (без указания переменных, от которых она зависит).
Примеры:
(%i1) map(ratsimp, x/(x^2+x)+(y^2+y)/y);

(%i2) map("=",[a,b],[-0.5,3]);
![[a=-0.5,b=3]\leqno{(\%o2) }](/sites/default/files/tex_cache/71282fab271e7c6e0f3f60c93bd71fef.png)
(%i3) map(exp,[0,1,2,3,4,5]);
![[1,e,{e}^{2},{e}^{3},{e}^{4},{e}^{5}]\leqno{(\%o3) }](/sites/default/files/tex_cache/585e63f3285b80366c9a573f5d35f1e1.png)
Функция может быть и заданной пользователем, например:
(%i5) f(x):=x^2;

(%i6) map(f,[1,2,3,4,5]);
![[1,4,9,16,25]\leqno{(\%o6) }](/sites/default/files/tex_cache/a9b8cbf6ea936329c1834a9b62e3f120.png)
Функция применяет заданную функцию ко всему списку (список становится списком аргументов функции; при вызове (
вычисляется выражение
). Следует учитывать, что
не распознаёт ординарные функции и функции от массива.
Пример:
(%i1) L : [1, 5, -10.2, 4, 3];
![[1,5,-10.2,4,3]\leqno{(\%o1) }](/sites/default/files/tex_cache/77cd38c62709e4978f63659e1aa6837a.png)
(%i2) apply(max,L);

(%i3) apply(min,L);

Чтобы найти максимальный или минимальный элемент набора чисел, надо вызвать функции max или min. Однако, обе функции в качестве аргумента ожидают несколько чисел, а не список, составленный из чисел. Применять подобные функции к спискам и позволяет функция .