Тихон Тарнавский. Maxima — максимум свободы символьных вычислений. Система команд, вычисления в Maxima Maxima описание

  • Дата: 27.12.2022

Математический пакет Maxima - одна из лучших бесплатных замен маткаду.

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

  • Предисловие
  • Глава 1. Основы работы в системе компьютерной математики Maxima
    • 1.1. О системе Maxima
    • 1.2. Установка Maxima на персональный компьютер
    • 1.3. Интерфейс основного окна Maxima
    • 1.4. Работа с ячейками в Maxima
    • 1.5. Работа со справочной системой Maxima
    • 1.6. Функции и команды системы Maxima
    • 1.7. Управление процессом вычислений в Maxima
    • 1.8. Простейшие преобразования выражений
    • 1.9. Решение алгебраических уравнений и их систем
    • 1.10. Графические возможности
  • Глава 2. Численные методы решения дифференциальных уравнений
    • 2.1. Общие сведения о дифференциальных уравнениях
    • 2.2. Численные методы решения задачи Коши для обыкновенного дифференциального уравнения первого порядка
      • 2.2.1. Метод Эйлера
      • 2.2.2. Метод Эйлера-Коши
      • 2.2.3. Метод Рунге-Кутта 4 порядка точности
    • 2.3. Решение краевых задач для обыкновенных дифференциальных уравнений методом конечных разностей
    • 2.4. Метод сеток для решения дифференциальных уравнений в частных производных
  • Глава 3. Нахождение решений дифференциальных уравнений в системе Maxima
    • 3.1. Встроенные функции для нахождения решений дифференциальных уравнений
    • 3.2. Решение дифференциальных уравнений и их систем в символьном виде
    • 3.3. Построение траекторий и поля направлений дифференциальных уравнений.
    • 3.4. Реализация численных методов решения задачи Коши для обыкновенных дифференциальных уравнений
      • 3.4.1. Метод Эйлера
      • 3.4.2. Метод Эйлера-Коши
      • 3.4.3. Метод Рунге-Кутта
    • 3.5. Реализация конечно-разностного метода решения краевой задачи для обыкновенных дифференциальных уравнений
    • 3.6. Реализация метода сеток для дифференциальных уравнений в частныхпроизводных
  • Задания для самостоятельного решения
  • Литература

Предисловие

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

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

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

Учитывая современной развитие компьютерной техники и интенсивное развитие нового направления - компьютерной математики - получили широкое распространение и спрос комплексы программ, называемые системами компьютерной математики.

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

Современные системы компьютерной математики представляют собой программы с многооконным графическим интерфейсом, развитой системой помощи, что облегчает их освоение и использование. Основными тенденциями развития СКМ являются рост математических возможностей, особенно в сфере аналитических и символьных вычислений, существенное расширение средств визуализации всех этапов вычислений, широкое применение 2D- и 3D-графики, интеграция различных систем друг с другом и другими программными средствами, широкий доступ в Internet, организация совместной работы над образовательными и научными проектами в Internet, использование средств анимации и обработки изображений, средств мультимедиа и др.

Существенным обстоятельством, которое до недавнего времени препятствовало широкому использованию СКМ в образовании, является дороговизна профессионального научного математического обеспечения. Однако в последнее время многие фирмы, разрабатывающие и распространяющие такие программы, представляют (через Internet - http://www.softline.ru) для свободного использования предыдущие версии своих программ, широко используют систему скидок для учебных заведений, бесплатно распространяют демонстрационные или пробные версии программ .

Кроме того, появляются бесплатные аналоги систем компьютерной математики, например, Maxima, Scilab, Octave и др.

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

Почему именно Maxima?

Во-первых, система Maxima - это некоммерческий проект с открытым кодом. Maxima относится к классу программных продуктов, которые распространяются на основе лицензии GNU GPL (General Public License).

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

В-третьих, в настоящее время у системы Maxima есть мощный, эффективный и «дружественный» кроссплатформенный графический интерфейс, который называется WxMaxima (http://wxmaxima.sourceforge.net).

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

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

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

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

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

Т.Н. Губина, Е.В. Андропова
Елец, июль 2009

P.S. Быстрый старт: для выполнения команд и функций в mwMaxima нужно непосредственно сначала ввести саму команду и затем нажать crtl+Enter.

Так как в этом цикле статей речь пойдет о математической программе для символьных вычислений, для начала пару слов о том, что из себя представляют эти самые символьные или, как их еще называют, аналитические вычисления, в отличие от численных расчетов. Компьютеры, как известно, оперируют с числами (целыми и с плавающей запятой). К примеру, решения уравнения 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 не имели на тот момент никаких значений; таким образом, мы можем смело блокировать вычисление символа, даже не запоминая (или не зная), присвоены ли им вообще какие-то выражения.

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

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


Операции математического анализа

Суммы

Для нахождения сумм предназначена функция sum. Синтаксис функции:

Sum(выражение, переменная, нижняя граница изменения переменной, верхняя граница изменения переменной)

Например:

Если присвоить последнему аргументу значение системной переменной положительной бесконечности "inf", то это станет признаком отсутствия верхней границы и будет рассчитываться бесконечная сумма. Так же бесконечная сумма будет рассчитываться, если присвоить аргументу "нижний предел изменения переменной" значения системной переменной отрицательной бесконечности "minf". Эти же значения используется и в других функциях математического анализа.

Например:


Произведения

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

Например:


Пределы

Для нахождения пределов используется функция limit.

Синтаксис функции:

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

Если аргументу "точка разрыва" присвоить значение "inf", то это будет признаком отсутствия границы.

Например:

Для вычисления односторонних пределов используется дополнительный аргумент, который имеет значение plus для вычисления пределов справа и minus - слева.

Например, выполним исследование непрерывности функции arctg(1/(x - 4)). Эта функция неопределенна в точке x = 4. Вычислим пределы справа и слева:

Как видим, точка x = 4 является точкой разрыва первого рода для данной функции, поскольку существуют границы слева и справа, которые равняются соответственно -PI/2 и PI/2.


Дифференциалы

Для нахождения дифференциалов используется функция diff. Синтаксис функции:

diff(выражение, переменная1, порядок производной для переменной1 [,переменная2, порядок производной для переменной2,…])

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

Например:

Вообще обязательным для функции diff является только первый аргумент. В таком случае функция возвращает дифференциал выражения. Дифференциал соответствующей переменной обозначается через del(имя переменной):

Как видим из синтаксиса функции, пользователь имеет возможность определить одновременно несколько переменных дифференцирования и задать порядок для каждой из них:

Если использовать параметрическую функцию, то форма записи функции изменяется: после имени функции записываются символы ":=", а обращение к функции осуществляется через ее имя с параметром:

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

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


Интегралы

Для нахождения интегралов в системе используется функция integrate. Для нахождения неопределенного интеграла в функции используются два аргумента: имя функции и переменная, по которой происходит интегрирование. Например:

В случае неоднозначного ответа Maxima может задать дополнительный вопрос:

Ответ должен содержать текст из вопроса. В данном случае, если значение переменной y больше "0", это будет "positive" (положительное), а иначе - "negative" отрицательное). При этом допускается ввод только первой буквы слова.

Для нахождения определенного интеграла в функции следует указать дополнительные аргументы: пределы интеграла:

Maxima допускает задания и бесконечных пределов интегрирования. Для этого для третьего и четвертого аргументов функции используются значения "-inf" и "inf":

Для нахождения приближенного значения интеграла в численном виде, как отмечалось ранее, следует выделить результат в ячейке вывода, вызывать на ней контекстное меню и выбрать из него пункт "To Float" (преобразовать в число с плавающей точкой).

Способна система вычислять и кратные интегралы. Для этого функции integrate вкладываются одна в другую. Ниже приводятся примеры вычисления двойного неопределенного интеграла и двойного определенного интеграла :


Решения дифференциальных уравнений

По своим возможностями в части решения дифференциальных уравнений Maxima ощутимо уступает, например, Maple. Но Maxima все же позволяет решать обычные дифференциальные уравнения первого и второго порядков, а также их системы. Для этого - в зависимости от цели - используют две функции. Для общего решения обычных дифференциальных уравнений используется функция ode2, а для нахождения решений уравнений или систем уравнений по начальным условиям - функция desolve.

Функция ode2 имеет такой синтаксис:

ode2(уравнение, зависимая переменная, независимая переменная);

Для обозначения производных в дифференциальных уравнениях используется функция diff. Но в этом случае с целью отображения зависимости функции от ее аргумента она записывается в виде "diff(f(x), x), а сама функция - f(x).

Пример. Найти общее решение обычного дифференциального уравнения первого порядка y" - ax = 0.

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

Как видим, во время решения дифференциальных уравнений Maxima использует постоянную интегрирования %c, которая с точки зрения математики является произвольной константой, определяемой из дополнительных условий.

Осуществить решение обычного дифференциального уравнения можно и другим, более простым для пользователя, способом. Для этого следует выполнить команду Уравнения > Solve ODE (Решить обычное дифференциальное уравнение) и в окне "Решить ОДУ" ввести аргументы функции ode2.

Maxima позволяет решать дифференциальные уравнения второго порядка. Для этого также применяют функцию ode2. Для обозначения производных в дифференциальных уравнениях используется функция diff, в которой добавляют еще один аргумент - порядок уравнения: "diff(f(x), x, 2). Например решение обычного дифференциального уравнения второго порядка a·y"" + b·y" = 0 будет иметь вид:

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

  1. ic1(результат работы функции ode2, начальное значение независимой переменной в виде x = x 0 , значение функции в точке x 0 в виде y = y 0). Предназначена для решения дифференциального уравнения первого порядка с начальными условиями.
  2. ic2(результат работы функции ode2, начальное значение независимой переменной в виде x = x 0 , значение функции в точке x 0 в виде y = y 0 , начальное значение для первой производной зависимой переменной относительно независимой переменной в виде (y,x) = dy 0). Предназначена для решения дифференциального уравнения второго порядка с начальными условиями
  3. bc2(результат работы функции ode2, начальное значение независимой переменной в виде x = x 0 , значение функции в точке x 0 в виде y = y 0 , конечное значение независимой переменной в виде x = x n , значение функции в точке x n в виде y = y n). Предназначена для решения краевой задачи для дифференциального уравнения второго порядка.

Подробно с синтаксисом этих функций можно ознакомиться в документации к системе.

Выполним решение задачи Коши для уравнения первого порядка y" - ax = 0 с начальным условием y(п) = 1.

Приведем пример решения краевой задачи для дифференциального уравнения второго порядка y""+y=x с начальными условиями y(o) = 0; y(4)=1.

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

В таких случаях Maxima или выдает сообщение об ошибке (как в данном примере) или просто возвращает значение "false".

Другой вариант решения обычных дифференциальных уравнений первого и второго порядков предназначен для поиска решений с начальным условиями. Он реализуется с помощью функции desolve.

Синтаксис функции:

desolve(дифференциальное уравнение, переменная);

Если осуществляется решение системы дифференциальных уравнений или есть несколько переменных, то уравнение и/или переменные подаются в виде списка:

desolve([список уравнений], [переменная1, переменная2,...]);

Так же как и для предыдущего варианта, для обозначения производных в дифференциальных уравнениях используется функция diff, которая имеет вид "diff(f(x), x).

Начальные значения для переменной предоставляются функцией atvalue. Эта функция имеет такой синтаксис:

atvalue(функция, переменная = точка, значение в точке);

В данном случае предусматривается, что значения функций и (или) их производных задаются для нуля, потому синтаксис функции atvalue имеет вид:

atvalue(функция, переменная = 0, значение в точке "0");

Пример. Найти решение дифференциального уравнения первого порядка y"=sin(x) с начальным условием.

Заметим, что и при отсутствии начального условия функция также сработает и выдаст результат:

Это позволяет осуществить проверку решения для конкретного начального значения. Действительно, подставляя в полученный результат значение y(0) = 4, как раз и получаем y(x) = 5 - cos(x).

Функция desolve дает возможность решать системы дифференциальных уравнений с начальными условиями.

Приведем пример решения системы дифференциальных уравнений с начальными условиями y(0) = 0; z(0) = 1.


Обработка данных

Статистический анализ

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

Самым простым способом расчета статистических описательных статистик является использование палитры "Statistics" (Статистика).

Панель содержит ряд инструментов, сгруппированных в четыре группы.

  1. Статистические показатели (описательные статистики):
    • mean (средняя арифметическая);
    • median (медиана);
    • variance (дисперсия);
    • deviation (среднее квадратичное отклонение).
  2. Тесты.
  3. Построение пяти типов графиков:
    • гистограмма (Histogram). Используется в первую очередь в статистике для изображения интервальных рядов распределения. Во время ее построения по оси ординат откладывают части или частоты, а на оси абсцисс - значения признака;
    • диаграмма рассеяния (диаграмма корреляции, поле корреляции, Scatter Plot) - график по точкам, когда точки не соединяются. Используется для отображения данных для двух переменных, одна из которых является факторной, а другая - результативной. С ее помощью осуществляется графическое представление пар данных в виде множества точек ("тучи") на координатной плоскости;
    • ленточная диаграмма (Bar Chart) - график в виде вертикальных столбцов;
    • секторная, или круговая, диаграмма (Pie Chart). Такая диаграмма разделена на несколько сегментов-секторов, площадь каждого из которых пропорциональна их части;
    • коробочная диаграмма (коробка с усами, шкатулка с усами, Box Plot, box-and-whisker diagram). Именно она чаще всего используется для изображения статистических данных. Информация такого графика является очень содержательной и полезной. Он одновременно отображает несколько величин, которые характеризуют вариационный ряд: минимальное и максимальное значение, среднюю и медиану, первый и третий квартиль.
  4. Инструменты для считывания или создания матрицы. Для использования инструментов палитры необходимо иметь начальные данные в виде матрицы - одномерного массива. Его можно создать в документе с текущей сессией и в дальнейшем подставлять его название как входные данные в окнах инструментов палитры аналогично решению уравнений с помощью панели общих математических действий (General Math). Можно и непосредственно задавать в данные в окнах ввода входных данных. В этом случае они вводятся в принятом в системе виде, то есть в квадратных скобках и через запятую. Понятно, что первый вариант является значительно лучшим, поскольку он требует только одноразового введения данных.

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

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

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

Ключевые особенности и функции

  • представляет собой очень удобную графическую оболочку системы компьютерной алгебры Maxima;
  • служит для построения и вычисления символьных и численных выражений;
  • работает с матрицами, векторами, уравнениями, тензорами, графиками;
  • производит операции дифференцирования, интегрирования, преобразования Лапласа, разложения в ряд и так далее;
  • сопровождается подробной документацией.
Введение
Maxima - свободная система компьютерный алгебры (Computer algebra system - CAS), основанная на Common Lisp. В своих функциональных возможностях она едва уступает другим современным платным CAS, таким как Mathcad, Mathematica, Maple; может проводить аналитические (символьные) вычисления, численные расчеты, строить графики (при помощи gnuplot). Имеется возможность написания скриптов и даже трансляции их в код на Common Lisp с последующей компиляцией. В виду того, что maxima писалась из разрабатывалась программистами lisp, ее синтаксис может показаться несколько запутанным, поскольку язык является сразу и императивным и функциональным. Я попытаюсь разъяснить именно эти моменты и доступно изложить суть функционального подхода, и совсем не буду акцентировать внимания на конкретных математических функциях: их довольно легко освоить самостоятельно. В данной статье рассматривается именно особенности исчисления и синтаксических конструкций maxima.
Оболочки
Разумеется, вызывать интерпретатор maxima из консоли не очень удобно. Мы хотим смотреть на красивые формулы, которые отрендерены с помощью latex. Поэтому, для начинающих, я бы посоветовал поставить оболочку . Если вы увлекаетесь TeXmacs - можете настроить и его в качестве оболочки (если честно, я не пробовал). Ну и для любителей emacs есть imaxima , для работы в буфере. Ставится он буквально из коробки.
Знакомство
На первый взгляд все просто: вводим выражение, заканчивающееся точкой с запятой, получаем ответ. Можете испробовать maxima в качестве калькулятора, вычислить сумму двух чисел, подсчитать синус угла и т.п. Копнем глубже, что же происходит.
Атомы
Символы, числа и логические константы true и false представляют собой простейшие объекты системы. Из них выстраиваются все остальные выражения и структуры языка, поэтому их называют атомарными (неделимыми) или просто атомами.
Переменные

В системе различают свободные и означенные переменные. Означенные переменные - связанные переменные, переменные к которым приписано какое то значение. При интерпретации имя переменной заменяется на ее значение. Задать переменную можно с помощью знака ":". Свободные переменные не связаны не с каким значением и мы можем оперировать с ними абстрактно, например, складывать два символьных выражения.

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


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

Попробуем сложить две переменные. А теперь поставим перед ними символ одинарной ковычки. Это оператор блокировки вычислений. Если мы поставим его перед именем переменной - в результате получим имя этой переменной, перед вызовом функции - символьное выражение вызова функции. Зачем? Иногда вам может потребоваться с помощью одной функции обработать выражение другой функции и на выходе получить функцию или число, например вычисление неопределенного интеграла. Другими словами вы имеете возможность представлять выражение как данные и манипулировать с ним. Однако если вы попробуете остановить вычисление суммы двух чисел, то вычисления не прекратятся. Это связано с тем, что оператор одинарной кавычки не останавливает простейшего упрощения выражения (простые операции над числами, сокращение дробей). Так же вычисления не остановятся, если вы попытаетесь посчитать значение функции рационального (float) аргумента.
И так, система Maxima не различает функции алгоритмические и функции математические, в ней они являются одним языковым элементом. В терминологии самого интерпретатора, операторы которые могут быть вычислены называются verb, те операторы, которые так остаются в невычесленом виде называются noun. Для инициирования вычисления всех noun необходимо в контексте вычислений выставить опцию nouns.

Вычисления
Мы узнали, что интерпретатор различает понятия символьного выражения и его вычисления. В каких случаях происходит вычисление? Самый очевидный случай - когда мы пытаемся посчитать какое то выражение (2+3, например). Ввели выражение - получили его значение. Посчитали функцию от аргумента - получили значение. Ввели имя переменной - получили ее значение. Мы узнали, что значением у переменной может быть как атом, так и символьное выражение. Когда еще происходит вычисление? Вычисление происходит при присваивание переменной значения. Значение стоящее справа от двоеточия вычисляется перед присвоением, поэтому при присвоении переменной символьного выражения мы ставим кавычку, что бы остановить это вычисление. Есть особенный вид присвоения (оператор два двоеточия), когда вычисляется как выражение справа, так и выражение слева. Так же перед вычислением функции вычисляются все ее аргументы.

Результатом вычисления переменной a слева оказывается переменная b.
Пример
Рассмотрим простой пример - построение множества всех подмножеств. Как оказалось, Maxima имеет встроенные типы для работы с множествами, а такой функции, увы, нет. Напишем ее.

Для начала разберемся что есть множества. По видимому, множества в Maxima основаны на другой структуре данных - односвязных списках. Что такое список понимают все. Они имеют три основные функции для работы с ними: получение элемента в голове списка (first), получение списка состоящего из исходного без первого элемента (rest), добавление нового элемента в начало (cons) и объединение двух списков (append). Аналогичные функции имеются и в любой реализации lisp, но чаще всего, называются немного по другому: car, cdr, cons, append соответственно.

Как вы обычно представляли себе алгоритм для решения такой задачи? Можно было бы представить подмножества в виде характеристического вектора и перебрать их все. Однако покажем именно функциональный подход. Нетрудно заметить, что каждый элемент входит ровно в половину подмножеств. Этого простого факта уже достаточно для того, что бы построить рекурсивный алгоритм. Выкинем один элемент a из множества A. Множество всех подмножеств A будет состоять из объединения множества всех подмножеств A\a и множества всех подмножества A\a, где к каждому элементу добавлено a. С помощью последнего утверждения можно сколько угодно рекурсивно понижать размерность задачи, сведя ее к тривиальному случаю. Для реализации нам необходима дополнительная функция от двух параметров (элемента и множества множеств), которая добавляла бы указанный элемент в каждое множество.

Обратим внимание, что объявление функции происходит почти как и в математике. Следует обратить внимание, что при определении правая часть после знака равно не вычисляется. (Для того что бы определить функцию так, что бы ее определение вычислялось необходимо использовать форму define). Здесь появляется новая вычислительная форма if. Она работает так же как и в императивных языках. При выполнении условия вычисляется выражение после then, при невыполнении - после else. Теперь запишем искомую функцию.

Попробуем что нибудь посчитать.

Конец
Ну вот и все. В следующей статье было бы неплохо описать реализацию наискорейшего градиентного спуска.