На главную страницу | Новости  |  Ссылки | Контакты

Spyphy Farnsworth
Квантовая реальность. Кибернетика. Искусственный интеллект


MAXIMA


Введение


MAXIMA --- свободная система компьютерной алгебры (СКА), написанная на языке Common LISP. Произошла от системы Macsyma, разрабатывавшейся в MIT с 1968 по 1982. Maxima имеет широчайший набор средств для проведения аналитических вычислений, численных вычислений и построения графиков.

Maxima имеет несколько графических интерфейсов пользователя и надстроек: XMaxima (для Linux), wxMaxima (основан на wxWidgets для ОС Windows). Однако для наших целей будет достаточно режима командной строки (с использованием псевдографики). Кроме того, мы будем работать в онлайн режиме, при котором вычисления производятся на удаленном сервере.

Перейдите по ссылке

http://maxima-online.org/

, чтобы открыть онлайн калькулятор на основе Maxima.

Команды 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}





galaxy