Перевод статьи: оригинал

Что такое 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 - транспонированная матрица с одним столбцом,
												 // то есть вектор-строка

Покажем как создавать, например, матрицу c = \begin{pmatrix}1&2\\3&4\end{pmatrix}

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 только в тех местах, где это необходимо (между переменными), несколько багов было устранено.

\underbrace{\times}_{\text{\times}} \text{ vs } \ \underbrace{ \vphantom{ \times }  \cdot}_{\text{\cdot}}

Новые функции

MathS.Series.MaclaurinMathS.Series.Taylor , MathS.Series.TaylorTerms - функции генерации разложения в ряд Тейлора.

Было добавлено много экспериментального API теории чисел. Добавлена возможность символьно выражать синусы и косинусы, опираясь на аналитически вычисленные значения для некоторых углов.

Например, можно посчитать точное значение \sin \frac{17 \pi}{42}:

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# в некоторых ситуациях.

Заключение

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

Спасибо за то, что дочитали материал до конца! С удовольствием ждем ваших вопросов.

Ссылки

  1. Github проекта

  2. Сайт проекта

  3. Заметки о релизе

  4. Nuget (C#F#Interactive)

  5. Попробовать AngouriMath в binder

  6. NativeAOT для нативной трансляции

  7. dotnet/interactive для Jupyter и нотбуков

  8. Honk# для удобного написания кода

  9. Twitter разработчика

Благодарность

Автор выражает благодарность за вклад в проект:

ContributorsHappypig375ryynmapesMomoDeveTheSeemsKuhakuPixeljaimeadfyoshiask.

ConsultantsHappypig375, mednik.

Sponsors: zyzhu.

Комментарии (0)