AngouriMath 1.0.16-Beta

The ID prefix of this package has been reserved for one of the owners of this package by NuGet.org. Prefix Reserved
This is a prerelease version of AngouriMath.
There is a newer version of this package available.
See the version list below for details.
The owner has unlisted this package. This could mean that the package is deprecated, has security vulnerabilities or shouldn't be used anymore.
dotnet add package AngouriMath --version 1.0.16-Beta
NuGet\Install-Package AngouriMath -Version 1.0.16-Beta
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="AngouriMath" Version="1.0.16-Beta" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add AngouriMath --version 1.0.16-Beta
#r "nuget: AngouriMath, 1.0.16-Beta"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install AngouriMath as a Cake Addin
#addin nuget:?package=AngouriMath&version=1.0.16-Beta&prerelease

// Install AngouriMath as a Cake Tool
#tool nuget:?package=AngouriMath&version=1.0.16-Beta&prerelease

Codacy Badge

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

Product 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • .NETStandard 2.0

    • No dependencies.

NuGet packages (2)

Showing the top 2 NuGet packages that depend on AngouriMath:

Package Downloads
AngouriMath.FSharp The ID prefix of this package has been reserved for one of the owners of this package by NuGet.org.

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,119 12/3/2021
1.4.0-preview.2 2,266 9/15/2021
1.4.0-preview.1 1,843 8/7/2021
1.3.0 100,912 7/2/2021
1.3.0-rc.4 667 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,771 5/9/2021
1.3.0-preview.3 2,209 4/21/2021
1.3.0-preview.2 1,305 3/25/2021
1.3.0-preview.1 445 3/11/2021
1.2.0 3,514 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 451 10/22/2020
1.2.0-preview.2 298 10/14/2020
1.2.0-preview.1 367 10/10/2020

New functions added (arc-*), bugs fixed, tests added, compilation speed up, linq support added, and some more