Axiom
Axiom — свободная система компьютерной алгебры общего назначения. Она состоит из среды интерпретатора, компилятора и библиотеки, описывающей строго типизированную, математически правильную иерархию типов.
Axiom | |
---|---|
Тип | система компьютерной алгебры |
Разработчик | независимая группа людей |
Написана на | Лисп |
Операционная система | кроссплатформенное программное обеспечение |
Последняя версия | |
Лицензия | модифицированная лицензия BSD |
Сайт | axiom-developer.org |
Медиафайлы на Викискладе |
История
Разработка системы начата в 1971 году группой исследователей IBM под руководством Ричарда Дженкса [2][3]. Изначально система называлась Scratchpad. Проект развивался медленно и в основном рассматривался как исследовательская платформа для разработки новых идей в вычислительной математике.
В 1990-х годах система была продана компании Numerical Algorithms Group (NAG), получила название Axiom и стала коммерческим продуктом. Но по ряду причин система не получила коммерческого успеха и была отозвана с рынка в октябре 2001 года.
NAG решила сделать Axiom свободным программным обеспечением и открыла исходные коды под модифицированной лицензией BSD.
В 2007 году у Axiom появились два форка с открытым исходным кодом: OpenAxiom и FriCAS.
Разработка системы продолжается, новые версии выходят каждые два месяца[4].
Философия проекта
Технология литературного программирования Кнута используется по всему исходному коду. Проект Axiom планирует использовать проверенные технологии (такие как Coq и ACL2) для доказательства корректности алгоритмов.
Особенности
В Axiom все объекты имеют тип. Примерами типов являются математические структуры (такие как кольца, поля, многочлены), а также структуры данных из вычислительной техники (например, списки, деревья, хеш-таблицы).
Функция может получить тип в качестве аргумента, и её возвращаемое значение также может быть типом. Например, Fraction
— функция, получающая IntegralDomain
в качестве аргумента, и возвращающая поле отношений своего аргумента. В качестве другого примера кольцо матриц действительных чисел может быть построено как SquareMatrix(4, Fraction Integer)
. Конечно, если работать в этом домене, 1
интерпретируется как единичная матрица и A^-1
позволяет получить обратную матрицу A
, если она существует.
Некоторые операции могут иметь одинаковые имена, и тогда типы аргументов и результата используются для определения того, какая операция применяется, подобно тому, как в ООП.
Язык расширений Axiom называется SPAD. Вся математическая база Axiom написана на этом языке. Интерпретатор принимает почти такой же язык.
SPAD в дальнейшем разрабатывался под именем A# и позже Aldor. Последний, кроме того, может быть использован как альтернативный язык расширений. Однако, следует учесть, что он распространяется под другой лицензией.
Примеры
3j-символы
Вычисление 3j-символов и коэффициентов Клебша-Гордана.
j3Sum (j1, j2, j3, m1, m2, m3) ==
maxz := reduce (min, [j1+j2-j3, j1-m1, j2+m2])
minz := max(0, max ( -(j3-j2+m1), -(j3-j1-m2) ))
minz > maxz => 0
maxz < 0 => 0
sum ( (-1)^(z+j1-j2-m3) / _
( factorial(z) * factorial(j1+j2-j3-z) * factorial(j1-m1-z) * _
factorial(j2+m2-z) * factorial(j3-j2+m1+z) * factorial(j3-j1-m2+z) ), _
z=minz..maxz)
j3 (j1, j2, j3, m1, m2, m3) ==
m1 + m2 + m3 ~= 0 => 0
abs(j1 - j2) > j3 => 0
j1 + j2 < j3 => 0
abs(m1) > j1 => 0
abs(m2) > j2 => 0
abs(m3) > j3 => 0
not integer? (j1+j2+j3) => 0
sqrt ( _
factorial(j1+j2-j3) * factorial(j1-j2+j3) * factorial(-j1+j2+j3) / _
factorial(j1+j2+j3+1) * _
factorial(j1+m1) * factorial(j1-m1) * _
factorial(j2+m2) * factorial(j2-m2) * _
factorial(j3+m3) * factorial(j3-m3)
) * j3Sum (j1, j2, j3, m1, m2, m3)
clebschGordan (j1, j2, j, m1, m2, m) ==
(-1)^(j1-j2+m) * sqrt(2*j+1) * j3(j1, j2, j, m1, m2, -m)
Общая теория относительности
«Аксиома» выводит символы Кристоффеля и тензоры Римана и Риччи в решении Шварцшильда.
x := vector ['t, 'r, '%theta, '%phi];
dim := #x;
%nu := operator '%nu;
%lambda := operator '%lambda;
lg := matrix [
[exp(%nu r), 0, 0, 0], _
[ 0, - exp(%lambda r), 0, 0], _
[ 0, 0, -r^2, 0], _
[ 0, 0, 0, -r^2*sin(%theta)^2] _
];
ug := inverse lg;
grSetup(metric, names) ==
free x
free dim
free lg
free ug
x := names
dim := #x
lg := metric
ug := inverse lg
sum(list) == reduce (+, list)
Christoffel (k,l,i) ==
(1/2) * sum [ ug(i,m)*(D(lg(k,m), x(l)) + D(lg(m,l), x(k)) - D(lg(k,l), x(m)))
for m in 1..dim ]
Riemann (k,l,m,i) ==
D(Christoffel(k,m,i), x(l)) -
D(Christoffel(k,l,i), x(m)) +
sum [
Christoffel(n,l,i)*Christoffel(k,m,n) -
Christoffel(n,m,i)*Christoffel(k,l,n)
for n in 1..dim ]
Ricci (i,k) == sum [ Riemann(i,l,k,l) for l in 1..dim ]
scalarCurvature () == sum [ sum [
ug(i,k) * Ricci(i,k)
for i in 1..dim ] for k in 1..dim ]
lRiemann (i,i,l,m) == 0
lRiemann (i,k,l,l) == 0
lRiemann (i,k,l,m | i > k) == - lRiemann (k,i,l,m)
lRiemann (i,k,l,m | l > m) == - lRiemann (i,k,m,l)
lRiemann (i,k,l,m) == sum [ lg(i,n) * Riemann(k,l,m,n) for n in 1..dim ]
showChristoffel () ==
for k in 1..dim repeat
for l in 1..k repeat
for i in 1..dim repeat
if Christoffel(k,l,i) ~= 0 then
k > l => output infix ('=, [script('%Gamma,[[k-1,l-1],[i-1]]), _
script('%Gamma,[[l-1,k-1],[i-1]]), _
Christoffel(k,l,i)::OUTFORM])
k = l => output infix ('=, _
[script('%Gamma,[[k-1,l-1],[i-1]]), _
Christoffel(k,l,i)::OUTFORM])
showRicci () ==
for i in 1..dim repeat
for k in 1..i repeat
if Ricci(i,k) ~= 0 then
i = k => output infix ('=, [subscript('R,[i-1,k-1]), Ricci(i,k)::OUTFORM])
i > k => output infix ('=, [subscript('R,[i-1,k-1]), _
subscript('R,[k-1,i-1]), _
Ricci(i,k)::OUTFORM])
showRiemann () ==
for k in 1..dim repeat
for l in 1..dim repeat
for m in 1..dim repeat
for i in 1..dim repeat
if Riemann(k,l,m,i) ~= 0 then
output infix ('=, _
[script('R, [[k-1,l-1,m-1 ], [i-1]]), Riemann(k,l,m,i)::OUTFORM])
(21) -> showChristoffel()
Compiling function sum with type List Expression Integer ->
Expression Integer
Compiling function Christoffel with type (PositiveInteger,
PositiveInteger,PositiveInteger) -> Expression Integer
Compiling function showChristoffel with type () -> Void
%nu(r) ,
%e %nu (r)
1
%Gamma = ---------------
0,0 %lambda(r)
2%e
,
%nu (r)
0 0
%Gamma = %Gamma = -------
1,0 0,1 2
,
%lambda (r)
1
%Gamma = -----------
1,1 2
2 2 1
%Gamma = %Gamma = -
2,1 1,2 r
1 r
%Gamma = - ------------
2,2 %lambda(r)
%e
3 3 1
%Gamma = %Gamma = -
3,1 1,3 r
3 3 cos(%theta)
%Gamma = %Gamma = -----------
3,2 2,3 sin(%theta)
2
1 r sin(%theta)
%Gamma = - --------------
3,3 %lambda(r)
%e
2
%Gamma = - cos(%theta)sin(%theta)
3,3
Type: Void
(22) -> Ricci(3,3)
Compiling function Riemann with type (PositiveInteger,
PositiveInteger,PositiveInteger,PositiveInteger) -> Expression
Integer
Compiling function Ricci with type (PositiveInteger,PositiveInteger)
-> Expression Integer
, , %lambda(r)
- r%nu (r) + r%lambda (r) + 2%e - 2
(22) ---------------------------------------------
%lambda(r)
2%e
Type: Expression Integer
Галерея
- Интерфейс Axiom в браузере Mozilla Firefox
- Axiom упрощает уравнение теплоты
- Работа с матрицами в Axiom
Документация
Axiom — литературная программа. Исходный код доступен в наборе томов на сайте: axiom-developer.org. Эти тома содержат актуальный исходный код системы.
На данный момент доступны следующие документы:
- Общее оглавление
- Volume 0: Axiom Jenks and Sutor — Основной учебник
- Volume 1: Axiom Tutorial — Простое введение
- Volume 2: Axiom Users Guide — Подробные примеры использования доменов (незавершённый)
- Volume 3: Axiom Programers Guide — Руководство в примерах для написания программ (незавершённый)
- Volume 4: Axiom Developers Guide — Короткие наброски на темы, специфичные для разработчиков (незавершённый)
- Volume 5: Axiom Intepreter — Исходый код интерпретатора Axiom (незавершённый)
- Volume 6: Axiom Command — Исходый код системных команд и скриптов (незавершённый)
- Volume 7: Axiom Hyperdoc — Исходный код и разъяснения браузера справки X11 Hyperdoc
- Volume 7.1 Axiom Hyperdoc Pages — Исходный код страниц Hyperdoc
- Volume 8: Axiom Graphics — Исходый код подсистемы X11 Graphics
- Volume 9: Axiom Compiler — Исходый код компилятора Spad (незавершённый)
- Volume 10: Axiom Algebra Implementation — Наброски особенностей реализации (незавершённый)
- Volume 10.1: Axiom Algebra Theory — Наброски, содержащие базовую теорию
- Volume 10.2: Axiom Algebra Categories — Исходный код категорий Axiom
- Volume 10.3: Axiom Algebra Domains — Исходый код доменов Axiom (незавершённый)
- Volume 10.4: Axiom Algebra Packages — Исходый код Axiom packages (незавершённый)
- Volume 11: Axiom Browser — Исходные страницы внешнего интерфейса Axiom для браузера Firefox
- Volume 12: Axiom Crystal — Исходный код внешнего интерфейса Axiom Crystal (незавершённый)
Видео
Важной целью проекта Axiom является предоставление документации. В ноябре 2008 года проект анонсировал первое из серии обучающих видео, которые также доступны на сайте: axiom-developer.org. Первое видео рассказывает о источниках информации о Axiom.[5]
Примечания
- http://www.axiom-developer.org/axiom-website/releasenotes.html
- Richard Dimick Jenks
- Домашняя страница Axiom Архивная копия от 18 августа 2004 на Wayback Machine.
- Патчи.
- «Axiom Computer Algebra System Information Sources», jgg899, YouTube, 30 ноября 2008.
Ссылки
- Домашняя страница Axiom
- Сайт OpenAxiom.
- Сайт FriCAS.
- Система компьютерной алгебры «Аксиома»
- Таранчук В. Б. Основные функции систем компьютерной алгебры . — Минск: БГУ, 2013. — 59 p.