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- ( ).
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 do projeto.
Site do projeto.
Mais detalhado O que há de novo .
Planos para as próximas atualizações.
Meu perfil está no GitHub.
SymPy - inspire e dê ideias.