Schöne Grüße. In den letzten 7 Monaten habe ich am größten AngouriMath- Update gearbeitet . Und es gibt etwas zu erzählen.
Was passiert auf den Punkt gebracht
Im November 2019 wurde mir klar, dass dieser Welt, genauer gesagt der Welt des Dotnet, eine symbolische Algebra-Bibliothek fehlt, um Ausdrücke zu vereinfachen, Gleichungen zu lösen, Latex abzuleiten und so weiter. Also habe ich beschlossen, eine zu erstellen.
Aber da ist ...
Wenn verschiedene Leute hören, was ich tue, kommen sie auf unterschiedliche Lösungen. Schreiben Sie SymPy neu, erstellen Sie einen Wrapper über SageMath für Dotnet, Spiral Wolfram | Alpha, verwenden Sie primitive mathnet.symbolics (sie selbst sprechen von Primitivität).
Aber all dies hat entweder Einschränkungen oder Schwierigkeiten. Das gleiche, an dem ich arbeite, ist eine sehr leichte Bibliothek, die für .NET geschrieben und optimiert wurde. Natürlich Open Source. (unter MIT)
Update 1.2
Im August half einer der Hauptverantwortlichen bei HappyPig375 dabei, einen wesentlichen Teil der Bibliothek in die normale Typhierarchie umzuschreiben. Jetzt gibt es für jeden Operator oder jede Funktion einen eigenen Typ. Es war ein Wendepunkt, vor dem die Bibliothek langsam, ungeschickt und völlig offensichtlich war. Lassen Sie uns nun untersuchen, was seitdem getan wurde.
Ein Ausdruck ist ein Datensatz
So sieht beispielsweise die Deklaration des Summenoperators aus
public sealed partial record Sumf(Entity Augend, Entity Addend) : NumericNode
Dank dessen können wir den neuen Mustervergleich problemlos anwenden:
internal static Entity CommonRules(Entity x) => x switch
{
// (a * f(x)) * g(x) = a * (f(x) * g(x))
Mulf(Mulf(Number const1, Function func1), Function func2) => func1 * func2 * const1,
// (a/b) * (c/d) = (a*c)/(b*d)
Mulf(Divf(var any1, var any2), Divf(var any3, var any4)) => any1 * any3 / (any2 * any4),
// a / (b / c) = a * c / b
Divf(var any1, Divf(var any2, var any3)) => any1 * any3 / any2,
(Dies ist ein Beispiel für Muster, die beim Vereinfachen eines Ausdrucks funktionieren.)
Mathe
, .
, , , .
12 , (sinh(x)
(e.Pow(x) - e.Pow(-x)) / 2
).
Abs Signum. abs : (|x|)
. , , ( | , ).
Phi ( ).
WriteLine(@"phi(8)".EvalNumerical());
WriteLine(@"(|-3 + 4i|)".EvalNumerical());
WriteLine(@"sinh(3)".Simplify());
WriteLine(@"sec(0.5)".Simplify());
4
5
(e ^ 3 - 1 / e ^ 3) / 2
sec(1/2)
. , NaN, . - SpecialSet, .
- . - , - , . : not
, or
, xor
, and
, implies
.
, Boolean
, EvaluableBoolean
. , EvaluableNumerical
, Number
.
WriteLine(@"(true or b) implies c".Simplify());
( c
)
Boolean
, . : =
, <
, >
, <=
, >=
.
. , a > b > c
, (a > b > c
, a > b and b > c
).
WriteLine(@"a < b >= c".Simplify());
( a < b and b >= c
)
. .
- FiniteSet, , . . : { 1, 2, 3 }
.
/ : [1; 2]
, (1; 2)
, [1; 2)
, (1; 2]
. .
SpecialSet
"" . CC
, RR
, QQ
, ZZ
, BB
, , , , .
ConditionalSet
set-builder notation, : { x : x > 0 and x^2 = y }
( x
, y
).
WriteLine(@"({ 1, 2 } \/ { 5 }) /\ { x : x in [2; 3] and x > 0 } ".Simplify());
( { 2 }
)
, . .
WriteLine("tan(a x) / (b x)".Limit("x", 0));
WriteLine("(sin(t) - t) / t3".Limit("t", 0));
( a / b
-1/6
)
"Provided"
, . , sqrt(x) provided x >= 0
. x, NaN.
, NaN, . , NaN NaN.
-
Piecewise
- Provided
. -, , Piecewise
, Provided
, .
, Piecewise
:
Entity abs = "piecewise(x provided x > 0, -x provided x <= 0)";
WriteLine(abs.Substitute("x", 3).EvalNumerical());
WriteLine(abs.Substitute("x", -3).EvalNumerical());
( 3 )
, / .
, , AngouriMathBaseException
. p/invoke
- - , , , AngouriMathBaseException
, . , , catch- ( ).
F#
API AngouriMath F#. , , F# . - , .
Interactive
, AngouriMath Jupyter. AngouriMath.Interactive ILatexiseable
LaTeX- MathJax ( ).
. , ? , . ([ThreadStatic]
), .
- , Solve
Simplify
, .
, . , , . ,
using var _ = MaxExpansionTermCount.Set(10);
// -
(, Set
, IDisposable
).
. , . , . , .
- , ( ).
Links
Github des Projekts.
Projekt - Website .
Detailliertere Was ist neu .
Pläne für die nächsten Updates.
Mein Profil ist auf GitHub.
SymPy - inspirieren und Ideen geben.