Les salutations. Depuis 7 mois, je travaille sur la plus grosse mise à jour d' AngouriMath . Et il y a quelque chose à dire.
Ce qui se passe en un mot
En novembre 2019, je me suis rendu compte que ce monde, plus précisément le monde du dotnet, manquait d'une bibliothèque d'algèbre symbolique pour simplifier les expressions, résoudre des équations, dériver du latex, etc. J'ai donc décidé d'en créer un.
Mais il y a ...
En entendant ce que je fais, différentes personnes proposent des solutions différentes. Réécrivez SymPy, créez un wrapper sur SageMath pour Dotnet, spirale Wolfram | Alpha, utilisez des symboles primitifs mathnet.symbolics (ils parlent eux-mêmes de primitivité).
Mais tout cela a des limites ou des difficultés. La même chose sur laquelle je travaille est une bibliothèque très légère écrite et optimisée pour .NET. Open source, bien sûr. (sous MIT)
Mise à jour 1.2
En août, l'un des principaux contributeurs @ HappyPig375 a aidé à réécrire une partie importante de la bibliothèque dans la hiérarchie de types normale. Il existe désormais un type distinct pour chaque opérateur ou fonction. C'était un point de basculement, avant lequel la bibliothèque était lente, maladroite et complètement non évidente. Passons maintenant en revue ce qui a été fait depuis lors.
Une expression est un enregistrement
Par exemple, voici à quoi ressemble la déclaration de l'opérateur somme
public sealed partial record Sumf(Entity Augend, Entity Addend) : NumericNode
Grâce à cela, nous pouvons facilement appliquer le nouveau pattern matching:
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,
(ceci est un exemple de modèles qui fonctionnent lors de la simplification d'une expression)
Mathématiques
, .
, , , .
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
).
. , . , . , .
- , ( ).
Liens
Github du projet.
Site du projet.
Plus de détails Quoi de neuf .
Plans pour les prochaines mises à jour.
Mon profil est sur GitHub.
SymPy - inspirez et donnez des idées.