Система компьютерной алгебры
© 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.
inchar
и outchar
desolve
не
работает?!Множество людей участвовали в написании этого текста или в обсуждениях почтовой конференции Maxima, из которой и были позаимствованы многие материалы :-)
Вот люди, которым мы хотим вынести особые благодарности:
Отдельная благодарность Уильяму Шелтеру.
Многие из них :-)
Maxima основана на Macsyma, разработанной в MIT в 1970-х, и является полноценной программой символьных расчетов. Возможности включают символьные операции с многочленами, матрицами и рациональными функциями; интегрирование, алгоритм Тодда-Коксетера, построение графиков, расчеты над числами с плавающей точкой большой точности. Система довольно надежна, имеет отладчик, хорошую сборку мусора; не имеет утечек памяти, для проверки работы с ней поставляются сотни тестов.
Разработанная в MIT система была названа Macsyma. Иногда использовались сокращенные названия «MACSYM» и «MAXIMA», так как имена файлов были ограничены шестью символами верхнего регистра шестибитной кодировки.
Symbolics лицензировал Macsyma у MIT и зарегистрировал торговую марку «Macsyma», видимо, с разрешения MIT.
Когда исходный код Macsyma перестал быть доступным бесплатно, на MIT было оказано давление (в основном, Ричардом Фейтманом), чтобы код, разработанный в значительной степени совместно с Министерством энергетики США, был передан министерству, которое далее опубликовало бы исходники для третьих лиц под соответствующей лицензией.
Эта основа кода была названа DOE Macsyma (от «Department of Energy»). Неизвестно, какие законные права министерство имело на название Macsyma, в отличие от прав на собственно код, но, по-видимому, некоммерческие пользователи DOE Macsyma, желая избежать юридические споры по поводу названия, с какого-то момента стали именовать пакет Maxima.
Так что Maxima есть просто последнее название ветки разработки, начатой как «DOE Macsyma».
Maxima — потомок DOE Macsyma, разработанной в начале 60-х в MIT. Это единственная основанная на Macsyma система, все еще публично доступная и имеющая активное сообщество пользователей благодаря своей открытости. Macsyma произвела в свое время переворот в компьютерной алгебре и оказала влияние на многие другие системы, в числе которых Maple и Mathematica. Работу над Maxima вел Уильям Шелтер с 1982 года и до своей кончины в 2001 году. Выживание Maxima стало возможным только благодаря его усилиям и способностям, мы очень благодарны ему за уделенные проекту время и знания эксперта, которые поддерживали код DOE Macsyma актуальным и качественным.
После кончины Уильяма Шелтера была собрана группа пользователей, поддерживающих Maxima в актуальном состоянии. Сейчас мы находимся в промежуточном состоянии, выбираем дальнейшие направления развития и оцениваем имеющиеся возможности и ресурсы. Сама по себе Maxima имеет относительно полный набор возможностей на этом этапе, включая символьное интегрирование, построение трехмерных графиков и решение ОДУ, но осталось много работы по исправлению ошибок, чистке и документированию. Не сказать, что не будет новых возможностей, но есть еще много работы, которую нужно сделать до того, как будет достигнут следующий этап, и пока что мы не можем заниматься новыми возможностями.
Да. Maxima распространяется по GNU General Public License с некоторыми ограничениями на использование кода от Министерства энергетики США.
Есть еще несколько, однако не все они имеют открытый исходный код и не все бесплатны.
По отзывам пользователей, Jacal и Yacas не имеют такой широкий набор команд, как Maxima; Calc немногим более развит и, в частности, включает хороший интегратор.
Исходное руководство за авторством Уильяма Шелтера больше не поддерживается. Текст Майка Кларксона не является в точности заменой руководства Шелтера, а скорее отдельной работой, подготовленной ранее для DOE-Macsyma и адаптированной для Maxima с изменением DOE-Macsyma на DOE-Maxima в названии.
По адресу http://www.ma.utexas.edu/maxima.html находилась старая домашняя страница Уильяма Шелтера, и больше она не поддерживается. Однако там можно найти некоторые снимки экрана и другую полезную информацию.
Вот некоторые английские сайты с хорошей информацией о Common LISP:
Насколько нам известно, есть только два дистрибутива, включающих Maxima:
CLISP, CMUCL и GCL полностью поддерживаются Maxima; предыдущие версии Maxima полностью поддерживали только GCL. Порты для других ANSI-реализаций LISP не должны вызвать трудностей и приветствуются; свяжитесь с разработчиками, если заинтересованны в работе по портированию.
CLISP включает поддержку GNU readline
, так что при
сборке на нем Maxima будет иметь дополнительные удобства
редактирования в командной строке. Maxima не может быть собрана на
версии 2.26 из-за ошибок в CLISP. 2.28 и 2.29 работает; в 2.30 есть
проблемы с числами с плавающей точкой, так что рекомендуется 2.29.
CMUCL является самым быстрым вариантом для Maxima на тех
платформах, где он доступен. К сожалению, он не включает
поддержку readline
, но ее можно добавить, обернув
Maxima исполняемым
файлом ledit
. Maxima собирается с CMUCL 18c, но зависает на некоторых операциях времени исполнения. 18d должно работать.
Версии 2.4.4 и 2.5.0 должны подойти. 2.5.0 не издана на момент
написания текста, cvs-версии 2.5.0 были успешно использованы для
сборки Maxima. Версии с 2.4.3 могут собираться с
поддержкой readline
.
Добавьте в ~/.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 вашего пути загрузки.
Я только что отправил сообщение об ошибке на SourceForge и удивлен тому, что в столь старой программе еще существуют элементарные ошибки. Это то, что мой калькулятор может сделать сейчас, а этой программе, по-видимому, уже около 30 лет.
Ответ:
Ошибки должны вводиться напрямую в базу данных, это лучший способ их отслеживания, чем написание отчетов в список рассылки. Конечно, если вы хотите что-то обсудить, можете написать подписчикам. Интерфейс базы данных с ошибками позволяет отправлять файлы, которые могут помочь в документировании проблемы.
Базовый отчет об ошибке включает достаточно информации для ее воспроизведения, в том числе информацию о версии, полученную при помощи bug_report().
Качественный полный отчет включает:
Письма с сообщениями об ошибках часто включают тесты сессий Maxima, что очень хорошо. К сожалению, разметка часто искажается, так как символы табуляции по-разному обрабатываются в почтовых программах, браузерах HTML, и т. д. Даже для почтовых клиентов с верным отображением символов табуляции все портится, как только исходное сообщение выравнивается для цитирования (в начале строк добавляется «>»).
Так что если вы цитируете тексты сессий, пожалуйста, сделайте одно из двух:
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)
Отправьте описание проблемы на https://sourceforge.net/tracker/?group_id=4933&atid=104933
ld -v
,gcc -v
.Вам требуется более поздняя версия GCL. Известно, что 2.4.0 не подходит. Судя по всему, 2.4.x работает для некоторых x, также как и 2.5.x.
Пакет Мартина Рубей graphs.lisp позволяет Maxima генерировать различные графы и гиперграфы, рассчитывать некоторые их свойства и предоставляет интерфейс к программе PIGALE, которая пытается аккуратно отобразить графы на экране.
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
Я хочу вывести
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
m[i]
—i
-я строка матрицыm
. Есть ли какой-то способ получить столбец? Я знаю проcol(m,i)
, ноcol
возвращает матрицу и присвоить ей значение невозможно. Удобно писать «m[i]:[1,2,3]
». Почему я не могу сделать то же самое со столбцами?
Ответ:
Попробуйте транспонировать m
, а потом транспонировать
снова.
Пример:
(C1) block([],for i:1 thru 5 do return(1), 0); (D1) 0
Ответ:
1
возвращается циклом for
, затем блок
возвращает 0
.
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
Выше в примере с
desolve
, если вы указываете системе, что y зависит от x, вам не нужно ставить кавычку перед операторомdiff
. Кавычка нужна, если не напечатаноdepends(y,x)
.
Ответ:
Верно. В примере с ОДУ вы можете не указывать depends
и поставить кавычку перед diff
, или
указать depends
и ставить перед diff
кавычку
на свое усмотрение.
Кавычка подчеркивает, что вы имеете в виду дифференциал, а не выполняете дифференцирование.
Конечно, обсуждение desolve
и ode2
должно
проводиться в более широком контексте «как решать дифференциальные
уравнения». Здесь только подход desolve
к зависимостям
(использование явных функций вроде f(x)
) сравнивается с
подходом ode2
(указать, что y зависит от x или просто
поставить кавычку перед дифференциалом).
Вопрос:
У меня есть такой вызов функции в более сложном выражении:
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);
Или что-то в таком духе.
Создайте файл «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.