¿Qué hay de nuevo en AngouriMath 1.2?

Saludos. Durante los últimos 7 meses he estado trabajando en la mayor actualización de AngouriMath . Y hay algo que contar.





Que esta pasando en pocas palabras

En noviembre de 2019, me di cuenta de que este mundo, más precisamente el mundo de la dotnet, carece de una biblioteca de álgebra simbólica para simplificar expresiones, resolver ecuaciones, derivar látex, etc. Entonces decidí crear uno.





Pero hay ...

Al escuchar lo que estoy haciendo, diferentes personas proponen diferentes soluciones. Vuelva a escribir SymPy, haga un envoltorio sobre SageMath para Dotnet, Wolfram en espiral | Alpha, use mathnet.symbolics primitivos (ellos mismos hablan de primitividad).





Pero todo esto tiene limitaciones o dificultades. Lo mismo en el que estoy trabajando es una biblioteca muy liviana escrita y optimizada para .NET. De código abierto, por supuesto. (bajo MIT)





Actualización 1.2

En agosto, uno de los principales contribuyentes @ HappyPig375 ayudó a reescribir una parte significativa de la biblioteca a la jerarquía de tipos normal. Ahora hay un tipo separado para cada operador o función. Fue un punto de inflexión, antes del cual la biblioteca era lenta, torpe y completamente no obvia. Ahora repasemos lo que se ha hecho desde entonces.





Una expresión es un registro

Por ejemplo, así es como se ve la declaración del operador de suma





public sealed partial record Sumf(Entity Augend, Entity Addend) : NumericNode
      
      



Gracias a esto, podemos aplicar fácilmente la nueva coincidencia de patrones:





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,
      
      



(este es un ejemplo de patrones que funcionan al simplificar una expresión)





Matemáticas

, .





, , , .





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- ( ).





, . , 1.1.0.5. .





F#

API AngouriMath F#. , , F# . - , .





Interactive

, AngouriMath Jupyter. AngouriMath.Interactive ILatexiseable



LaTeX- MathJax ( ).





Un ejemplo sencillo de cómo utilizar AngouriMath.Interactive en Jupyter
AngouriMath.Interactive Jupyter

. , ? , . ([ThreadStatic]



), .





- , Solve



Simplify



, .





, . , , . ,





using var _ = MaxExpansionTermCount.Set(10);
// - 
      
      



(, Set



, IDisposable



).





. , . , . , .





- , ( ).





Enlaces

  1. Github del proyecto.





  2. Sitio del proyecto.





  3. Más detallado Novedades .





  4. Planes para las próximas actualizaciones.





  5. Mi perfil está en GitHub.





  6. SymPy : inspira y da ideas.








All Articles