Функции и команды системы Maxima. Функции в Maxima Maximo свойства системы история значений

23.03.2024 Сетевое оборудование

При вводе каждой команде и результату, как уже отмечалось выше, присваивается порядковый номер.

Используемый стиль обозначений позволяет при дальнейшей записи команд сослаться на ранее полученные результаты, например, таким образом (% o 1)*(% o 2) – результаты требуется перемножить.

Для последнего ответа в Maxima есть специальное обозначение%. А для последней команды _ (знак подчёркивания).

Пример : Вычислить значение функции в точках x = a , и вычислить .

Команда (%i1) была выполнена (появился результат %о1) и была определена функция . Поэтому следующие две команды (%i2) и (%i3) вызывали (хотя и по-разному) эту функцию, чтобы рассчитать значения в заданных точках. Из (%i4) видно, что ссылку на строку результата (%о2) можно писать и без скобок ().

Основные математические операции в Maxima обозначаются обычным образом: +, –, *, /. Возведение в степень для удобства предусмотрено записывать тремя разными способами ^, ^^, **. Знак присвоения – это двоеточие «: », команду для Maxima «а:2;» следует читать следующим образом: «переменной а присвоить число 2». В конце команды кроме точки с запятой «; » допустимо ставить знак доллара $. При наличии точки с запятой результат выводится на экран, при наличии доллара результат не выводится на экран, исключение составляют команды для вывода графиков, заканчивающиеся долларом, но выводящие на экран график.

3.1. Переменные в Максима

Переменные в Maxima могут хранить символы, аналитические выражения, определения функций, логические значения «true», «false», списки, уравнения, строки текста, заключенного в двойные кавычки, в составе которого имеются кириллические символы, и, конечно же, числа: целые, рациональные дроби, вещественные фиксированной точности и вещественные с плавающей точкой неограниченной точности типа %pi.

Из следующего примера видно, что Maxima вполне законченный математик, для неё переменная х и нечто – никому непонятный объект ″Петя″ – ничем не отличаются. Maxima

В этом примере Maxima разделила (″Петя″2–4)/(″Петя″–2) и получила ″Петя″+2. Затем из ″Петя″+2 Maxima отняла ″Петя″ и в итоге получила целое число 2.

3.2. Возможные ошибки вычислений

Из следующего примера следует, что в операциях с числами Maxima «ручается» только за 16 значащих цифр и «ничто компьютерное ей не чуждо», у неё тоже имеются чисто вычислительные проблемы (см. %о3) с округлением при вычислениях.

Дело в том, что в приведённых примерах Maxima производит вычисления не целыми числами, а с приближенными. Расчеты производятся не в десятичной системе и не путем формальной замены деления введением множителя 10 –5 . Деление производится реально в двоичной системе. Приближенные числа имеют стандартную длину, плавающую запятую. Результаты округляются так, чтобы оставались 16 значащих цифр.

В данном примере появившаяся неожиданная ″ добавка ″ незначительна и составляет всего 0,3*10 –21 .

В следующем примере она значительно больше. Но, как и в предыдущем случае, также является следствием технических возможностей компьютера при осуществлении арифметических операциях с плавающей запятой

За счет реального выполнения арифметических вычислений, результаты оказываются неточными: ответы %о3 и %о4 отличаются от нуля.

3.3. Записьуравнений

Если записанная команда содержит знак равенства, Maxima рассматривает её как уравнение, от левой и правой части которого можно отнять одну и ту же величину, и можно обе части уравнения умножить на одну и ту же величину, при умножении двух уравнений отдельно перемножаются их левые и правые части.

3.4. Неопределённая форма выражений

Выражения в Maxima могут иметь две формы: действующую и неопределённую . В тех случаях, когда выражение надо лишь отобразить, а не вычислить (неопределённая форма ) , перед ним следует поставить знак (одинарная кавычка). Например, мы пожелали отобразить то самое задание, которое мы увидели первым в окне XMaxima , поэтому скопируем текст задания, добавим кавычку, и вызовем интерпретатор. Получим

откуда видим, что первый пример в окне XMaxima посвящен вычислению представленного здесь интеграла.

Однако, указанный метод не сработает, если выражение имеет явное значение, например, выражение sin(π ) Maxima рассматривает как нуль и при наличии апострофа. Соответственно co s(2 π ) для Maxima в точности равен единице.

С другой стороны, чтобы принудительно заставить выражение вычислить, то есть перевести его в действующую форму, следует поставить одиночную кавычку два раза (применить оператор действующей формы – ′′ ).

3.5. Вызов справки

Трудно предусмотреть многообразие возможных вариантов записи команд с целью использования Maxima для расчета или преобразования выражений. В сложных случаях можно попытаться получить справку на английском языке.

Для вызова справки следует написать? topic и вызвать интерпретатор нажатием Shift +Enter , где topic – эта ключевое слов (тема) справки.

Команда?? topic вызывает поиск по всем темам справки, содержащим ключевое слово topic .

В следующем примере мы хотели спросить про знак факториала, но не поставили пробел после знака вопроса (ошиблись). Maxima ответила, что не существует точно такой, как в запросе, ( exact match ) темы.

И посоветовала попытаться (Try ) вторично (??) спросить с целью получения не вполне точного ответа. О том, что ответ был неудовлетворителен, Maxima сообщила в виде false в строке ответа (%о1).

В следующем вопросе мы также ошиблись (опять не поставили пробел), но хотели спросить про функцию cos (x ), получилось непонятно для программы и поэтому вообще никакого ответа не получили.

В случае с факториалом (!) при вторичном запросе Maxima дала исчерпывающий ответ (который мы немного сократили)

В ответе Maxima сначала создала нумерованный список ответов (в данном случае у неё два номера 0 и 1), затем предложила ввести разделённые пробелом ( space - separated ) номера разделов или указать все ( all ) или никакие (none ) из них. После уточнения (а ), которое она поняла как ( all ), Maxima напечатала справку по запрашиваемое теме "факториал".

3.6. Ввод числовой информации

Правила ввода чисел в Maxima точно такие, как и для многих других подобных программах. Целая и дробная часть десятичных дробей разделяются символом точка . Перед отрицательными числами ставится знак минус . Числитель и знаменатель обыкновенных дробей разделяются при помощи символа / (прямой слэш ).

Обратите внимание, что если в результате выполнения операции получается некоторое символьное выражение, а необходимо получить конкретное числовое значение в виде десятичной дроби, то решить эту задачу позволит применение опции numer . В частности, опция numer позволяет перейти от обыкновенных дробей к десятичным:

Здесь Maxima прежде всего действовала по умолчанию. Она сложила дроби 3/7 и 5/3 по правилам арифметики точно: нашла и привела дроби к общему знаменателю и сложила числители. В итоге она получила 44/21. Лишь после того, как мы попросили её получить численный ответ, она вывела приближенный, с точностью 16 знаков, численный ответ 2,095238095238095.

3.7. Возведение в степень и старшинство операций

Как уже отмечалось выше, обозначения арифметических операций в Maxima не отличаются от классического представления, используются те же математические знаки: + – * /. Но возведение в степень предусмотрено обозначать тремя способами: ^ , ^^ , **.

Извлечение квадратного корня производит функция sqrt(),извлечение корня степени n записывают как степень ^^(1/n ).

В Maxima определены стандартные операции – нахождение факториала числа, (например, 6! = 1 · 2 · 3 · 4 · 5 · 6 = 120) и нахождение двойного факториала (например, 6!! =2 · 4 · 6 = 48; 7! = 1 · 3 · 5 ·7 = 105).

Для увеличения приоритета операции при записи команд для Maxima используют круглые () скобки.

Как видно из приведённых результатов вычислений (%о13)–(%iо5), Maxima правильно понимает старшинство операций: сначалавыполнила возведение в степень и только потом операцию деления. Выполняя команду (%i13), она возвела в степень 1 и разделила результат на 3, но при выполнении команды (%i14) вычислила корень третьей степени, результат (%о15) равен произведению (%о13) и (%о14).

3.8. Константы

В Maxima для удобства вычислений есть ряд встроенных констант, самые распространенные из них показаны в следующей таблице (табл. 1):

Таблица 1

Названия констант и их обозначение в Maxima

Название

Обозначение

π (число Пифагора)

e (Эйлерово число)

Мнимая единица ()

+∞ (плюс бесконечность)

– ∞ (минус бесконечность)

minf

Истина

true

Ложь

false

Комплексная бесконечность

infinity

слева (в отношении пределов)

minus

справа (в отношении пределов)

plus

Золотое сечение ()

%phi

3.9. Переменные и выражения

Для хранения результатов промежуточных расчетов используются переменные. Заметим, что при вводе названий переменных, функций и констант важен регистр букв. Так, переменные x и X – это две разные переменные.

Присваивание значения переменной осуществляется с использованием символа : (двоеточие), например x: 5.

Если необходимо удалить значение переменной (очистить ее), то применяется метод kill : kill (x ) – удаляет значение переменной x, а команда kill(all) – удаляет значения всех используемых ранее переменных. И, кроме того, метод kill начинает новую нумерацию для исполняемых команд (обратите внимание, что ответом на команду (%i3), приведенную ниже, оказался ответ с номером ноль (%o0) done , и далее нумерация команд снова началась с единицы).

Напомним также, что в одной строке (см. % i 1), можно записать несколько команд, разделяя последние символом ; (точка с запятой) или знаком $ (доллар), если нам не требуется вывод результата на монитор.

Математические операции в Maxima используются для записи выражений. Всё в Maxima является выражениями, в том числе математические выражения как таковые, а также объекты и программные блоки. Простейшее выражение представляет собой атом, либо оператор с аргументами.

Атом - символ (имя), строка в двойных кавычках, либо число (целое или с плавающей точкой). Все выражения не-атомы представляются в виде oper (a1 ,.., aN ), где oper - имя оператора, a1,..., aN - его аргументы. Выражения могут отображаться по-разному, но внутреннее представление всегда одинаково. Аргументы выражения могут быть атомами, либо выражениями не-атомами.

Команда op возвращает оператор, args возвращает аргументы, atom определяет, является ли выражение атомом.

Например :

Функция symbolp возвращает «true», если её аргумент является символом.

Функция двух аргументов freeof(,) возвращает «true», если второй её аргумент свободен (не содержит) первого аргумента.

Функция zeroequiv(,) проверяет, является ли её аргумент –функция одного аргумента – нулём. Zeroequiv возвращает «true», если её аргумент равен нулю и «false» в противном случае.

Функция zeroequiv может быть полезной в тех случаях, когда в результате ряда преобразований нет уверенности в том, что полученная функция тождественна исходной.

3.10. Математические функции

В Maxima имеется большой набор встроенных математических функций. Наиболее часто используемые приведены в табл. 2.

Таблица 2

Встроенные математические функции Maxima

Функции

Обозначение

Тригонометрические

sin (синус),

cos (косинус),

tan (тангенс),

cot (котангенс)

Обратные

тригонометрические

asin (арксинус),

acos (арккосинус),

atan (арктангенс),

acot (арккотангенс)

Секонс, косеконс

sec (x) = 1/cos (x), (секонс ),

csc (x) = 1/sin (x), (косеконс )

Натуральный логарифм

log()

квадратный корень

sqrt()

модуль

abs()

остаток от деления

mod(,)

Минимальный из списка

min(x1, ... ,xN)

Максимальный из списка

max(x1, ... ,xN)

Знак аргумента

Pos (x>0),

Zero (x=0),

sign(x); = neg (x<0),

Pnz – (не определен)

Случайное число

random (N ) – целое, из промежутка

если N –целое

random (float (P )) – число с плавающей точкой

Следует иметь в виду, что некоторые названия функций отличаются от названий, используемых в отечественной литературе. В Maxima используется вместо tg – tan, вместо ctg – cot, вместо arcsin – asin, вместо arccos – acos, вместо arctg – atan, вместо arcctg – acot, вместо ln – log, вместо cosec – csc.

Примеры использования функций:

3.11. Правило записи функций

Для записи функции необходимо указать ее название, а затем, в круглых скобках записать через запятую значения аргументов. Если значением аргумента является список, то он заключается в квадратные скобки, а элементы списка также разделяются запятыми.

3.12. Пользовательские функции

Пользователь может задать собственные функции. Для этого сначала указывается название функции, в скобках перечисляются названия аргументов, после знаков := (двоеточие и равно) следует описание функции, которое может быть нематематическим. После задания пользовательская функция вызывается точно так, как и встроенные функции Maxima .

Нужно помнить, что не следует использовать для функций названия, зарезервированные для встроенных функций Maxima (записанные выше в табл. 2).

3.13. Перевод сложных выражений в линейную форму записи

Одним из самых сложных занятий для начинающих пользователей системы Maxima является запись сложных выражений, содержащих степени, дроби и другие конструкции, в линейной форме (в текстовой форме записи, при помощи ASCII символов, в одну строку).

Для облегчения данного процесса нелишне дать несколько рекомендаций:

1. Не забывайте ставить знак умножения! В графическом окне Maxima по правилам математики удвоенное значение переменной х записывает в виде 2x , но при записи команда для Maxima должна выглядеть как 2*x.

2. Но между именем функции и скобкой с аргументом знак умножения не пишется; sin *(x ) – здесь знак умножения лишний.

3. В случае сомнения всегда лучше перестараться и поставить «лишние», дополнительные скобки (). Числитель и знаменатель выражения всегда необходимо заключать в скобки. При записи возведения в степень основание и степень лучше всегда брать в скобки.

4. Функция не существует отдельно от своих аргументов (если таковые имеются). Поэтому, например, при возведении в степень функции некоторого аргумента следует взять всю функцию с аргументами в скобки, а потом уже возводить полученную конструкцию в нужную степень: ( sin (x ))**2. Очень часто начинающие пользователи пытаются возвести в степень только название функции, забывая про аргументы: sin **2(x ) – это неправильно!

5. Также необходимо помнить, что несколько аргументов функции записываются в скобках, через запятую,например min (x 1, x 2, x 3, xN ).

6. Недопустима запись функции sin (2* x ) в виде sin *2* x или sin 2 x . Запомните, как действует Maxima при записи скобок: как только вы пытаетесь написать открывающую скобку, она тут же пишет вторую – парную ей – закрывающую скобку. Поэтому при записи функций напишите название функции, затем поставьте после нее пустые скобки и только потом в этих скобках напишите все ее аргументы, разделяя их запятыми. Никаких конструкций между названием функции и открывающейся скобкой быть не должно!

7. В случае записи сложного выражения разбейте его на несколько простых составляющих, введите их по отдельности, а затем объедините, используя рассмотренные ранее обозначения.

Примеры простых команд для Maxima :

Математическая запись

Команда для Maxima

(x+2)/(y–7)

(x+3)**(2*y)

sin((x–2)/(a+3))

((x–2)/(a+3)+2)/(4–(y–7)/(b+4))+12*x

Упражнение: Н еобходимо ввести следующее выражение:

Указания к выполнению: Разделим это выражение на три составные части: будем отдельной частью считать числитель, выражение, стоящее в знаменателе в скобках, и степень. Введем каждую названную составную часть, и объединим их в выражение.

При вводе команд строку с ошибочной записью команды для Maxima можно выделить и удалить с графического экрана (с клавиатуры), а вместо неё написать и выполнить (с клавиатуры нажатием Shift + Enter ) правильную команду, следует ожидать, что номер ответа при этом изменится.

Если щёлкнуть мышкой в незакрашенный треугольник, то треугольник закрасится, а строка с результатом будет скрыта, при этом появится запись (1 lines hidden). Чтобы удалить с экрана и ответ, и команду (блок, отмеченный слева квадратной скобкой), следует щелчком мыши выделить квадратную скобку у пары ввод–ответ, вызвать щелчком правой кнопки мыши контекстное меню и выбрать опцию Delete Selection. Так в предыдущих примерах строки с командой (%i4) и с ответом (%o4) нет – они удалены.

Заметим также, что при записи команды для Maxima (%o1)/(%o2)**(%o3) в строке (%i5) вполне допустимо перестраховаться и написать иначе, используя дополнительные скобки для знаменателя: (%o1)/((%o2)**(%o3)). Но Maxima правильно нас поняла и без этих «лишних скобок» и вычислила вводимое выражение математически правильно, поскольку понимает принятое в математике старшинство операций : прежде всего вычисляются аргументы (так как находятся в скобках) и функции, потом выполняется возведение в степень, затем операции деление и умножение и только потом – сложение и вычитание.

by 0):
а) y :2/ x ; x :0; б) u :0; v :2/ u ; в) z :0; t :2/ Z ; и почему?

3. Что является оператором в выражениях а) x^y; б) – t; в) x + y;?

4. Что ответитMaxima, если исполнить команду: u – v; op(%);?

5. Чему равнывыражения: а) 4 * – 2; б) 4 * + 2; в) 4 ** – 2;?

6. Что является аргументами в выражении fas (p , q ) := p – q ?

7. Является ли атомом выражение abc?

8. Почему в следующих примерахMaxima сумела численно рассчитать tg(π /2) и, но отказалась делать численные вычисления для ctg(0)?

9. Какой ответ даст Maxima, если команда для неё будет такой:

10. Что больше e π или π e ?

11. На сколько процентов большее из сравниваемых чисел превышает меньшее?

12. Что ответит Maxima, если команда для неё будет такой:

Тема : Система команд, вычисления в Maxima .

Цель: продолжить знакомство с программой Maxima , познакомить с системой команд Maxima ; развивать память, внимание; воспитывать информационную культуру.

Ход урока:

    Организационное начало:

    Приветствие.

    Работа с дежурными.

    Повторительно-обучающее начало.

    Индивидуальная работа по карточкам.

Карточка №1.

    1. Понятие системы математический вычислений.

      Особенности системы математических вычислений.

Карточка №2.

    1. Понятие компьютерной алгебры.

      Особенности компьютерной алгебры.

    Устный индивидуальный опрос.

Понятие Maxima . Особенности. Запуск программы.

Интерфейс программы Maxima .

    Работа по осмыслению и усвоению нового материала.

    Объявление темы и цели урока.

    Изучение нового материала.

Ввод простейших команд в wxMaxima

После запуска wxMaxima появляется окно программы.

верхней графической части окна интерфейса Maxima рассказывает, что загружена версия 5.14.0, что она распространяется по лицензии GNU, с какого сайта доступна и кто её родитель. В нижнем окне в поле ВВОД: Maxima приготовилась воспринимать команды. Разделителем команд является символ; (точка с запятой). После ввода команды необходимо нажать клавишу Enter для ее обработки и вывода результата.

В ранних версиях Maxima и некоторых ее оболочках (например, xMaxima), и в консольной версии наличие точки с запятой после каждой команды строго обязательно. Поэтому настоятельно рекомендуем при использовании Максимы

не забывать добавлять точку с запятой; после каждой команды. В случае, когда выражение надо отобразить, а не вычислить, перед ним необходимо поставить знак (") (одинарная кавычка). Но этот метод не работает, когда выражение имеет явное значение,

например, выражение sin(π) Максима рассматривает как нуль и при наличии апострофа. Трудно предусмотреть многообразие возможных вариантов использования Максимы для расчета или преобразования выражений. В сложных случаях, можно попытаться получить справку на английском языке. Для вызова справки достаточно в поле ВВОД написать? и нажать Enter.

Обозначение команд и результатов вычислений

После ввода каждой команде присваивается порядковый номер. На приведенном ниже рисунке введенные команды имеют номера 1–3 и обозначаются соответственно (%i1), (%i2), (%i3). Результаты вычислений имеют соответственно порядковый номер (%o1), (%o2) и т.д. Где "i" – сокращение от англ. Input (ввод), а "o" – англ. Output (вывод)

Этот механизм позволяет при дальнейшей записи команд сослаться на ранее записанные, например (%i1)+(%i2) будет означать добавление к выражению первой команды выражения второй с последующим вычислением результата. Также можно использовать и номера результатов вычислений, например, таким образом (%o1)*(%o2).

Для последней выполненной команды в Maxima есть специальное обозначение – %.

Пример: Вычислить значение производной функции

в точке х=1.

Команда (%i9) была выполнена, и был получен результат (%о9). Поэтому следующая команда (%i10) сослалась на уже полученный результат, но уточнила значение переменной х, поэтому команда получала вид (%i10) (%о9), х=1.

Ввод числовой информации

Правила ввода чисел в Maxima точно такие, как и для многих других подобных программ. Целая и дробная часть десятичных дробей разделяются символом точка. Перед отрицательными числами ставится знак минус.

Числитель и знаменатель обыкновенных дробей разделяется при помощи символа / (прямой слэш).

Обратите внимание, что если в результате выполнения операции получается некоторое символьное выражение, а необходимо получить конкретное числовое значение в виде десятичной дроби, то решить эту задачу позволит применение оператора numer . В частности он позволяет перейти от обыкновенных дробей к десятичным

Здесь Maxima прежде всего действовала по умолчанию. Она сложила дроби 3/7 и 5/3 по правилам арифметики точно: нашла общий знаменатель, привела дроби к общему знаменателю и сложила числители. В итоге она получила

44/21. Лишь после того, как мы попросили её получить численный ответ, она вывела приближенный, с точностью 16 знаков численный ответ 2,095238095238095.

Константы

В Maxima для удобства вычислений есть ряд встроенных констант, самые распространенные из них показаны в следующей таблице (табл.1):

Арифметические операции

Обозначения арифметических операций в Maxima ничем не отличаются от классического представления, используются математические знаки: + – * /.

Возведение в степень можно обозначать тремя способами: ^ , ^^ , **. Извлечение корня степени n записывают, как степень ^^(1/n ). Напомним еще одну встроенную в Maxima полезную операцию –нахождение факториала числа. Эта операция обозначается восклицательным

Например, 6!=1⋅ 2⋅ 3⋅ 4⋅ 5⋅ 6=120.

Для увеличения приоритета операции, как и в математике, при записи команд для Maxima используют круглые () скобки.

Переменные

Для хранения результатов промежуточных расчетов применяются переменные. Заметим, что при вводе названий переменных, функций и констант важен регистр букв, так переменные x и X – это две разные переменные.

Присваивание значения переменной осуществляется с использованием символа: (двоеточие), например x : 5;.

Если необходимо удалить значение переменной (очистить ее), то применяется метод kill :

kill (x ) – удалить значение переменной x ;

kill (all ) – удалить значения всех используемых ранее переменных.

И кроме того, метод kill начинает новую нумерацию для исполняемых команд (обратите внимание, что ответом на команду (%i 3), приведенную выше, оказался ответ с номером ноль (%o 0) done , и далее нумерация команд продолжилась с единицы).

Математические функции

В Maxima имеется достаточно большой набор встроенных математических функций. Вот некоторые из них (табл.2). Следует иметь ввиду, что некоторые названия функций отличаются от названий, используемых в отечественной литературе: Вместо tg – tan , вместо ctg – cot , вместо arcsin – asin , вместо arcos – acos , вместо arctg – atan , вместо arcctg – acot , вместо ln – log , вместо cosec – csc .

Правило записи функций

Для записи функции необходимо указать ее название, а затем, в круглых скобках записать через запятую значения аргументов. Если значением аргумента является список, то он заключается в квадратные скобки, а элементы списка также разделяются запятыми.

integrate(sin(x),x,-5,5); plot2d(,,);

Пользовательские функции

Пользователь может задать собственные функции. Для этого сначала указывается название функции, в скобках перечисляются названия аргументов, после знаков:= (двоеточие и равно) следует описание функции. После задания пользовательская функция вызывается точно так, как и встроенные функции Maxima.

Перевод сложных выражений в линейную форму записи

Одним из самых сложных занятий для начинающих пользователей системы Maxima является запись сложных выражений, содержащих степени, дроби и другие конструкции, в линейной форме (в текстовой форме записи, при помощи ASCII символов, в одну строку).

Для облегчения данного процесса нелишне дать несколько рекомендаций:

1. Не забывайте ставить знак умножения! В графическом окне Maxima по правилам математики удвоенное значение переменной х записывает в виде 2x , но в окне ВВОД: команда для Maxima должна выглядеть как 2*x .

2. В случае сомнения всегда лучше поставить «лишние», дополнительные скобки (). Числитель и знаменатель выражения всегда необходимо заключать в скобки.

А также при возведении в степень основание и степень лучше всегда брать в скобки.

3. Функция не существует отдельно от своих аргументов (если таковые имеются). Поэтому, например, при возведении в степень можно взять всю функцию с аргументами в скобки, а потом уже возводить полученную конструкцию в нужную степень: (sin (x ))**2.

Также помните, что несколько аргументов функции записываются в скобках, через запятую, например, min(x1,x2,x3,xN);

5. Недопустима запись функции sin(2*x) в виде sin*2*x или sin2x.

6. В случае записи сложного выражения разбейте его на несколько простых составляющих, введите их по отдельности, а затем объедините, используя рассмотренные ранее обозначения введенных команд.

Пример: необходимо ввести следующее выражение:

Разделим это выражение на три составные части: числитель, выражение в скобках и степень. Запишем каждую составную часть и объединим их в выражение.

Maxima упростит выражение

rat(выражение). преобразовывает рациональное выражение к канонической форме. То

есть раскрывает все скобки, затем приводит все к общему знаменателю, суммирует и сокращает; кроме того, приводит все числа в конечной десятичной записи к рациональным.

    Задание на дом:

Стахин Н.А, с 10-18, опорный конспект.

    Итог урока.

Для чего предназначена программа Maxima ?

Перечислите основные элементы интерфейса программы Maxima .

Перечислите основные команды Maxima .

В системе Maxima имеется множество встроенных функций. Для каждой встроенной функции можно получить описание в документации, содержащейся в справочной системе. Вызвать справку можно с помощью функциональной клавиши F1. Также в Maxima есть специальная функция, которая выдает информацию из документации по конкретным словам. Сокращенная версия вызова этой функции: ?? name (Рис.12). Здесь?? - это имя оператора, и аргумент нужно отделять от него пробелом. Оператор?? выдает список тех разделов помощи и имен функций, которые содержат заданный текст, после чего предлагают ввести номер того раздела или описания той функции, которые требуется посмотреть:

Рис.12. Вызов справки по интересующей команде системы Maxima

Заметим, что в системе Maxima нет четкого разграничения между операторами и функциями. Более того,каждый оператор - это на самом деле функция.

Все функции и операторы Maxima работают не только с действительными, но и комплексными числами. Сами комплексные числа записываются в алгебраической форме, с мнимой единицей, обозначенной через %i; то есть в виде a+b*%i, где а и b - соответственно действительная и мнимая части числа.

Рассмотримсинтаксис базовых функций системы Maxima.

1. Арифметические операторы: + , -, *, /, -->. Пример:

3. Логические операторы: and, or, not. Пример:

4. Функция нахождения факториала числа: !

Факториал задан в наиболее общем виде и представляет собой, по сути, гамма-функцию (точнее, x! = gamma(x+1)), то есть определен на множестве всех комплексных чисел, кроме отрицательных целых. Факториал от натурального числа (и нуля) автоматически упрощается до натурального же числа.

5. Функция нахождения полуфакториала чила: !! (произведение всех четных (для четного операнда) или нечетных чисел, меньших либо равных данному).

6. Функция отрицания синтаксического равенства: # Запись a#b эквивалентна not a=b.Пример:

7. Функция нахождения модуля числа х: abs(x) Модуль определен для всех комплексных чисел. Пример:

8. Функция, возвращающая знак числа х: signum(x)

9. Функции, возвращающие наибольшее и наименьшее значения из заданных действительных чисел: max(x1,...,xn) и min(x1,...,xn).

10. Некоторые встроенные математические функции:

sqrt (x) Квадратный корень из x
acos (x) Арккосинус аргумента х
acosh (x) Гиперболический арккосинус аргумента х
acot (x) Арккотангенс аргумента х
acoth (x) Гиперболический арккотангенс аргумента х
acsc (x) Арккосеканс аргумента х
acsch (x) Гиперболический арккосеканс аргумента х
asec (x) Арксеканс аргумента х
asech (x) Гиперболический арксеканс аргумента х
asin (x) Арксинус аргумента х
asinh (x) Гиперболический арксинус аргумента х
atan (x) Арктангенс аргумента х
atanh (x) Гиперболический арктангенс аргумента х
cosh (x) Гиперболический косинус аргумента х
coth (x) Гиперболический котангенс аргумента х
csc (x) Косеканс аргумента х
csch (x) Гиперболический косеканс аргумента х
sec (x) Секанс аргумента х
sech (x) Гиперболический секанс аргумента х
sin (x) Синус аргумента х
sinh (x) Гиперболический синус аргумента х
tan (x) Тангенс аргумента х
tanh (x) Гиперболический тангенс аргумента х
log (x) Натуральный логарифм х
exp (x) Экспонента х

11. Функции для работы с матрицами:

determinant – нахождение определителя матрицы:

eigenvalues – нахождение собственных значений матрицы:

invert – получение обратной матрицы:

minor – определяет минор матрицы. Первый аргумент – матрица, второй и

третий – индексы строки и столбца соответственно:

rank – ранг матрицы:

submatrix – возвращает матрицу, полученную из исходной удалением

соответствующих строк и (или) столбцов. В качестве параметров следуют

номера удаляемых строк, исходная матрица, номера удаляемых столбцов.

transpose – транспонирование матрицы:

В языке системы Maxima заложены основные исполнимые операторы, которые есть в любом языке программирования. Рассмотрим их.

Операторы присваивания значений (именования выражений).

1. Оператор «:» (оператор задания значения переменной).

2.Оператор «:=» (оператор задания функции пользователя).

3.Расширенные варианты операторов присваивания и задания функции, обозначаемые соответственно через:: и::=.

Использование оператора задания функции пользователя значительно облегчает работу с ней, поскольку к ней можно обращаться по имени и легко и удобно вычислять значения функции в заданных точках.

Пример: найдем значение функции f (x,y )=cosx + siny в точке

Оператор цикла. Оператор цикла может задаваться несколькими способами. Способ задания зависит от того, известно ли заранее сколько раз необходимо выполнить тело цикла.

Пример: задание цикла для вывода значений переменной а в диапазоне от -3 до 10 с шагом 5:

Следующей важной возможностью системы Maxima являетсяработа со списками и массивами.

Для формирования списков используется команда makelist. Например, с помощью команды

мы сформировали список с именем x, состоящий из десяти элементов, значения которых находятся по формуле .

Для формирования массивов используется команда array. Например с помощью команды,

мы сформировали двумерный массив A, состоящий из 10 строк и 5 столбцов. Для заполнения массива элементами воспользуемся циклом с параметром. Например,

Для вывода элементов массива на экран можно воспользоваться командой:

Массив можно формировать и без предварительного объявления. В следующем примере мы сформировали одномерный массив x, состоящий из 5 элементов, значения которых вычисляются по формуле x(i )=sini

Неудобство работы с массивами заключается в том, что вывод значений элементов массива осуществляется в столбец. Гораздо удобнее, если значения массива (двумерного) выводятся в виде матрицы. Для этих целей можно воспользоваться командой genmatrix. Например, для формирования двумерного массива (матрицы) следует задать команду в следующем виде:

Выведем полученный массив:

6. Простейшие преобразования выражений.

По умолчанию в системе Maxima является активной функция автоупрощения, т.е. система старается упростить вводимое выражение сама без какой-либо команды.

Пример. Пусть требуется найти значение следующего числового выражения:

Зададим выражение по правилам языка системы Maxima.

Как видим, система в ответ вывела значение выражения, хотя мы не задали никакой команды.

Как же заставить систему вывести не результат, а само выражение? Для этого функцию упрощения надо отключить с помощью команды simp: false$. Тогда получим:

Для того чтобы активировать функцию упрощения, надо задать команду simp:true$. Функция автоупрощения может работать как с числовыми, так и с некоторыми не числовыми выражениями. Например,

При вводе мы можем обращаться к любой из предыдущих ячеек по ее имени, подставляя его в любые выражения. Кроме того, последняя ячейка вывода обозначается через %, а последняя ячейка ввода - через _. Это позволяет обращаться к последнему результату, не отвлекаясь на то, каков его номер. Но такими обращениями к ячейкам злоупотреблять не надо, поскольку при переоценивании всего документа или его отдельных ячеек ввода может произойти разногласие между номерами ячеек.

Пример. Найти значение выражения и увеличить полученный результат в 5 раз.

Желательно вместо имен ячеек использовать переменные и присваивать их имена любым выражениям. В этом случае в виде значения переменной может выступать любое математическое выражение.

Значения имен переменных сохраняются на протяжении всей работы с документом. Напомним, что если необходимо снять определение с переменной, то это можно сделать с помощью функции kill(name), где name - имя уничтожаемого выражения; причем это может быть как имя, назначенное вами, так и любая ячейка ввода или вывода. Точно так же можно очистить всю память и освободить все имена, введя команду kill(all) (или выбрать меню Махта->Очиститъ память (Clear Memory)). В этом случае очистятся в том числе и все ячейки ввода-вывода, и их нумерация опять начнется с единицы.

Функция автоупрощения далеко не всегда способна упростить выражение. В дополнение к ней имеется целый ряд команд, которые предназначены для работы с выражениями: рациональными и иррациональными. Рассмотрим некоторые из них.

rat (выражение) - преобразовывает рациональное выражение к канонической форме: раскрывает все скобки, затем приводит все к общему знаменателю, суммирует и сокращает; приводит все числа в конечной десятичной записи к рациональным. Каноническая форма автоматически «отменяется» в случае любых преобразований, не являющихся рациональными

ratsimp (выражение) - упрощает выражение за счет рациональных преобразований. Работает в том числе и «вглубь», то есть иррациональные части выражения не рассматриваются как атомарные, а упрощаются, в том числе, и все рациональные элементы внутри них

fullratsimp(выражение) - функция упрощения рационального выражения методом последовательного применения к переданному выражению функции ratsimp(). За счет этого функция работает несколько медленнее, чем ratsimp(), зато дает более надежный результат.

expand (выражение) - раскрывает скобки в выражении на всех уровнях вложенности. В отличии от функции ratexpand(), не приводит дроби-слагаемые к общему знаменателю.

radcan(выражение) - функция упрощения логарифмических, экспоненциальных функций и степенных с нецелыми рациональными показателями, то есть корней (радикалов).

Часто при попытке упрощения выражения в Maxima может происходить на самом деле только его усложнение. Увеличение результата может происходить из-за того, что неизвестно, какие значения могут принимать переменные, входящие в выражение. Чтобы этого избежать, следует накладывать ограничения на значения, которые может принимать переменная. Делается это с помощью функции assume(условие). Поэтому в некоторых случаях наилучшего результата можно добиться, комбинируя radcan() с ratsimp() или fullratsimp().

В Максима реализована возможность задания математических функций. Но я начну с того, что расскажу о встроенных функциях. Как правило, эти функции записываются аналогично математике.

Только вот математика эта американская, а не отечественная. Поэтому привычные нам со школы tg следует заменять на tan. Вот список тех функций, которые я смог обнаружить самостоятельно:

Функция в Maxima

Функция в математике

Гиперболический синус.

Гиперболический косинус.

Гиперболический тангенс.

Натуральный логарифм.

Арктангенс

Арксинус

acos(x) Арккосинус

Примечание: А вы знали, что если взять арксинус/арккосинус от числа больше 1, то у вас получится комплексное значение?

Наверняка встроенных функций куда больше. Если вам еще что-то нужно, то попробуйте обратиться к руководству по wxMaxima/Maxima. Там много интересного для начинающего любителя численных вычислений.

Рисунок 8: Встроенные функции в Maxima.

Если вы введете функцию, которая программе не известна, то она покажет вам точно такую же строку, как вы ввели. Но будьте внимательны! Если у вас установлен флаг numeric в дефолтное положение, то она поведет себя точно так же и с заданной функцией. Так что если вы намерены все же получить свой ответ, то переключите флаг, или передавайте функции вещественный параметр.

Теперь о том, как задавать собственные функции. Как и в математике, функция может быть определена выражением. Чтобы задать функцию, вы должны воспользоваться следующим оператором:

После определения вы можете использовать ее также, как и встроенные функции: f(3)

У функции также может быть несколько параметров, которые задаются и передаются через запятую. Пример вы можете увидеть на следующем скриншоте.

Рисунок 9: Собственные функции в wxMaxima

Как вы видите, ничего сложного. Используйте функции для упрощения ваших расчетов. Если вы последовательно посчитаете свои данные используя функцию, то у вас уже получится красивая табличка.

Циклическая обработка данных.

Это пожалуй самая сложная часть руководства, потому что она использует малопонятные непрограммистам циклы. Но если вы будете аккуратно вводить команды и не ошибаться, то все будет пучком.

Допустим, у вас имеется список A, который вы ввели по правилам, приведенным в разделе о вводе. Допустим, в нем находятся амплитудные значения тока. Тогда, чтобы получить действительные значения, вам необходимо каждое из них поделить на 2 .

for I in A do ldisp(I/sqrt(2))

По порядку. Здесь for - это ключевое слово, обозначающее цикл. I это временная переменная, которая соответствует одному из элементов списка. A это массив, который уже был введен вами ранее. Ключевое слово do говорит максиме что надо делать, проходя массив. Проход массива осуществляется поочередно, то есть действие после do выполняется столько раз, сколько находится элементов в массиве, а переменная I принимает на каждой итерации(итерация - одно выполнение цикла) значения a,a,...,a[n]. Дальше идет хитрая функция ldisp, которая позволяет нам увидеть, что она там такого насчитала. А параметром этой функции служит выражение. Если вы ничего не поняли, то не вдавайтесь в эти описания. А просто попробуйте сами дать эту команду, и поизменять ее параметры.

Примечание: Имена переменных и других объектов в максима регистрозависимы. Это значит, что I и i это две разные переменные.

Рисунок 10: Команда циклической обработки.

Этот способ подходит вам, если вы хотите посмотреть расчетные значения и затем записать их куда-нибудь к себе в лабник. А если вам требуется произвести над ними какие-то расчеты, то очевидно, их надо представить в удобном для этого виде. Например можно занести данные в список, аналогичный исходному. Для начала, нужно создать пустой список, чтобы потом в него можно было добавлять данные циклично. Это достигается командой:

Теперь можно заполнять:

for i in a do b:append(b, )

Этот цикл похож на предыдущий, но в него потребовалось внести некоторые

изменения, адекватно задаче. Теперь каждую итерацию цикла, в нем происходит переприсвоение списка b. Его присваивается список, составленный функцией append из прошлого состава списка b и еще одного списка, в котором находится лишь одно значение, нового рассчитанного элемента. Результатом является заполненный список b, которым вы можете оперировать, как будто бы сами ввели его. Чтобы посмотреть, что в нем есть, просто введите команду

Вы увидите ваш список.

Рисунок 11: Расчет с сохранением результатов.

Всего сказанного уже достаточно, чтобы посчитать обычную лабораторную работу. Особенно, если вы все это прочитали. Последовательность действий ваша должна быть примерно такой:

1. Ввести список исходных экспериментальных значений.

2. Задать функции для расчета значений.

3. Дать команды на циклический обсчет списков.

4. Занести данные в ваш лабник.

5. Закрыть лабник, и идти пить пиво на парапет, или куда-нибудь еще.

А теперь я расскажу о некоторых дополнительных фишках, которые могут вам помочь при подготовке к сдаче работы.

Так как в этом цикле статей речь пойдет о математической программе для символьных вычислений, для начала пару слов о том, что из себя представляют эти самые символьные или, как их еще называют, аналитические вычисления, в отличие от численных расчетов. Компьютеры, как известно, оперируют с числами (целыми и с плавающей запятой). К примеру, решения уравнения x 2 = 2 x + 1 можно получить как −0.41421356 и 2.41421356, а 3 x = 1 - как 0.33333333. А ведь хотелось бы увидеть не приближенную цифровую запись, а точную величину, т. е. 1±√2 в первом случае и 1/3 во втором. С этого простейшего примера и начинается разница между численными и символьными вычислениями. Но кроме этого, есть еще задачи, которые вообще невозможно решить численно. Например, параметрические уравнения, где в виде решения нужно выразить неизвестное через параметр; или нахождение производной от функции; да практически любую достаточно общую задачу можно решить только в символьном виде. Поэтому неудивительно, что и для такого класса задач появились компьютерные программы, оперирующие уже не только числами, а почти любыми математическими объектами, от векторов до тензоров, от функций до интегро-дифференциальных уравнений и т. д.

Максима в науке и образовании

Среди математического ПО для аналитических (символьных) вычислений наиболее широко известно коммерческое (Maple , Mathematica ); это очень мощный инструмент для ученого или преподавателя, аспиранта или студента, позволяющий автоматизировать наиболее рутинную и требующую повышенного внимания часть работы, оперирующий при этом аналитической записью данных, т. е. фактически математическими формулами. Такую программу можно назвать средой программирования, с той разницей, что в качестве элементов языка программирования выступают привычные человеку математические обозначения.

Программа, которая стала темой статьи, работает на тех же принципах и предоставляет похожий функционал; самое радикальное ее отличие - то, что она не является ни коммерческой, ни закрытой. Другими словами, речь идет о свободной программе. На самом деле использование свободного ПО более естественно для фундаментальной науки, нежели коммерческого, так как модель, которая используется в свободном ПО - это модель открытости и общедоступности всех наработок. Очевидно, эти же свойства присущи и результатам научной деятельности. Используя такую схожесть подходов, можно фактически рассматривать расширения функционала свободных программ или дополнительные библиотеки, которые могут создаваться для своих нужд в процессе научных исследований, как неотъемлемую часть результатов таких исследований. И эти результаты могут использоваться и распространяться на усмотрение пользователя без оглядки на ограничения, налагаемые лицензиями исходного ПО. В случае же коммерческого ПО, которое находится в собственности его производителя, такого рода свободы значительно ограничены, начиная от невозможности свободно (и законно) передавать само такое ПО вместе с наработками и вплоть до возможных патентных исков от компании-разработчика ПО в случае распространения самодельных дополнительных библиотек к нему.

С другой стороны, основное направление, кроме научных разработок, где такие программы востребованы - это высшее образование; а использование для учебных нужд именно свободного ПО - это реальная возможность и для вуза, и для студентов и преподавателей иметь в своем распоряжении легальные копии такого ПО без больших, и даже сколь-нибудь существенных, денежных затрат.

Эта статья открывает цикл, посвященный свободной программе аналитических вычислений Maxima . Этим циклом я постараюсь дать вам наиболее полное впечатление о программе: он будет посвящен как принципам и основам работы с Maxima, так и описанию более широких ее возможностей и практическим примерам.

Немного истории

История проекта, известного ныне под именем Maxima, началась еще в конце 60-х годов в легендарном MIT (Massachusetts Institute of Technology - Массачусетский Технологический институт), когда в рамках существовавшего в те годы большого проекта MAC началась работа над программой символьных вычислений, которая получила имя Macsyma (от MAC Symbolic MAnipulation). Архитектура системы была разработана к июлю 1968 г., непосредственно программирование началось в июле 1969. в качестве языка для разработки системы был выбран Lisp, и история показала, насколько это был правильный выбор: из существующих в то время языков программирования он единственный продолжает развиваться и сейчас - спустя почти полвека после старта проекта. Принципы, положенные в основу проекта, позднее были заимствованы наиболее активно развивающимися ныне коммерческими программами - Mathematica и Maple; таким образом, Macsyma фактически стала родоначальником всего направления программ символьной математики. Естественно, Macsyma была закрытым коммерческим проектом; его финансировали государственные и частные организации, среди которых были вошедшее в историю ARPA (Advanced Research Projects Agency; помните ARPAnet - предок интернета?), Энергетический и Оборонный Департаменты США (Departments of Energy & Defence, DOE and DOD). Проект активно развивался, а организации, контролирующие его, менялись не раз, как это всегда бывает с долгоживущими закрытыми проектами. в 1982 году профессор уильям Шелтер (William Schelter) начал разрабатывать свою версию на основе этого же кода, под названием Maxima. в 1998 году Шелтеру удалось получить от DOE права на публикацию кода по лицензии GPL. Первоначальный проект Macsyma прекратил свое существование в 1999 году. Уильям Шелтер продолжал заниматься разработкой Maxima вплоть до своей смерти в 2001 году. Но, что характерно для открытого ПО, проект не умер вместе со своим автором и куратором. Сейчас проект продолжает активно развиваться, и участие в нем является лучшей визитной карточкой для математиков и программистов всего мира.

Пару слов о программе

На данный момент Maxima выпускается под две платформы: Unix-совместимые системы, т. е. Linux и *BSD, и MS Windows. Я, конечно же, буду вести речь о Linux-версии.

Сама по себе Maxima - консольная программа, и все математические формулы отрисовывает обычными текстовыми символами. В этом есть как минимум два плюса. С одной стороны, саму Maxima можно использовать как ядро, надстраивая поверх нее графические интерфейсы на любой вкус. Их на сегодняшний день существует немало; в этот раз я остановлюсь на двух самых популярных (см. врезку) - и наиболее наглядных и удобных в работе, а об остальных поговорим в следующих выпусках; они тоже по-своему интересны, хотя более специфичны.

С другой стороны, сама по себе, без каких-либо интерфейсных надстроек, Maxima нетребовательна к железу и может работать на таких компьютерах, которые сейчас и за компьютеры уже никто не считает (это может оказаться актуальным, к примеру, для вуза или научной лаборатории, у которых денег на обновление парка машин скорее всего нет, а потребность в ПО для символьных вычислений возникнуть может).

Имена функций и переменных в Максиме чувствительны к регистру, то есть прописные и строчные буквы в них различаются. Это не будет в новинку любому, кто уже имел дело с POSIX-совместимыми системами или с такими языками программирования, как, скажем, C или Perl. Удобно это и с точки зрения математика, для которого тоже привычно, что заглавными и строчными буквами могут обозначаться разные объекты (например, множества и их элементы, соответственно).

Для того, чтобы начать работать с программой, вам понадобится пакет Maxima; если в стандартных репозитариях вашего дистрибутива его не окажется, то взять его можно на сайте проекта, адрес которого приведен во врезке.

Принципы работы с программой не зависят от того, какой интерфейс к ней вы выберете, поэтому я постараюсь Максимально абстрагироваться от конкретного интерфейса, ограничиваясь лишь небольшими комментариями в тех случаях, когда они ведут себя по-разному.

На данный момент последняя версия программы - 5.9.3, именно о ней я и буду говорить; если в вашем дистрибутиве пока присутствует более старая версия, вы в принципе можете использовать ее: и актуальная еще несколько месяцев назад 5.9.2, и вышедшая в конце прошлого года 5.9.1 не имеют с нынешней принципиальных различий.

Графические интерфейсы к Максиме

С точки зрения ознакомления с самой Maxima наибольший интерес представляют два интерфейса.

Первый - это отдельная самостоятельная графическая программа по имени . Она, как и сама Maxima, помимо Linux/*BSD существует еще и в версии для MS Windows. В wxMaxima вы вводите формулы в текстовом виде, а вывод Максимы отображается графически, привычными математическими символами. Кроме того, большой упор здесь сделан на удобство ввода: командная строка отделена от окна ввода-вывода, а дополнительные кнопки и система меню позволяют вводить команды не только в текстовом, но и в диалоговом режиме. Так называемое «автодополнение» в командной строке на самом деле с таковым имеет лишь то сходство, что вызывается клавишей « Tab ». Ведет же оно себя, к сожалению, всего лишь как умная история команд, т. е. вызывает ту команду из уже введенных в этой сессии, которая начинается с заданных в командной строке символов, но не дополняет до имен команд и их параметров. Таким образом, этот интерфейс наиболее удобен в том случае, когда вам нужно много вычислять и видеть результаты на экране; и еще, возможно, в том случае, если вы не очень любите вводить все команды с клавиатуры. Кроме того, wxMaxima предоставляет удобный интерфейс к документации по системе; хотя, так как документация поставляется в формате html, вместо этого можно использовать обычный браузер.


Второй достаточно интересный интерфейс к Maxima - это дополнительный режим в редакторе . Хотя этот редактор имеет общее историческое прошлое с широко известным Emacs, что явствует из названия, но практического сходства между ними мало. TeXmacs разрабатывается для визуального редактирования текстов научной тематики, при котором вы видите на экране редактируемый текст практически в том же виде, в котором он будет распечатан. В частности, он имеет так называемый математический режим ввода, очень удобный для работы с самыми разнообразными формулами, и умеет импортировать/экспортировать текст в LaTeX и XML/HTML. Именно возможностями по работе с формулами пользуется Maxima, вызванная из TeXmacs’а. Фактически, формулы отображаются в привычной математической нотации, но при этом их можно редактировать и копировать в другие документы наподобие обыкновенного текста. Maxima-сессия вызывается из меню: «вставить Сессия Maxima », при этом появляется дополнительное меню с командами Максимы. После запуска сессии можно уже внутри нее перейти в математический режим ввода (меню режимов ввода вызывается первой кнопкой на панели ввода) и при вводе также использовать элементы математической нотации. Этот интерфейс будет наиболее удобен тем, кто хочет использовать результаты вычислений в своих текстах и любит редактировать их в визуальном режиме.



Приступаем к работе

После запуска Maxima-сессии мы видим перед собой такие строки:

Maxima restarted. (%i1)

Первая - это сообщение о том, что ядро Максимы только что запустилось (вместо нее, в зависимости от версии и конкретной сборки, может выводиться краткая информация о программе); вторая - приглашение к вводу первой команды. Команда в Максиме - это любая комбинация математических выражений и встроенных функций, завершенная, в простейшем случае, точкой с запятой. После ввода команды и нажатия « Enter » Maxima выведет результат и будет ожидать следующей команды:


Для арифметических действий используются традиционные обозначения: - , + , * , / ; ** или ^ для возведения в степень, sqrt() для квадратного корня.

Если для каких-то обозначений будет неочевидно, как записать их в строку, я буду пояснять это по ходу изложения.

Как видите, каждая ячейка имеет свою метку; эта метка - заключенное в скобки имя ячейки. Ячейки ввода именуются как %i с номером (i от input - ввод), ячейки вывода - как %o с соответствующим номером (o от output - вывод). Со знака % начинаются все встроенные служебные имена: чтобы, с одной стороны сделать их достаточно короткими и удобными в использовании, а с другой - избежать возможных накладок с пользовательскими именами, которые тоже часто удобно делать короткими. Благодаря такому единообразию вам не придется запоминать, как часто бывает в других системах, какие из таких коротких и удобных имен зарезервированы программой, а какие вы можете использовать для своих нужд. К примеру, внутренними именами %e и %pi обозначены общеизвестные математические постоянные; а через %c с номером обозначаются константы, используемые при интегрировании, для которых использование буквы «c» традиционно в математике.

При вводе мы можем обращаться к любой из предыдущих ячеек по ее имени, подставляя его в любые выражения. Кроме того последняя ячейка вывода обозначается через % , а последняя ячейка ввода - через _ . Это позволяет обращаться к последнему результату, не отвлекаясь на то, каков его номер.

Здесь %+47/59 - то же самое, что %o1+47/59 .

Вывод результата вычисления не всегда нужен на экране; его можно заглушить, завершив команду символом $ вместо; . Заглушенный результат при этом все равно вычисляется; как видите, в этом примере ячейки %o1 и %o2 доступны, хотя и не показаны (к ячейке %o2 обращение идет через символ % , смысл которого расшифрован выше):

Каждую следующую команду не обязательно писать с новой строки; если ввести несколько команд в одну строчку, каждой из них все равно будет соответствовать свое имя ячейки. К примеру, здесь в строке после метки %i1 введены ячейки от %i1 до %i4 ; в ячейке %i3 используются %i1 и %i2 (обозначенная как _ - предыдущий ввод):


В wxMaxima и TeXmacs последнюю или единственную команду в строке можно не снабжать завершающим символом - это сработает так же, как если бы она была завершена; , т. е. вывод заглушен не будет. В дальнейших примерах я часто буду опускать; . Если вы выберете другой интерфейс, не забывайте ее добавлять.

Помимо использования имен ячеек, мы, естественно, можем и сами давать имена любым выражениям. По-другому можно сказать, что мы присваиваем значения переменным, с той разницей, что в виде значения такой переменной может выступать любое математическое выражение. Делается это с помощью двоеточия - знак равенства оставлен уравнениям, которые, учитывая общий математический контекст записи, проще и привычнее так читаются. И к тому же, так как основной конек Максимы - символьная запись и аналитические вычисления, уравнения достаточно часто используются. Например:

В каком-то смысле двоеточие даже нагляднее в таком контексте, чем знак равенства: это можно понимать так, что мы задаем некое обозначение, а затем через двоеточие расшифровываем, что именно оно обозначает. После того, как выражение поименовано, мы в любой момент можем вызвать его по имени:

Любое имя можно очистить от присвоенного ему выражения функцией kill() , и освободить занимаемую этим выражением память. Для этого нужно просто набрать kill(name) , где name - имя уничтожаемого выражения; причем это может быть как имя, назначенное вами, так и любая ячейка ввода или вывода. Точно так же можно очистить разом всю память и освободить все имена, введя kill(all) . В этом случае очистятся в том числе и все ячейки ввода-вывода, и их нумерация опять начнется с единицы. В дальнейшем, если по контексту будет иметься в виду логическое продолжение предыдущих строк ввода-вывода, я буду продолжать нумерацию (этим приемом я уже воспользовался выше). Когда же новый «сеанс» будет никак не связан с предыдущим, буду начинать нумерацию заново; это будет косвенным указанием сделать « kill(all) », если вы будете набирать примеры в Maxima, так как имена переменных и ячеек в таких «сеансах» могут повторяться.

Доступ к документации Максимы

В примерах выше мы воспользовались двумя встроенными функциями. Как нетрудно догадаться из контекста, solve - это функция решения уравнения, а diff - функция дифференцирования. Практически весь функционал Maxima реализован через такие встроенные функции. Функция в Maxima может иметь переменное число аргументов. Например, функция solve , которую мы использовали с одним аргументом, чаще вызывается с двумя аргументами. Первый задает уравнение или функцию, чьи корни надо найти; второй - переменную, относительно которой нужно решать уравнение:


Если формула, задающая решаемое уравнение, содержит только один символ, как в предыдущем примере, то второй аргумент можно опустить, так как выбор, относительно чего нужно решать уравнение, все равно однозначен.

Вторая функция из наших новых знакомых - diff - также может принимать один аргумент; в этом случае она находит дифференциал заданного выражения:

Через del(x) и del(y) здесь обозначены дифференциалы соответствующих символов.

Для каждой встроенной функции есть описание в документации по Maxima. Оно содержит сведения о том, какие аргументы и в каких вариантах принимает функция, а также описание ее действия в разных случаях и конкретные примеры применения. Но, конечно, искать описание каждой нужной функции в html-документации или info-страницах не всегда удобно, тем более, что нужна эта информация, как правило, прямо в процессе работы. Поэтому в Maxima есть специальная функция - describe() , которая выдает информацию из документации по конкретным словам. Более того, специально для удобства получения справочной информации существует сокращенная версия вызова этой функции: ? name вместо describe(name) . Здесь? - это имя оператора, и аргумент нужно отделять от него пробелом (выражение?name используется для вызова функции Lisp с именем name). Функция describe и оператор? выдают список тех разделов помощи и имен функций, которые содержат заданный текст, после чего предлагают ввести номер того раздела или описания той функции, которые вы хотите посмотреть:

Когда вы выберете раздел, будет выдано его содержимое:


Если для слова, которое вы ввели после? или describe , найдено единственное совпадение, его описание будет показано сразу.

Кроме справки, по многим функциям Maxima есть примеры их использования. Пример можно загрузить функцией example() . Вызов этой функции без аргумента отобразит список всех имен доступных примеров; вызов вида example(name) загрузит в текущую сессию и выполнит указанный файл примера:


Решение проблемы с запуском из-под TeXmacs

Если у вас возникли проблемы с запуском Maxima-сессии из TeXmacs, обратите внимание на то, кто у вас в системе выступает под именем /bin/sh . Дело в том, что инициализация всех разнообразных сессий реализована в TeXmacs’е через shell-скрипты, вызываемые именно с помощью /bin/sh . И в скрипте, отвечающем за сессию Maxima, используется возможность, которая не стандартизирована как обязательная для /bin/sh , но присутствует в его эмуляции bash. Другими словами, если у вас /bin/sh является не ссылкой на /bin/bash , а чем-то другим, то именно это может послужить причиной невозможности открыть Maxima-сессию (к примеру, в Debian и основанных на нем дистрибутивах кроме bash ссылку /bin/sh на себя может захотеть поставить еще и более легкий dash ; в этом случае восстановить статус-кво можно с помощью dpkg-reconfigure dash). Если сделать /bin/sh ссылкой на /bin/bash не представляется возможным, можете попробовать поменять #!/bin/sh на #!/bin/bash в файле /usr/lib/texmacs/TeXmacs/bin/maxima_detect . Я написал об этой проблеме разработчикам TeXmacs, но еще не получил никакой их реакции, так что не могу пока сказать, будет ли исправлена эта недоработка в ближайших версиях.

Основные принципы

То, что Максима написана на Lisp, человеку, знакомому с этим языком, становится понятно уже в начале работы с программой. Действительно, в Максиме четко прослеживается «лисповский» принцип работы с данными, который оказывается очень кстати в контексте символьной математики и аналитических вычислений. Дело в том, что в Lisp, по большому счету, нет разделения на объекты и данные: имена переменных и выражения могут использоваться практически в одном и том же контексте. В Maxima же это свойство развито еще сильнее: фактически, мы можем использовать любой символ вне зависимости от того, присвоено ли ему какое-то выражение. По умолчанию символ, связанный с любым выражением, будет представлять это выражение; символ, не связанный ни с чем, будет представлять самого себя, трактуемого опять-таки как выражение. Поясним на примере:

Из этого следует, в частности, что в выражение автоматически подставляется значение входящего в него символа только в том случае, если это значение было приписано символу до определения выражения:

Если некоторый символ уже имеет какое-то значение, можем ли мы использовать в выражении сам этот символ, а не его значение? Конечно. Сделать это можно с помощью знака апострофа - введенный перед любым символом или выражением, он предотвращает его вычисление:

Результат выражения %i12 был бы аналогичен и в том случае, если бы b и y не имели на тот момент никаких значений; таким образом, мы можем смело блокировать вычисление символа, даже не запоминая (или не зная), присвоены ли им вообще какие-то выражения.

Точно так же можно поступить с любой встроенной функцией, если мы хотим не выполнить ее, а использовать в своем математическом контексте. Например, уже упомянутая функция дифференцирования может пригодиться нам для обозначения производной в дифференциальном уравнении; в этом случае, конечно, вычислять ее не надо:

Благодаря описанным особенностям работа в Максиме, с одной стороны, становится во многом похожей на традиционную «ручную» работу с математическими формулами, что практически сводит на нет психологический барьер в начале работы с программой. С другой стороны, даже на этом начальном этапе вы фактически избавлены от наиболее рутинной ручной работы, вроде отслеживания текущих значений символов, и можете полностью сосредоточиться на самой задаче. Конечно, блокировка вычислений - это не единственный способ влиять на то, как Максима будет вычислять то или иное выражение; этим процессом можно управлять довольно гибко.