Maxima

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

English Türkçe

Ответы на часто задаваемые вопросы

© 2007 Алексей Бешенов <al@beshenov.ru>, русский перевод.

Версия Maxima на момент последнего обновления — 5.9.0.

Последнее обновление — 16 сентября 2007 г.

© 2003 Judah Milgram. Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

Содержание

1. Основные вопросы

2. Документация

3. Установка Maxima

4. LISP

5. Emacs

6. Ошибки и другие проблемы

7. Дополнительные пакеты

8. Вопросы новичков

9. Вывод в TEX

1. Основные вопросы

1.1. Благодарности

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

Вот люди, которым мы хотим вынести особые благодарности:

  • Джей Белангер,
  • Ричард Фейтман,
  • Девид Холмгрен,
  • Николаос Иоакимидис,
  • Ставрос Макракис,
  • Мартин Рубей,
  • Реймонд Той,
  • Бартон Уиллис.

Отдельная благодарность Уильяму Шелтеру.

1.2. Кто-то на самом деле задавал эти вопросы?

Многие из них :-)

1.3. Что такое Maxima?

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

1.4. В чем различия между Macsyma, DOE-Macsyma, Symbolics Macsyma и Maxima?

Разработанная в MIT система была названа Macsyma. Иногда использовались сокращенные названия «MACSYM» и «MAXIMA», так как имена файлов были ограничены шестью символами верхнего регистра шестибитной кодировки.

Symbolics лицензировал Macsyma у MIT и зарегистрировал торговую марку «Macsyma», видимо, с разрешения MIT.

Когда исходный код Macsyma перестал быть доступным бесплатно, на MIT было оказано давление (в основном, Ричардом Фейтманом), чтобы код, разработанный в значительной степени совместно с Министерством энергетики США, был передан министерству, которое далее опубликовало бы исходники для третьих лиц под соответствующей лицензией.

Эта основа кода была названа DOE Macsyma (от «Department of Energy»). Неизвестно, какие законные права министерство имело на название Macsyma, в отличие от прав на собственно код, но, по-видимому, некоммерческие пользователи DOE Macsyma, желая избежать юридические споры по поводу названия, с какого-то момента стали именовать пакет Maxima.

Так что Maxima есть просто последнее название ветки разработки, начатой как «DOE Macsyma».

1.5. Кто написал систему?

Maxima — потомок DOE Macsyma, разработанной в начале 60-х в MIT. Это единственная основанная на Macsyma система, все еще публично доступная и имеющая активное сообщество пользователей благодаря своей открытости. Macsyma произвела в свое время переворот в компьютерной алгебре и оказала влияние на многие другие системы, в числе которых Maple и Mathematica. Работу над Maxima вел Уильям Шелтер с 1982 года и до своей кончины в 2001 году. Выживание Maxima стало возможным только благодаря его усилиям и способностям, мы очень благодарны ему за уделенные проекту время и знания эксперта, которые поддерживали код DOE Macsyma актуальным и качественным.

1.6. Кто сейчас занимается поддержкой?

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

1.7. Свободна (бесплатна) ли Maxima?

Да. Maxima распространяется по GNU General Public License с некоторыми ограничениями на использование кода от Министерства энергетики США.

1.8. Какие еще есть пакеты символьной математики?

Есть еще несколько, однако не все они имеют открытый исходный код и не все бесплатны.

По отзывам пользователей, Jacal и Yacas не имеют такой широкий набор команд, как Maxima; Calc немногим более развит и, в частности, включает хороший интегратор.

2. Документация

2.1. Где я могу прочитать о Maxima?

2.2. Откуда два «Справочных руководства»?

Исходное руководство за авторством Уильяма Шелтера больше не поддерживается. Текст Майка Кларксона не является в точности заменой руководства Шелтера, а скорее отдельной работой, подготовленной ранее для DOE-Macsyma и адаптированной для Maxima с изменением DOE-Macsyma на DOE-Maxima в названии.

2.3. Что со страницей на utexas.edu? Она показывает версии только по 5.6.0

По адресу http://www.ma.utexas.edu/maxima.html находилась старая домашняя страница Уильяма Шелтера, и больше она не поддерживается. Однако там можно найти некоторые снимки экрана и другую полезную информацию.

2.4. Что насчет LISP?

Вот некоторые английские сайты с хорошей информацией о Common LISP:

3. Установка Maxima

3.3. Какие дистрибутивы Linux включают Maxima?

Насколько нам известно, есть только два дистрибутива, включающих Maxima:

  • Debian (нестабильная ветвь
  • ALT Linux (Master 2.0, Master 2.2)

4. LISP

4.1. С какими реализациями LISP может работать Maxima?

CLISP, CMUCL и GCL полностью поддерживаются Maxima; предыдущие версии Maxima полностью поддерживали только GCL. Порты для других ANSI-реализаций LISP не должны вызвать трудностей и приветствуются; свяжитесь с разработчиками, если заинтересованны в работе по портированию.

4.2. CLISP

CLISP включает поддержку GNU readline, так что при сборке на нем Maxima будет иметь дополнительные удобства редактирования в командной строке. Maxima не может быть собрана на версии 2.26 из-за ошибок в CLISP. 2.28 и 2.29 работает; в 2.30 есть проблемы с числами с плавающей точкой, так что рекомендуется 2.29.

4.3. CMUCL

CMUCL является самым быстрым вариантом для Maxima на тех платформах, где он доступен. К сожалению, он не включает поддержку readline, но ее можно добавить, обернув Maxima исполняемым файлом ledit . Maxima собирается с CMUCL 18c, но зависает на некоторых операциях времени исполнения. 18d должно работать.

4.4. GCL

Версии 2.4.4 и 2.5.0 должны подойти. 2.5.0 не издана на момент написания текста, cvs-версии 2.5.0 были успешно использованы для сборки Maxima. Версии с 2.4.3 могут собираться с поддержкой readline.

5. Emacs

5.1. Как сделать доступным режим Maxima в Emacs?

Добавьте в ~/.emacs нечто вроде такого:

(setq auto-mode-alist (cons '("\\.max" . maxima-mode) auto-mode-alist))
(setq load-path (cons "/usr/share/maxima/5.9.0/emacs" load-path ))
(autoload 'maxima "maxima" "Running Maxima interactively" t)
(autoload 'maxima-mode "maxima" "Maxima editing mode" t)

Вместо изменения пути загрузки, вы можете копировать все файлы .el из /usr/share/maxima/5.9.0/emacs (или откуда еще) в директорию site-lisp вашего пути загрузки.

6. Ошибки и другие проблемы

6.1. Почему в столь старой программе еще существуют элементарные ошибки?

Я только что отправил сообщение об ошибке на SourceForge и удивлен тому, что в столь старой программе еще существуют элементарные ошибки. Это то, что мой калькулятор может сделать сейчас, а этой программе, по-видимому, уже около 30 лет.

Ответ:

  1. Вы могли сообщить о том, что не является ошибкой, а связано с непониманием того, что программа должна делать. (Это очень распространено, хотя, конечно, может и не относиться к вашему отчету).
  2. Та возможность, которую вы использовали, была написана не 30 лет назад пользователем, во многом таким же, как вы, и не была протестирована, так как не является основной функцией системы. Может быть, она написана в конце 70-х.
  3. Большая часть этой системы не проверялась с 1982 года, так что последние лет 20 (когда работа шла только над коммерческой версией) не в счет.
  4. Если была найдена ошибка, надеемся, она исправлена.

6.2. Как лучше сообщить об ошибке?

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

Базовый отчет об ошибке включает достаточно информации для ее воспроизведения, в том числе информацию о версии, полученную при помощи bug_report().

Качественный полный отчет включает:

  • Хороший заголовок, передающий суть проблемы.
  • Ясный порядок воспроизведения ошибки. Убедитесь, что ошибка может воспроизводиться в последней версии системы. Если вы не можете повторить ошибку, включите как можно больше сведений о том, что вы делали перед тем, как она проявилась. Чем проще руководство по воспроизведению ошибки, тем лучше; также лучше, если оно сведется к простому случаю. Также полезно привести случаи, которые имеют небольшие отличия, но не приводят к ошибке.
  • Если это не полностью ясно, объяснение, почему ответ ошибочен и каков верный ответ.
  • Полная версия, которую вы используете, как выводит bug_report().
  • Краткое замечание о том, почему важно решить проблему (чтобы помочь разработчикам разделить работу по приоритетам), например, «практически каждый пользователь рано или поздно встретится с этой коварной ошибкой и потеряет все свои наработки», или «эта ошибка не дает нашей группе использовать Maxima, так как этот класс матриц используется повсеместно в популяционной генетике», или «для начала подойдет способ обхода ошибки», «это искусственно созданный случай, я почти уверен, что он никогда не встретится простому пользователю» (хотя часто ошибки в сложных случаях проявляют себя также и в простых ситуациях).
  • Если вы знаете, как избежать проблему, или у вас есть код, исправляющий ее, укажите в заголовке «FIX», чтобы разработчики могли быстро зарегистрировать отчет.
  • Некоторые проблемы могут быть не ошибками, а функциональными ограничениями. В этом случае интересно знать, что делают другие системы, особенно коммерческая Macsyma. Если вы знаете, почему должно быть ограничение, укажите («Согласно теории Кратова, задача не решается в общем случае»). Также интересен метод их обработки, например, «пакет для ОДУ не обрабатывает триэкспоненциальный случай седьмого порядка, но это может muPad 29.23; думаю, модифицированный метод Фуока-Мафуза в реализации Одибвы (J.Sym.Alg. 23:5:230) обрабатывает его верно». А еще лучше добавить «…и я реализую это для Maxima 6.0» :-).

6.3. Тексты сессий в сообщениях об ошибках

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

Так что если вы цитируете тексты сессий, пожалуйста, сделайте одно из двух:

  • замените символы табуляции пробелами (например, используя утилиту UNIX expand или команду Emacs untabify),
  • отключите display2d при получении текста.

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

Пример:

(C47) taylor(erf(x),x,0,5);
                                          3              5
         (2 SQRT(%PI)) x   (2 SQRT(%PI)) x    SQRT(%PI) x
(D47)/T/ --------------- - ---------------- + ------------ + . . .
               %PI              3 %PI            5 %PI

Так это выглядит в некоторых почтовых агентах:

                                3          5
         (2 SQRT(%PI)) x (2 SQRT(%PI)) x    SQRT(%PI) x
(D47)/T/ --------------- - ---------------- + ------------ + . . .
               %PI        3 %PI            5 %PI

То же самое после untabify:

(C47) taylor(erf(x),x,0,5);
                                          3              5
         (2 SQRT(%PI)) x   (2 SQRT(%PI)) x    SQRT(%PI) x
(D47)/T/ --------------- - ---------------- + ------------ + . . .
               %PI              3 %PI            5 %PI

Если использовано display2d:false:

(C48) display2d:false;
(D48) FALSE
(C49) d47;
(D49) 2*SQRT(%PI)*x/%PI-2*SQRT(%PI)*x^3/(3*%PI)+SQRT(%PI)*x^5/(5*%PI)

6.4. Что делать с проблемами компиляции?

Отправьте описание проблемы на https://sourceforge.net/tracker/?group_id=4933&atid=104933

  • Если вы подозреваете GCL, направьте копию <gcl-devel@gnu.org>
  • Советуем держаться подальше от gcc-2.96 — эта версия компилятора известна как неустойчивая, и есть что-то будет работать, то только по недоразумению. gcc-2.95, gcc-3.0, gcc-3.1 и gcc-3.2 должны работать с GCL cvs или последней стабильной версией.
  • Отправьте полный вывод конфигурации и сборки вместе с информацией о версиях библиотек, от которых зависит GCL (ldd saved_gcl), компилятора и binutils.
    binutils: ld -v,
    gcc: gcc -v.

6.5. Maxima 5.9.0 не работает с GCL 2.4.0

Вам требуется более поздняя версия GCL. Известно, что 2.4.0 не подходит. Судя по всему, 2.4.x работает для некоторых x, также как и 2.5.x.

7. Дополнительные пакеты

7.1. Графы и гиперграфы

Пакет Мартина Рубей graphs.lisp позволяет Maxima генерировать различные графы и гиперграфы, рассчитывать некоторые их свойства и предоставляет интерфейс к программе PIGALE, которая пытается аккуратно отобразить графы на экране.

8. Вопросы новичков

8.1. inchar и outchar

Когда я ввел уравнение

(C1) eq1:v1=(1/(z-1))*(b1*vin - g1*v2 - c1*fb);

я получил на выводе совершенно не то, что ожидал.

Ответ:

«c1» — это ваше объявление ввода. Обратите внимание, что входные и выходные строки имеют метки вроде «(C1)» и «(D1)». Попробуйте использовать другое имя переменной, например «c_1».

Иначе вы можете поменять символы, используемые в метках, установив inchar и outchar:

(C1) inchar;
(D1)                                        C
(C2) outchar;
(D2)                                        D
(C3) inchar : c_;
(D3)                                       c_
(c_3) outchar : d_;
(d_3)                                       d_
(c_4) 5!;
(d_4)                                       120

8.2. Решение систем уравнений

Я хочу вывести n[v]=2*n-n[c]-2 из

n[e]=1/2*(3*n[v]+n[c])

и

n-n[e]+n[v]=1

Другими словами, я хочу выразить n[v] через другие переменные. Но solve не делает это для меня. Какую функцию нужно использовать?

Ответ:

Нужно использовать solve для двух переменных:

(C1) n[e]=1/2*(3*n[v]+n[c]);

                                 3 n  + n
                                    v    C
(D1)                        n  = ---------
                             e       2
(C2) n-n[e]+n[v]=1;

(D2)                       n  + n - n  = 1
                            v        e

(C3) solve([d1,d2],[n[v],n[e]]);

(D3)           [[n  = 2 n - n  - 2, n  = 3 n - n  - 3]]
                  v          C       e          C

Другая возможность:

(C1) eliminate([n[e]=1/2*(3*n[v]+n[c]),n-n[e]+n[v]=1],[n[e]]);
(D1)                         [- n  + 2 n - n  - 2]
                                 v          c
(C2) solve(%,n[v]);
(D2)                          [n  = 2 n - n  - 2]
                                v          c

8.3. Как извлечь столбец матрицы?

m[i] — i-я строка матрицы m. Есть ли какой-то способ получить столбец? Я знаю про col(m,i), но col возвращает матрицу и присвоить ей значение невозможно. Удобно писать «m[i]:[1,2,3]». Почему я не могу сделать то же самое со столбцами?

Ответ:

Попробуйте транспонировать m, а потом транспонировать снова.

8.4. Почему в циклах не работает «return»?

Пример:

(C1) block([],for i:1 thru 5 do return(1), 0);
(D1) 0

Ответ:

1 возвращается циклом for, затем блок возвращает 0.

8.5. desolve не работает?!

desolve(diff(y(x),x)=(4-2*x)/(3*y^2-5),y(x)) дает неверный ответ.

Ответ:

Как сказано в документации, «функциональные отношения должны явно обозначаться». Поэтому в desolve вы не можете написать 'diff(y(x),x)=y+x, вы должны написать 'diff(y(x),x)=y(x)+x. Поэтому desolve не может решить это, но может ode2, однако ode2 принимает другую форму ввода (да, это нелогично и это раздражает): depends(y,x); 'diff(y,x)=y+x. Исходный код:

(C1) depends(y,x);
(D1)                               [y(x)]
(C2) 'diff(y,x)=(4-2*x)/(3*y^2-5);
                               dy   4 - 2 x
(D2)                           -- = --------
                               dx      2
                                    3 y  - 5
(C3) ode2(%,y,x);
                            3          2
                           y  - 5 y   x  - 4 x
(D3)                     - -------- = -------- + %C
                              2          2

Теперь давайте проверим ответ:

(C4) diff(d3,x);
                              2 dy     dy
                           3 y  -- - 5 --
                                dx     dx   2 x - 4
(D4)                     - -------------- = -------
                                 2             2
(C5) solve(d4,'diff(y,x));
                              dy     2 x - 4
(D5)                         [-- = - --------]
                              dx        2
                                     3 y  - 5
(C6) subst(d5,d2);
                             2 x - 4    4 - 2 x
(D6)                       - -------- = --------
                                2          2
                             3 y  - 5   3 y  - 5
(C7) ratsimp(lhs(d6)-rhs(d6));
(D7)                                 0

8.6. Нужна ли кавычка?

Выше в примере с desolve, если вы указываете системе, что y зависит от x, вам не нужно ставить кавычку перед оператором diff. Кавычка нужна, если не напечатано depends(y,x).

Ответ:

Верно. В примере с ОДУ вы можете не указывать depends и поставить кавычку перед diff, или указать depends и ставить перед diff кавычку на свое усмотрение.

Кавычка подчеркивает, что вы имеете в виду дифференциал, а не выполняете дифференцирование.

Конечно, обсуждение desolve и ode2 должно проводиться в более широком контексте «как решать дифференциальные уравнения». Здесь только подход desolve к зависимостям (использование явных функций вроде f(x)) сравнивается с подходом ode2 (указать, что y зависит от x или просто поставить кавычку перед дифференциалом).

8.7. Подстановка

Вопрос:

У меня есть такой вызов функции в более сложном выражении:

erf((((64800 * %i + 64800) * t + 37 * %i + 35)/72))

У меня есть другая функция acref, которая принимает два аргумента, первый — аргумент функции ошибок, второй — порядок аппроксимации. Я хочу подставить вызов acerf вместо erf в мое более сложное выражение, например:

acerf((((64800 * %i + 64800) * t + 37 * %i + 35)/72), 2)

Есть ли простой способ сделать это в Maxima?

Ответ:

matchdeclare(any, true)$
defrule(r1,erf(any), acerf(any,order))$
order:2$

apply1(expression, r1);

Или что-то в таком духе.

9. Вывод в TEX

9.1. Как мне настроить вывод отдельных переменных Maxima в TEX?

Создайте файл «foo.lisp» (или любой другой) c выражениями LISP вроде

(defprop $cla "c_{l_\alpha}" texword)

Затем загрузите его в свой сценарий, например:

(C1) load("foo.lisp");
(D1)                               foo.lisp
(C2) tex(cla);
$$c_{l_alpha}$$

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

(C1) texput(cla, "c_{l_\\alpha}")$

(C3) tex(cla);
$$c_{l_\alpha}$$

Обратите внимание, что здесь мы должны использовать двойной слэш перед alpha, чтобы получить один слэш в разметке TEX.