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- ( ).
F#
API AngouriMath F#. , , F# . - , .
Interactive
, AngouriMath Jupyter. AngouriMath.Interactive ILatexiseable
LaTeX- MathJax ( ).
. , ? , . ([ThreadStatic]
), .
- , Solve
Simplify
, .
, . , , . ,
using var _ = MaxExpansionTermCount.Set(10);
// -
(, Set
, IDisposable
).
. , . , . , .
- , ( ).
Enlaces
Github del proyecto.
Sitio del proyecto.
Más detallado Novedades .
Planes para las próximas actualizaciones.
Mi perfil está en GitHub.
SymPy : inspira y da ideas.