Перевод статьи: оригинал
Что такое AngouriMath
AngouriMath - это свободная open-source библиотека символьной алгебры, написанная на платформы .NET и работающая в ней. Работа над библиотекой ведется с конца 2019 года. Предыдущий крупный релиз был выпущен 2 марта, про него тоже есть статья.
Теперь давайте посмотрим на результат работы команды проекта за 4 месяца!
AngouriMath предлагает инструментарий для C#, F#, интерактивных сред (например, Jupyter) и вдобавок для C++. Приведем таблицу пакетов библиотеки и сред, за которые они отвечают:
C# |
F# |
Interactive |
C++ |
|
AngouriMath |
✓ |
✓ |
✓ |
|
AngouriMath.FSharp |
✓ |
✓ |
||
AngouriMath.Interactive |
✓ |
|||
AngouriMath.CPP |
✓ |
Матрицы
Инструментарий работы с матрицами - одно из главных нововведений в текущем обновлении в терминах критического изменения API и поведения. Теперь вместо тензоров (которых теперь нет) используются матрицы: Entity.Matrix
. Появились векторы, но у них нет собственного отдельного типа, вектор задается как матрица с одним столбцом из координат.
Синтаксически это выглядит следующим образом:
Entity a = "[1, 2, 3]"; // a - вектор из трёх элементов
Entity b = "[1, 2, 3]T"; // b - транспонированная матрица с одним столбцом,
// то есть вектор-строка
Покажем как создавать, например, матрицу
Entity с = "[[1, 2], [3, 4]]"; // c - матрица со строками [1, 2] и [3, 4]
Также приведем свойства и функции матриц:
Entity.Matrix m = ...
m.Adjugate // null если не существует (когда исходная матрица - не квадратная)
m.AsScalar() // приводит матрицу 1x1 к скаляру
m.Inverse // null если не существует
m.Pow(int) // возводит матрицу в степень
m.ReducedRowEchelonForm // канонический вид матрицы
За подробностями можно обратиться к документации.
Также были улучшения связанные с матрицами пакета AngouriMath.FSharp
. Все матричные функции переехали в AngouriMath.FSharp.Matrices
. Теперь появились специальные операторы для матриц, которые заканчиваются на точку:
a +. b
a -. b
a *. b
a /. b
a **. b // матричное возведение в степень
a ***. b // тензорное произведение
a ****. b // тензорное возведение в степень
Парсер и LaTeX
Парсер теперь поддерживает кириллицу и греческий алфавит, игнорирует служебные символы: \n, \r
которые могут быть полезны, например, при автоматической генерации матриц.
Добавлена новая настройка MathS.Settings.ExplicitParsingOnly
, которая разрешает или запрещает опускание операций, например:
Entity a = "2x + 3(x + 1)"; // Будет распознано парсером как валидное выражение
// если MathS.Settings.ExplicitParsingOnly == false
// иначе же, выражение не валидно.
Также есть метод MathS.Parse
возвращающий Either
от Entity
и причины неудачи.
Either
- тип из Honk# (про него еще будет отдельно сказано), который предусматривает два варианта результата, в нашем случае это либо представление выражения (выход обработки), либо причина ошибки (в некотором смысле это аналог std::variant
из C++).
Пример использования:
using AngouriMath;
using System;
var res = MathS.Parse("2x + 3")
.Switch(
valid => valid,
failure => failure.Reason.Switch<Entity>(
unknown => $"Unknown reason: {unknown.Reason}",
missingOperator => $"Operator missed: {missingOperator.Details}",
internalError => $"Internal error: {internalError.Details}"
)
);
Console.WriteLine(res);
Latexise
(LaTeX представление внутренней сущности Entity
) больше не ставит ненужные знаки умножения (\times
), вместо этого теперь ставятся \cdot
только в тех местах, где это необходимо (между переменными), несколько багов было устранено.
Новые функции
MathS.Series.Maclaurin
, MathS.Series.Taylor
, MathS.Series.TaylorTerms
- функции генерации разложения в ряд Тейлора.
Было добавлено много экспериментального API теории чисел. Добавлена возможность символьно выражать синусы и косинусы, опираясь на аналитически вычисленные значения для некоторых углов.
Например, можно посчитать точное значение :
1/2 * ((sqrt(1 - sqrt(1/2 - 1/2 * sqrt(1 - sqrt(1 - (1/6 * (-1 + ((7 + 21 * sqrt(-3)) / 2) ^ (1/3) + ((7 - 21 * sqrt(-3)) / 2) ^ (1/3))) ^ 2) ^ 2)) ^ 2) ^ 2 - sqrt(1/2 - 1/2 * sqrt(1 - sqrt(1 - (1/6 * (-1 + ((7 + 21 * sqrt(-3)) / 2) ^ (1/3) + ((7 - 21 * sqrt(-3)) / 2) ^ (1/3))) ^ 2) ^ 2)) ^ 2) * sqrt(1 - sqrt(1/2 - 1/2 * sqrt(1 - sqrt(1 - (1/6 * (-1 + ((7 + 21 * sqrt(-3)) / 2) ^ (1/3) + ((7 - 21 * sqrt(-3)) / 2) ^ (1/3))) ^ 2) ^ 2)) ^ 2) - 2 * sqrt(1/2 - 1/2 * sqrt(1 - sqrt(1 - (1/6 * (-1 + ((7 + 21 * sqrt(-3)) / 2) ^ (1/3) + ((7 - 21 * sqrt(-3)) / 2) ^ (1/3))) ^ 2) ^ 2)) * sqrt(1 - sqrt(1/2 - 1/2 * sqrt(1 - sqrt(1 - (1/6 * (-1 + ((7 + 21 * sqrt(-3)) / 2) ^ (1/3) + ((7 - 21 * sqrt(-3)) / 2) ^ (1/3))) ^ 2) ^ 2)) ^ 2) * sqrt(1/2 - 1/2 * sqrt(1 - sqrt(1 - (1/6 * (-1 + ((7 + 21 * sqrt(-3)) / 2) ^ (1/3) + ((7 - 21 * sqrt(-3)) / 2) ^ (1/3))) ^ 2) ^ 2))) - -(2 * sqrt(1/2 - 1/2 * sqrt(1 - sqrt(1 - (1/6 * (-1 + ((7 + 21 * sqrt(-3)) / 2) ^ (1/3) + ((7 - 21 * sqrt(-3)) / 2) ^ (1/3))) ^ 2) ^ 2)) * sqrt(1 - sqrt(1/2 - 1/2 * sqrt(1 - sqrt(1 - (1/6 * (-1 + ((7 + 21 * sqrt(-3)) / 2) ^ (1/3) + ((7 - 21 * sqrt(-3)) / 2) ^ (1/3))) ^ 2) ^ 2)) ^ 2) * sqrt(1 - sqrt(1/2 - 1/2 * sqrt(1 - sqrt(1 - (1/6 * (-1 + ((7 + 21 * sqrt(-3)) / 2) ^ (1/3) + ((7 - 21 * sqrt(-3)) / 2) ^ (1/3))) ^ 2) ^ 2)) ^ 2) + (sqrt(1 - sqrt(1/2 - 1/2 * sqrt(1 - sqrt(1 - (1/6 * (-1 + ((7 + 21 * sqrt(-3)) / 2) ^ (1/3) + ((7 - 21 * sqrt(-3)) / 2) ^ (1/3))) ^ 2) ^ 2)) ^ 2) ^ 2 - sqrt(1/2 - 1/2 * sqrt(1 - sqrt(1 - (1/6 * (-1 + ((7 + 21 * sqrt(-3)) / 2) ^ (1/3) + ((7 - 21 * sqrt(-3)) / 2) ^ (1/3))) ^ 2) ^ 2)) ^ 2) * sqrt(1/2 - 1/2 * sqrt(1 - sqrt(1 - (1/6 * (-1 + ((7 + 21 * sqrt(-3)) / 2) ^ (1/3) + ((7 - 21 * sqrt(-3)) / 2) ^ (1/3))) ^ 2) ^ 2))) * sqrt(3) / 2
Все добавленные функции:
SymbolicFormOfSine
SymbolicFormOfCosine
ExpandSineOfSum
ExpandConsineOfSum
ExpandSineArgumentMultiplied
ExpandCosineArgumentMultiplied
GetSineOfHalvedAngle
GetCosineOfHalvedAngle
DecomposeRational
GetSineOfHalvedAngle
Добавлено несколько алиасов гиперболическим функциям.
Теперь к результатам всех функций из пакетаAngouriMath.FSharp
будет по умолчанию применен InnerSimplified
(например, sqrt 4
вернет результат 2
в то время как MathS.Sqrt(4)
всё еще возвращает внутреннее представление возведения 4
в степень 1/2
)
У пакета AngouriMath.Interactive
появился новый модуль: AggressiveOperators
, который обеспечивает перегрузку стандартных операторов: +, -, *, /, **, <, >, >=, <=, =
. Не рекомендуется использовать этот пакет именно как библиотеку, но он предоставляет удобство в небольших вычислениях, например, вычисления в терминале.
AngouriMath.CPP: обёртка для C++
Теперь у библиотеки появилась нативная версия, которую можно использовать извне. Это стало возможно благодаря NativeAOT, новой фиче позволяющей транслировать сборки .NET в нативный код.
Рассмотрим пример использования:
#include <AngouriMath.h>
AngouriMath::Entity expr("x * y + 2sin(x * y) - y^x");
std::cout << expr.Differentiate("x") << "\n";
На выходе получаем: y + cos(x * y) * y * 2 - y ^ x * ln(y)
AngouriMath.CPP - экспериментальный пакет, но его можно испытать в действии, ознакомившись с краткой инструкцией. На данный момент доступно небольшое количество функций, в связи с чем он едва ли годен к использованию, но в будущем планируются значительные доработки и расширения.
Вы также можете прочитать пост автора библиотеки на Reddit об этом пакете.
Использование AngouriMath в проектах
На текущий момент, помимо netstandard2.0, AngouriMath поддерживает .NET Framework 4.7.2+ и netstandard2.1, что делает удобным использование библиотеки в legacy проектах.
Honk# теперь упрощает поддержание проекта, но, поскольку он поставляется вместе с AngouriMath, также может быть полезно попробовать синтаксис Honk# в некоторых ситуациях.
Заключение
В новом релизе присутствует большое количество небольших фич и фиксов, которые могут быть не такими интересными. Многие из них и другие обновления можно посмотреть в специальном разделе на сайте проекта.
Спасибо за то, что дочитали материал до конца! С удовольствием ждем ваших вопросов.
Ссылки
Github проекта
Сайт проекта
Nuget (C#, F#, Interactive)
Попробовать AngouriMath в binder
NativeAOT для нативной трансляции
dotnet/interactive для Jupyter и нотбуков
Honk# для удобного написания кода
Twitter разработчика
Благодарность
Автор выражает благодарность за вклад в проект:
Contributors: Happypig375, ryynmapes, MomoDeve, TheSeems, KuhakuPixel, jaimeadf, yoshiask.
Consultants: Happypig375, mednik.
Sponsors: zyzhu.