AngouriMath 1.0.16.2-Beta
Prefix ReservedSee the version list below for details.
dotnet add package AngouriMath --version 1.0.16.2-Beta
NuGet\Install-Package AngouriMath -Version 1.0.16.2-Beta
<PackageReference Include="AngouriMath" Version="1.0.16.2-Beta" />
paket add AngouriMath --version 1.0.16.2-Beta
#r "nuget: AngouriMath, 1.0.16.2-Beta"
// Install AngouriMath as a Cake Addin
#addin nuget:?package=AngouriMath&version=1.0.16.2-Beta&prerelease
// Install AngouriMath as a Cake Tool
#tool nuget:?package=AngouriMath&version=1.0.16.2-Beta&prerelease
Nuget: https://www.nuget.org/packages/AngouriMath
AngouriMath
AngouriMath is an open-source library that enables to work with non-linear multi-variable expressions. Its functionality includes derivation, variable substitution, equation solving, definite integration, formula-to-latex formatting, and some more.
Examples
Use as a simple calculator
var inp = "1 + 2 * log(9, 3)";
var expr = MathS.FromString(inp);
Console.WriteLine(expr.Eval());
>>> 5
Build an expression
var x = MathS.Var("x");
var y = MathS.Var("y");
var c = x * y + x / y;
Console.WriteLine(MathS.Sqr(c));
>>> (x * y + x / y) ^ 2
Substitute variables
var x = MathS.Var("x");
var expr = x * 2 + MathS.Sin(x) / MathS.Sin(MathS.Pow(2, x));
var subs = expr.Substitute(x, 0.3);
Console.WriteLine(subs.Simplify());
>>> 0,9134260185941638
Find derivatives
var x = MathS.Var("x");
var func = MathS.Sqr(x) + MathS.Ln(MathS.Cos(x) + 3) + 4 * x;
var derivative = func.Derive(x);
Console.WriteLine(derivative.Simplify());
>>> 2 * x + -1 * sin(x) / (cos(x) + 3) + 4
Build formulas
var x = MathS.Var("x");
var expr = (x + 3).Pow(x + 4);
Func<NumberEntity, Entity> wow = v => expr.Substitute(x, v).Simplify();
Console.WriteLine(wow(4));
Console.WriteLine(wow(5));
Console.WriteLine(wow(6));
>>> 5764801
>>> 134217728
>>> 3486784401
Render latex
var x = MathS.Var("x");
var y = MathS.Var("y");
var expr = x.Pow(y) + MathS.Sqrt(x + y / 4) * (6 / x);
Console.WriteLine(expr.Latexise());
>>> {x}^{y}+\sqrt{x+\frac{y}{4}}*\frac{6}{x}
Play with complex numbers
var expr = MathS.Pow(MathS.e, MathS.pi * MathS.i);
Console.WriteLine(expr);
Console.WriteLine(expr.Eval());
>>> 2,718281828459045 ^ 3,141592653589793i
>>> -1
Solve eqations
Only numerical solutions with Newton's method is supported yet 😦
var x = MathS.Var("x");
var equation = (x - 1) * (x - 2) * (MathS.Sqr(x) + 1);
foreach (var re in equation.SolveNt(x))
Console.Write(re.ToString() + " ");
>>> 1 2 1i
Integrate
Only definite integral over single variable is supported yet 😦
var x = MathS.Var("x");
var expr = MathS.Sin(x) + MathS.Sqrt(x) / (MathS.Sqrt(x) + MathS.Cos(x)) + MathS.Pow(x, 3);
Console.WriteLine(expr.DefiniteIntegral(x, -3, 3));
var expr2 = MathS.Sin(x);
Console.WriteLine(expr2.DefiniteIntegral(x, 0, MathS.pi));
>>> 5.56669223384056 + 0.0889406793629381i
>>> 1.98003515236381
Compile functions
Compiled functions work 15x faster
var x = MathS.Var("x");
var expr = MathS.Sin(x) + MathS.Sqrt(x) / (MathS.Sqrt(x) + MathS.Cos(x)) + MathS.Pow(x, 3);
var func = expr.Compile(x);
Console.WriteLine(func.Substitute(3));
Full documentation
Entity methods
Derivation
expr.Derive(x) - derivation for variable x.
var x = MathS.Var("x");
var expr = MathS.Sqr(x);
Console.WriteLine(expr.Derive(x)); // 2 * x
How it works? We have some rules for derivation which are applied to each node, for example (a + b)' = a' + b'. So, we replace each node according to the appropriate rule.
Evaluation & Simplification
expr.Simplify(level)
simplifies an expression. Level is number of iterations (relevant for long expressions).
expr.Eval() = expr.Simplify(1)
- recommended to use to evaluation substituted expression.
expr.Simplify() = expr.Simplify(2)
- use to simplify expressions, a * x + x = (a + 1) * x
var x = MathS.Var("x");
var expr = 3 * x + x;
Console.WriteLine(expr.Simplify()); // 4 * x
How it works? Thanks to the pattern system, now we are able to find subtrees that we know how to simplify. The full list of used patterns presents in file Patterns.cs.
Expansion & Collapse
expr.Expand(level=2)
- expands the expression trying to remove all the braces (for example, a * (1 + x) = a * x + a * 1). level - number of iterations.
expr.Collapse(level=2)
- collapses the expression trying to remove all the powers (for example, x^2 - y^2 = (x - y) * (x + y) ).
To string
expr.ToString()
- string presentation of an expression.
expr.Latexise()
- neat output in LaTeX format.
How it works? For each node we encounter, we use the appropriate latex syntax.
Solving equations
By this time, only Newton's method over one variable is available.
expr.SolveNt(from, to, stepCount, precision) - find roots assuming we are solving equation expr=0.
The algorithm iterates on [from.Re; to.Re] for real part and on [from.Im; to.Im] for imaginary part.
The higher stepCount is, the more roots the function can find
Precision - if you get similar roots that you think are equal, you can increase this argument.
You can also decrease MathS.EQUALITY_THRESHOLD which is responsible for comparing Numbers.
Integration
By this time, only definite integration over one variable is available.
expr.DefiniteIntegral(x, from, to)
- numerically counts integral from from
to to
. Note that you can specify the two parameters in Complex numbers.
Compilation
expr.Compile(a, b, c...)
the arguments are arguments of the target function. You should list all the used variables in the order you will then call.
fe.Call(a, b, c...)
the arguments are Numbers in the order of variables. Retunrs Number.
var x = MathS.Var("x");
var expr = MathS.Sqr(x) + 2 * x;
var func = expr.Compile(x);
Console.WriteLine(func.Call(3));
Performane improved a lot. Testing on i7-7700HQ and expr=MathS.Sin(x) we get the following report:
Function | Time per iteration |
---|---|
Substitute(x, 3).Eval() from 1.0.13 | 12000 ns |
Substitute(x, 3).Eval() from 1.0.15 | 2500 ns |
Call(3) from 1.0.15 | 54 ns |
Complex.Sin(3) | 27 ns |
If we take expr=(MathS.Log(x, 3) + MathS.Sqr(x)) * MathS.Sin(x + MathS.Cosec(x)), we get the following performance
Method | Time per iteration |
---|---|
AM Compiled | 350.767 ns |
In-code expression | 211.472 ns |
So, for most cases using compilation will save you enough time even though Complex.Sin is still faster.
Function list
MathS. Log(num, base), Pow(base, power), Sqrt(x), Sqr(x), Sin(x), Cos(x), Tan(x), Cotan(x), Sec(x), Cosec(x), Arcsin(x), Arccos(x), Arctan(x), Arccotan(x), B(x), TB(x)
MathS.FromString(str) - returns Entity
MathS.FromLinq(expr) - returns Entity
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- No dependencies.
NuGet packages (2)
Showing the top 2 NuGet packages that depend on AngouriMath:
Package | Downloads |
---|---|
AngouriMath.FSharp
F# wrapper for some functions from AngouriMath. https://am.angouri.org/quickstart/index.html |
|
CSharpMath.Evaluation
Can convert CSharpMath.Atom.MathList parsed from LaTeX with CSharpMath.Atom.LaTeXParser into actual mathematical expressions that are evaluatable with AngouriMath. Supports arithmetic, trigonometry, symbolic simplification and expansion, as well as matrices, sets, and equation solving. |
GitHub repositories (2)
Showing the top 2 popular GitHub repositories that depend on AngouriMath:
Repository | Stars |
---|---|
asc-community/AngouriMath
New open-source cross-platform symbolic algebra library for C# and F#. Can be used for both production and research purposes.
|
|
verybadcat/CSharpMath
LaTeX. in C#. (ported from the wonderful iosMath project).
|
Version | Downloads | Last updated | |
---|---|---|---|
1.4.0-preview.3 | 7,565 | 12/3/2021 | |
1.4.0-preview.2 | 2,267 | 9/15/2021 | |
1.4.0-preview.1 | 1,845 | 8/7/2021 | |
1.3.0 | 108,180 | 7/2/2021 | |
1.3.0-rc.4 | 683 | 7/1/2021 | |
1.3.0-rc.3 | 178 | 7/1/2021 | |
1.3.0-rc.2 | 169 | 7/1/2021 | |
1.3.0-rc.1 | 226 | 6/30/2021 | |
1.3.0-preview.4 | 4,784 | 5/9/2021 | |
1.3.0-preview.3 | 2,219 | 4/21/2021 | |
1.3.0-preview.2 | 1,310 | 3/25/2021 | |
1.3.0-preview.1 | 449 | 3/11/2021 | |
1.2.0 | 3,587 | 3/2/2021 | |
1.2.0-preview.6 | 1,923 | 1/27/2021 | |
1.2.0-preview.5 | 798 | 11/20/2020 | |
1.2.0-preview.4 | 258 | 11/16/2020 | |
1.2.0-preview.3 | 459 | 10/22/2020 | |
1.2.0-preview.2 | 303 | 10/14/2020 | |
1.2.0-preview.1 | 374 | 10/10/2020 |
Tree sort added <=> simplification improved