Компьютерная математика с Maxima

Введение

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

Исходный код Maxima может компилироваться на многих системах, включая Windows, Linux и MacOS X. На SourceForge доступны исходные коды и исполняемые файлы для Windows и Linux.http://sourceforge.net/projects/maxima/files/

Maxima — потомок Macsyma, легендарной системы компьютерной алгебры, разработанной в начале 60-х в MIT в рамках проекта Project MAC, финансируемого Министерством энергетики США (DOE) и другими государственными организациями. Это единственная основанная на Macsyma система, все еще публично доступная и имеющая активное сообщество пользователей благодаря своей открытости. Macsyma произвела в свое время переворот в компьютерной алгебре и оказала влияние на многие другие системы, в числе которых Maple и Mathematica.

Работу над Maxima вел Уильям Шелтер с 1982 года и до своей кончины в 2001 году. В 1998 году он получил разрешение на публикацию исходного кода под лицензией GPL. Выживание Maxima стало возможным только благодаря его усилиям и способностям. После его кончины была сформирована группа пользователей и разработчиков, ставящая своей целью донести Maxima до широкой аудитории.

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

Рассмотрим некоторые примеры использования системы Maxima для решения задач математики и физики в старших классах.

Решение алгебраических уравнений

Если количество уравнений и количество неизвестных равны, список неизвестных можно не писать: solve([уравнение1, уравнение2 …])(не забудьте квадратные скобки, иначе Maxima примет его за вариант с одним уравнением).

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

Если solve не находит точных решений, она может вернуть уравнение или систему уравнений в некотором упрощенном виде, а может и самостоятельно попытаться решить систему численно:

Команда solve не такая мощная, как в Maple или Mathematica, поэтому иногда приходится додумывать самому.

Пример 1. Необходимо решить иррациональное уравнение:

Если мы попробуем непосредственно решить это уравнение при помощи solve, то мы получим неправильный результат

Попробуем тогда возвести обе части уравнения в квадрат, и решаем полученное уравнение при помощи solve:

Пример 2. Найти координаты общих точек графиков функций:

Абсциссы искомых точек - корни иррационального уравнения -2*x-1=sqrt(2*x+3).Возведем обе части уравнения в квадрат(учтем, что при этом должно быть -2*x-1>=0):

Решаем получившееся уравнение:

Проверяем, какой из корней удовлетворяет условию -2*x-1>=0:

Во втором случае условие выполнено. Абсцисса общей точки x=-1(что совпадает с графиком). Найдем ординату точки пересечения - подставим в одно из выражений найденную абсциссу:

Итак, координаты общей точки - (-1:1).

Предел

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

limit(выражение f(x), переменная x, точка a),

то есть то, что в математической записи выглядит как , в контексте Maxima запишется как limit(f(x), x, a):

Взятие производной

Для взятия производной используется функция diff(выражение, переменная). Можно также брать производные высших порядков от функций многих переменных:

diff(выражение, переменная, порядок, переменная, порядок,)

Интеграл

Основная функция интегрирования называется integrate и имеет два варианта вызова: для нахождения неопределенного и определенного интегралов. Первый выглядит как integrate(выражение, переменная), второй — как integrate(выражение, переменная, нижний-предел, верхний-предел):

Графики

Plot 2d(Построение графиков на плоскости)

Кратчайший вариант ее вызова такой: plot2d(выражение, [символ, начало, конец]), где выражение задает функцию, график которой нужно построить, символ — неизвестное (он должен быть единственным неопределенным символом, входящим в выражение), а начало и конец задают отрезок оси Х для построения графика; участок по оси Y в таком варианте записи выбирается автоматически, исходя из минимума и максимума функции на заданном промежутке. Обратите внимание, что неизвестное и концы промежутка нужно задавать не тремя отдельными параметрами, как, скажем, в integrate, а в виде списка. Это связано с тем, что plot2d может принимать еще и дополнительные аргументы — в таком случае они перечисляются следом за таким списком, что исключает всякую путаницу.

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

plot2d(выражение, [символ, начало, конец], [y, начало, конец]).

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

Пример построения графика функции, заданной параметрически(то есть x=x(t),y=y(t)), приведен на следующем рисунке:

Plot3d(Построение пространственных графиков функций)

Функция plot3d имеет два варианта вызова: один для явного задания функции и один для параметрического. В обоих случаях функция принимает три аргумента. Для явно заданной функции:

 plot3d(выражение, [переменная1, начало, конец], [переменная2, начало, конец]);

аргументы аналогичны plot2d, с той разницей, что здесь независимых переменных две.

Построение нескольких поверхностей на одном графике не поддерживается — потому, вероятно, что на таком рисунке проблематично было бы что-либо разглядеть. Посему для параметрически заданной функции ключевое слово parametric не требуется: вызов с первым аргументом-списком уже не с чем перепутать. График параметрически заданной функции строится так:

plot3d([выражение1, выражение2, выражение3], [переменная1, начало, конец], [переменная2, начало, конец]),

где выражения отвечают, по порядку, x(u, v), y(u, v), z(u, v).

Назад: Компьютерная математика с Maxima