O que há de novo no AngouriMath 1.2?

Saudações. Nos últimos 7 meses, tenho trabalhado na maior atualização do AngouriMath . E há algo para contar.





O que está acontecendo em poucas palavras

Em novembro de 2019, percebi que este mundo, mais precisamente o mundo do dotnet, carece de uma biblioteca de álgebra simbólica para simplificar expressões, resolver equações, derivar látex e assim por diante. Então decidi criar um.





Mas existe ...

Ouvindo o que estou fazendo, diferentes pessoas vêm com diferentes soluções. Reescreva SymPy, faça um invólucro sobre SageMath para Dotnet, espirale Wolfram | Alpha, use mathnet.symbolics primitivo (eles próprios falam de primitividade).





Mas tudo isso tem limitações ou dificuldades. A mesma em que estou trabalhando é uma biblioteca muito leve escrita e otimizada para .NET. Código aberto, é claro. (sob o MIT)





Atualização 1.2

Em agosto, um dos principais contribuidores @ HappyPig375 ajudou a reescrever uma parte significativa da biblioteca para a hierarquia de tipo normal. Agora existe um tipo separado para cada operador ou função. Foi um ponto de inflexão, antes do qual a biblioteca era lenta, desajeitada e completamente não óbvia. Agora vamos repassar o que foi feito desde então.





Uma expressão é um registro

Por exemplo, é assim que a declaração do operador soma se parece





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



Graças a isso, podemos aplicar facilmente a nova correspondência de padrão:





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 é um exemplo de padrões que funcionam ao simplificar uma expressão)





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





Um exemplo simples de uso de AngouriMath.Interactive no Jupyter
AngouriMath.Interactive Jupyter

. , ? , . ([ThreadStatic]



), .





- , Solve



Simplify



, .





, . , , . ,





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



(, Set



, IDisposable



).





. , . , . , .





- , ( ).





Links

  1. Github do projeto.





  2. Site do projeto.





  3. Mais detalhado O que há de novo .





  4. Planos para as próximas atualizações.





  5. Meu perfil está no GitHub.





  6. SymPy - inspire e dê ideias.








All Articles