MAXIMA
Введение
MAXIMA --- свободная система компьютерной алгебры (СКА), написанная на языке Common LISP. Произошла от системы Macsyma, разрабатывавшейся в MIT с 1968 по 1982. Maxima имеет широчайший набор средств для проведения аналитических вычислений, численных вычислений и построения графиков.
Maxima имеет несколько графических интерфейсов пользователя и надстроек: XMaxima (для Linux), wxMaxima (основан на wxWidgets для ОС Windows). Однако для наших целей будет достаточно режима командной строки (с использованием псевдографики). Кроме того, мы будем работать в онлайн режиме, при котором вычисления производятся на удаленном сервере.
Перейдите по ссылке
http://maxima-online.org/
, чтобы открыть онлайн калькулятор на основе Maxima.
Команды Maxima вводятся в окно <>. Для выполнения вычислений нажмите кнопку <>. Результат вычислений появится ниже, как показано на рисунке:
Разберемся подробнее с работой системы Maxima. В консольном режиме работа с Maxima происходит в режиме <<вопрос --- ответ>>. Cтрока ввода начинается с (\%iN), а вывода - (\%oN), где N - порядковый номер в текущей операции. Однако в онлайн режиме есть свои особенности. В этом случае текст программы, записанный в <> отправляется на сервер, где выполняется построчно, после чего возвращается результат выполнения всей программы (внизу страницы) после <>. В итоге мы видим последовательность чередующихся строк (\%iN) и (\%oN), соответствующих вводу и выводу (input and output).
\begin{exer}
Для закрепления этого материала введите в область ввода следующие:
x : 5 * 100;
2 * x;
3 * x;
и нажмите <>.
\end{exer}
Перейдем к разбору синтаксиса Maxima.
Каждая введенная команда должна заканчиваться точкой с запятой (знаком <<;>>) (либо ). Кроме того, точка с запятой может разделять несколько независимых операций в одной строке (в целях компактности записи), например,
x : 2 + 2 ; y : 3 * x;
Стандартные математические операции обозначаются как обычно: +, -, *, /.
Для возведения в степень используются символы ^ либо **. Например, выражения 2^5 и 2**5 означают 2^5.
Квадратный корень вычисляется с помощью функции sqrt(). Например, sqrt(3) означается \sqrt{3}.
Факториал записывается как обычно, например 8!.
\begin{exer}
Вычислить: \\
1) 2 + 5 \times 4 - (8 - 2^2) / 2; \\
2) 2^{2^3} + 3! \cdot \sqrt{2^3 - \sqrt{3} }.
\end{exer}
Maxima является системой символьных вычислений (а не численных вычислений), т.е. по умолчанию вычисления производяется в аналическом виде --- точная арифметика (без округлений). Например, запись 1/3 будет означать именно рациональное число \frac{1}{3}. Результат вычисления 1/3+2/3 всегда даст 1.
\begin{exer}
Найти: 1) ~\frac{12}{17} + \frac{5}{13}; ~~~2) ~\dfrac{\frac{1}{2} \times \frac{3}{7} + \frac{2}{3} - \frac{4}{5}}{\frac{1}{2} + \frac{2^2}{5}}.
\end{exer}
Результат будет получен в виде рациональной дроби. Однако можно найти ее приближенное значение в виде конечной десятичной дроби с округлением до некоторого знака после запятой --- как число с плаващей точкой (запятой). Для этих целей используется функция float() либо с помощью флага numer, которые возвращают десятичную дробь с 16 значащимися знаками. Например,
float(1/3);
1/3, numer;
Обе команды дадут результат 0.3333333333333333. (Для расчетов повышенной точности используется функция bfloat. При этом количество значащих знаков задается переменной fpprec.)
Переменные и константы
Переменные
Переменные могут использоваться для хранения промежуточных результатов расчетов. Присваивание значения переменной осуществляется с помощью символа : (двоеточие). Например,
x : 22;
Далее эту переменную можно использовать в выражениях. При этом вместо переменной будет подставляться присвоенное ей ранее значение:
x : 22;
sqrt(x + 3);
Переменной можно присвоить новое значение (повторным присваиванием с помощью :), а также можно очисть ее значение с помощью функции kill(x).
Заметим, что регистр символов в Maxima имеет значение (x и X не одно и то же).
Константы
Основные встроенные константы:
%pi --- число \pi;
%e --- число e;
%i --- мнимая единица \sqrt{-1};
inf, minf --- + \infty и - \infty соответственно;
true, false --- логические истина и ложь.
Иногда для упрощения ввода удобно ввести собственные переменные pi, e, i, происвоив им значения соответствущих констант (правда, результат расчетов вс\"е равно будет отображаться со знаком %). Например,
pi : %pi;
i : %i;
e : %e;
e^(-3*pi*i);
Функции и преобразования
Математические функции
Помимо sqrt() в Maxima имется ряд встроенные математических функций, назначение которых должно быть очевидно из обозначений:
\begin{itemize}
\item sin, cos, tan, cot --- тригонометрические;
\item asin, acos, atan, acot --- обратные тригонометрические;
\item sinh, cosh, tanh, coth, sech, csch --- гиперболические;
\item log --- натуральный логарифм (ln), т.е. с оcнованием e;
\item sqrt --- \sqrt{~};
\item mod --- остаток от деления;
\item abs --- модуль или абсолютное значение числа; \\
и др.
\end{itemize}
\begin{exer}
Вычислить приближенное значение: \\
1) \sqrt{\sin(\frac{\pi}{2} - 2\pi)}; \\
2) |\sin(-\frac{3}{2} \pi)| + \cos(\sqrt{\ln 5}).
\end{exer}
Функции пользователя~
Для задания собственных функций используются оператор <<:=>>. Например,
f(x) := x^3 + 1;
g(x,y) := sqrt(x*y) - sin(y);
Определенные таким образом функции могут использовать в вычислениях наравне со встроенными функциями.
Для вычисления значения функции f в заданной точке a используется стандартная запись f(a). Например,
f(x) := x^3 + 1;
f(2);
вернет в результате число 9.
\begin{exer}
Вычислить 2 \cdot f(\sin(1), g(\frac{1}{2})), где g(t) = t^3 + 2 t^2 - 1 и f(t,p) = (p + 2 g(t-1))^2.
\end{exer}
% ответ 10.419 % g(t) := t^3 + 2*t^2 - 1; f(t,p) := (p + 2*g(t-1))^2; 2 * f(sin(1), g(1/2)), numer;
Вычисление выражений с помощью ev~
Функция ev() (означает evaluation) вычисляет или преобразует выражения при заданных условиях. Ее синтаксис следующий:
ev(expr, arg1, arg2, ..., argn),
где expr --- выражение, которое нужно вычислить. Аргументами arg1, ..., argn могут быть флаги, уравнения или функции.
Например,
ev((a+b)^2, a = x);
выполнит подстановку x вместо a в заданном выражении (a+b)^2, и вернет результат (x+b)^2.
Далее,
ev((a+b)^2, expand);
применит expand (раскрытие скобок) к (a+b)^2, и вернет результат b^2 + 2 b a + a^2.
На самом деле, писать имя функции ev() не обязательно, ее можно опустить, и записать предыдущие команды следующим образом:
(a+b)^2, a = x;
(a+b)^2, expand;
Результаты будут аналогичные. Поэтому будем далее опускать ev для сокращения записи.
Более того, в случае применения expand (и других подобных функций) к выражению можно использовать более привычную запись:
expand( (a+b)^2 );
Упрощение и преобразование выражений~
Для упрощения математических выражений в Maxima имеется большой набор различных встроенных функций (в программном смысле), таких как expand, factor, rat и т.д.
Раскрытие скобок~
expand --- выполняет то, что обычно называется <<раскрытием скобок>>, т.е. преобразует выражение в сумму произведений.
Общая форма имеет вид expand (expr, p, n), однако аргументы p и n не обязательны.
Выполните следующие код:
expr : (x+1)^2*(y+1)^3;
expand(expr);
expand(expr, 2);
Во втором случае в функции expand был задан второй аргумент p (=2), который определяет максимальную положительную степень, которая будет подвергнута разложению. Поскольку p=2, то (x+1)^2 будет разложен в сумму, но множитель (y+1)^3 эта операция не затронет. Третий аргумент n будет делать тоже самое для отрицательных степеней (в случае для дробей). Таким образом, процесс преобразований может контролироваться пользователем.
\begin{exer}
Раскрыть скобки: 1) (x-a)^2(y-b)(z-c);~~ 2) \dfrac{(y+1)^3}{(y+1)^2}.
\end{exer}
Факторизация~
factor --- выполняет факторизацию --- операцию, обратную к expand. А именно раскладывает исходное выражения на <<простые>> множители, т.е. представляет в виде произведения сомножителей. В качестве входного выражения могут быть числа, многочлены и т.п. Например,
factor(126);
вернет разложение числа 126 на множители: 2~ 3^2~ 7;
factor(x^3 - 1);
вернет (x-1)(x^2+x+1).
Функция factor выполняет разложение многочленов над полем действительных чисел \mathbb{R}. Для разложения над полем комплексным чисел \mathbb{C} используется функция gfactor.
Сравните результаты выполнения следующих команд:
factor(x^2 + 1);
gfactor(x^2 + 1);
\begin{exer}
Найти разложение на множители следующих выражений: \\
1) 2^{63} - 1;\\
2) -8y - 4x + z^2 (2y + x).
\end{exer}
Преобразование рациональных выражений~
Для работы с дробно-рациональными выражениями используются функции rat, ratsimple, fullratsimp и другие.
fullratsimp --- приводит исходное выражение к дробно-рациональному виду и выполняет все возможные упрощения.
Например,
ex : (3+x)*(2+2*x)/(1-x^2);
fullratsimp(ex);
вернет~ -\dfrac{2x+6}{x-1}.
Также имеются разновидности этой функции --- ratsimp и rat, которые не обязательно будут выполнять полное упрощение, а сделают это лишь частично. При необходимости ratsimp может быть применено повторно.
\begin{exer}
Примените несколько раз ratsimp к выражению \dfrac{ (x^{a/2} - 1)^2 (x^{a/2} + 1)^2 }{x^a - 1} (до тех пор, пока оно не перестанет меняться).
\end{exer}
ratexpand --- раскрывает скобки и приводит к каноническому виду.
Вообще, имеется множество различных оптий для упрощения рациональных выражений. Подробнее об этом можно прочитать здесь
http://wiki.linuxformat.ru/wiki/LXF83:Maxima
.
Преобразование тригонометрических выражений~
Для упрощения тригонометрических выражений используются функции trigexpand, trigreduce, trigsimp, trigrat и др.
trigexpand --- раскрывает скобки в тригонометрических выражениях;
trigreduce --- производит преобразования, понижая степени в тригоном. выражении;
trigsimp --- производит упрощения, применяя формулы \sin^2(x) + \cos^2(x)=1 и т.п.
\begin{exer}
1) Упростить выражение: \sin^2 x + 3 \cos^2 x; \\
2) Избавиться от степений в выражении: \cos^4 x + \cos^3 x + \cos^2 x + \cos x + 1.
\end{exer}
%@* Списки, массивы, матрицы~
Построение графиков функций~
Простейшая форма построения двухмерного графика функции выглядит так:
plot2d(функция, [переменная, начальное_значение, конечное_значение]);
Например, чтобы построить график функции f(x) на отрезке от x_0 до x_1 нужно ввести:
plot2d(f(x), [x, x0, x1]);
Пример: plot2d( sin(2*x), [x, -2 * %pi, 2 * %pi] );
При желании можно также указать диапазон по оси ординат:
plot2d(f(x), [x, x0, x1], [y, y0, y1]);
\begin{exer}
Построить график функции f(t) = \sqrt{t} \cos(t - \pi) + e^{-t/\pi} на отрезке [0, 20].
\end{exer}
\newpage
СПИСКИ, МАССИВЫ, МАТРИЦЫ
Maxima была написана на языке LISP (аббревиатура от LISt Processor). Поэтому списки будут часто встречаться при работе с Maxima.
Списки записываются в квадратных скобах. Элементы списка разделяются запятыми. Списки чем-то похожи на последовательности чисел. Разница в том, что элементами списков могут быть любые объекты, в том числе и другие списки (или даже тот же самый список! --- про это чуть позже).
Вот простой пример списка из трех чисел. Присвоим этому списку имя A:
A : [11, 12, 13];
Обращение к элементам списка осуществляется по их индексам с помощью квадратных скобок: ~~ имя_списка[индекс_элемента].
Нумерация элементов начинается с единицы, т.е. первый элементы имеет индекс 1 и т.д.
Например, код
A : [11, 12, 13];
A[1];
A[2] + A[3];
вернет 11 и 25.
Как сказано выше, списки могут содержать не только числа, но и любые другие данные. В качестве примера введите следующий код:
A : [6, x, y, 5, [1, 2, 3]];
A[1];
A[2];
A[5];
A[5][1];
Здесь A[5] будет вложенным списком [1, 2, 3], а A[5][1] выдаст 1-ый элемент этого списка.
Список может являться элементом самого себя. Например, можно написать следующей код:
x : [1, 2, x];
x[3];
x[3][3];
x[3][3][3];
x[3][3][3][2];
Здесь 3-м элементом x[3] списка x является сам список x. Поэтому повторное взятие 3-го элемента x[3][3] списка x[3] вернет снова список x, и т.д.
Существует множество функций для работы со списками:
\begin{itemize}
\item length --- количество элементов списка (т.е. его длину);
\item copylist(список) --- создает копию списка.
\item append(список1, список2, ... ) --- склеивает списки.
\item reverse(список) --- меняет порядок следования элементов на обратный.
\item member(элемент,список) --- возвращает true, и элемент входит в список, иначе false.
\end{itemize}
Проверить результат работы следующего кода:
list : [4, 5, [6, 7]];
reverse(list);
member(5, list);
member(6, list);
member([6, 7], list);
Далее, имеется ряд полезных функций для генерации новых списков:
\begin{itemize}
\item makelist(выражение, i, a, b) --- создание списка на основе заданного выражения при изменении переменной i от a до b.\\
Например, makelist(2*i, i, 1, 3) сгенерирует список [2, 4, 6].
\item makelist(выражение, x, список) --- создание списка на основе заданного выражения из исходного списка. \\
Например, makelist(a/x, x, [1,2,3,4]) создаст новый список [a, a/2, a/3, a/4].
\item create_list(выражение, x1, список1, x2, список2, ...) --- создание списка на основе заданного выражения из нескольких исходных списков. Работает так же, как и предыдущая функция makelist, но здесь уже может быть не одна, а несколько переменных x1, x2 и т.д. \\
Например, create_list(x+y, x, [1,2], y, [3,4]) вернет список [4, 5, 5, 6], состоящий из всех элементов вида x+y, где x=1,2 и y=3,4.
\end{itemize}
\begin{exer} Написать код для генерации следующих списков: \\
1) [e^2, e^4, e^6, e^8, e^{10}, e^{12}, e^{14}, e^{16}, e^{18}]; \\
2) [\sin(a c),~ \sin(a d),~ \sin(b c),~ \sin(b d)]; \\
2) [\frac{2}{3},~ \frac{1}{3},~ \frac{2}{9},~ \frac{1}{6},~ \frac{2}{15},~ \frac{1}{9}];
\end{exer}
Действия над элементами списка.
\begin{itemize}
\item product(выражение, i, a, b) --- перемножает выражения при изменении i от a до b. \\
Например, product(i+x, i, 0, 3) вернет результат x(x+1)(x+2)(x+3).
\item sum(выражение, i, a, b) --- суммирует выражения при изменении i от a до b. \\
Например, sum(x/i, i, 1, 3) вернет \frac{11x}{6} (т.е. результат суммирования x+x/2+x/3).
\item map(функция, выражение1, выражение2,...) --- применяет функцию (оператор, операцию) к последовательности выражений (по частям). \\
Так, map("=",[a,b,3],[1,-1,3]) вернет [a = 1, b = - 1, 3 = 3]; \\
map("*",[a,b,3],[1,-1,3]) вернет [a, -b, 9]; \\
(проделайте то же самое для бинарных операций +,-,/,^,<,>)
Форма записи map(f, список) ~работает подобно генераторам списков, применяя функцию f к каждому элементу списка, и возвращает новый список. Например, map( sqrt, [2, 3, x]) вернет список [\sqrt{2}, \sqrt{3}, \sqrt{x}].
Форма записи ~map(f, выражение)~ применяет функцию f к каждой части выражения. Например, \\
map(sqrt, x/y) вернет \frac{\sqrt{x}}{\sqrt{y}}; \\
map(sin, x + 3) вернет \sin(x) + \sin(3), а не \sin(x+3).
\item apply(функция, список) --- применяет функцию к заданному списку (преобразует список в аргументы функции). \\
Например, apply(max,[6,4,7,3]) вернет 7. Это равносильно записи max(6,4,7,3). Однако max([6,4,7,3]) означает несколько другое. \\ Таким образом, apply применяется в том случае, когда какой-то функции необходимо передать большое количество аргументов, хранящихся в виде списка. Типичный пример --- задан список, нужно найти минимальный и максимальный элементы:
list : makelist(2*x, x, -3, 2);
apply(max, list);
apply(min, list);
Еще один пример (когда задается собственная функция от нескольких аргументов):
f(x,y,z) := x + 2*y + 3*z;
list : makelist(i/2, i, 3, 5);
apply(f, list);
\end{itemize}
\begin{exer} Вычислить \sum\limits_{k=-5}^6 \frac{\sin(k)+2\cos(k)}{k^2} и \prod\limits_{k=-5}^6 \frac{\cos(k^2)}{k + e^k}.
\end{exer}
Использование списков
Списки широко применяются в Maxima.
1) При построении графиков функции для указания диапазона значений переменной x:
plot2d( cos(2*x) + sin(x), [x, -3, 4] );
2) Для построения нескольких графиков функций на одном рисунке:
plot2d( [ x^2, sin(x), cos(x) ], [x, -2, 2] );
3) Для задания матриц, например:
A : matrix( [1, 2, 3], [4, 5 ,6], [7, 8 ,9] );
--- здесь матрица A задается в виде перечисления ее строк.
Общая форма такая: matrix(row1, row2, ... ).
Операции над матрицами следующие:
+,-,*,/,^ выполняют операции поэлементно, т.е. C=A*B работает по формуле C_{ij} = A_{ij} \cdot B_{ij};
. и ^^ выполняют матричное умножение и матричное возведение в степень: A.B; A^^2;
\begin{exer} Для заданных двух матриц A и B найти их сумму, разность, произведение (поэлементное и матричное). Возвести матрицы в степень 2 и 3 двумя способами (матрично и поэлементно) --- сравнить результаты.
\end{exer}
A = \bbm -1 & 2 & -3 \\ -4 & 0 & 1 \\ 2 & -1 & 0 \ebm, ~~
B = \bbm \frac{1}{3} & -2 & -\frac{2}{3} \\ -2 & 1 & -\sqrt{3} \\ -3 & \sqrt{2} & 1 \ebm.
\newpage
%https://metanit.com/sharp/tutorial/1.2.php
\end{document}