Основы Maxima
2.7 Типы данных, переменные и функции
Для хранения результатов промежуточных расчётов применяются переменные. Заметим, что при вводе названий переменных, функций и констант важен регистр букв, так переменные и — две разные переменные. Присваивание значения переменной осуществляется с использованием символа : (двоеточие), например x:5. Если необходимо удалить значение переменной (очистить её), то применяется метод :
— удалить значение переменной ;
— удалить значения всех используемых ранее переменных.
Зарезервированные слова, использование которых в качестве имён переменных вызывает синтаксическую ошибку: .
2.7.1 Списки
Списки — базовые строительные блоки для Maxima и Lisp. Все прочие типы данных (массивы, хэш-таблицы, числа) представляются как списки. Чтобы задать список, достаточно записать его элементы через запятую и ограничить запись квадратными скобками. Список может быть пустым или состоять из одного элемента.
(%i1) list1:[1,2,3,x,x+y];
(%i2) list2:[];
(%i3) list3:[3];
Элементом списка может и другой список
(%i4) list4:[1,2,[3,4],[5,6,7]];
Ссылка на элемент списка производится по номеру элемента списка:
(%i4) list4:[1,2,[3,4],[5,6,7]];
(%i5) list4[1];
(%i6) list4[3];
(%i7) list4[3][2];
2.7.1.1 Функции для элементарных операций со списками
Функция возвращает число элементов списка (при этом элементы списка сами могут быть достаточно сложными конструкциями):
(%i8) length(list4);
(%i9) length(list3);
Функция возвращает копию списка expr:
(%i1) list1:[1,2,3,x,x+y];
(%i2) list2:copylist(list1);
Функция создаёт список, каждый элемент которого генерируется из некоторого выражения. Возможны два варианта вызова этой функции:
- — возвращает список, -й элемент которого равен , при этом индекс меняется от до
- — возвращает список, -й элемент которого равен , при этом индекс меняется от 1 до .
Примеры:
(%i1) makelist(concat(x,i),i,1,6);
(%i2) list:[1,2,3,4,5,6,7];
(%i3) makelist(exp(i),i,list);
Во многом аналогичные действия выполняет функция
Эта функция строит список путём вычисления выражения , зависящего от , к каждому элементу списка (аналогично form, зависящая и от , применяется к и т.д.).
Пример:
(%i1) create_list(x^i,i,[1,3,7]);
(%i2) create_list([i,j],i,[a,b],j,[e,f,h]);
Функция append позволяет склеивать списки. При вызове
append (list_1, \dots, list_n)
возвращается один список, в котором за элементами следуют элементы и т.д. вплоть до .
Пример:
(%i1) append([1],[2,3],[4,5,6,7]);
Создать новый список, компонуя элементы двух списков поочерёдно в порядке следования, позволяет функция . Новый список содержит , затем , затем и т.д.
Пример:
(%i1) join([1,2,3],[10,20,30]);
(%i2) join([1,2,3],[10,20,30,40]);
Длина полученного списка ограничивается минимальной длиной списков и .
Функция создаёт новый список, первым элементом которого будет , а остальные — элементы списка . Функция также создаёт новый список, первые элементы которого — элементы списка , а последний — новый элемент .
Пример:
(%i1) cons(x,[1,2,3]);
(%i2) endcons(x,[1,2,3]);
Функция меняет порядок элементов в списке на обратный
(%i5) list1:[1,2,3,x];
(%i6) list2:reverse(list1);
Функция возвращает , если является элементом списка , и в противном случае.
Пример:
(%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];
(%i2) rest(list1);
(%i3) rest(%);
(%i4) last(list1);
(%i5) rest(list1,3);
Суммирование и перемножение списков (как и прочих выражений) осуществляется функциями и . Функция суммирует значения выражения 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]);
(%i3) map(exp,[0,1,2,3,4,5]);
Функция может быть и заданной пользователем, например:
(%i5) f(x):=x^2;
(%i6) map(f,[1,2,3,4,5]);
Функция применяет заданную функцию ко всему списку (список становится списком аргументов функции; при вызове ( вычисляется выражение ). Следует учитывать, что не распознаёт ординарные функции и функции от массива.
Пример:
(%i1) L : [1, 5, -10.2, 4, 3];
(%i2) apply(max,L);
(%i3) apply(min,L);
Чтобы найти максимальный или минимальный элемент набора чисел, надо вызвать функции max или min. Однако, обе функции в качестве аргумента ожидают несколько чисел, а не список, составленный из чисел. Применять подобные функции к спискам и позволяет функция .