c# algebra symbolic-math computer-algebra-systems

Biblioteca de C#para la simplificación y resolución de álgebra



algebra symbolic-math (4)

¿Ha intentado crear algunas clases simples que implementan el algoritmo Shunting Yard (notación polaca inversa) que procesar la notación postfix utilizando el procesamiento de pila de procesamiento de pila?

Hay bastantes solucionadores y simplificadores de álgebra en la web (por ejemplo, el decente en algebra.com). Sin embargo, estoy buscando algo que pueda conectar a C # como parte de un proyecto más grande (estoy haciendo mi propia calculadora, pero obviamente pediría permiso, etc.).

Lo ideal sería usar código como:

String s = MathLib.Simplify("5x*(500/x^2*(sqrt(3)/4)+1)+2x^2+(sqrt(3)/2)*x^2");

Y ''s'' se simplificaría hasta: "1082.532/x+5*x+2.866*x^2"

(Exactitud 3dp allí, pero uno podría cambiar eso si fuera necesario).

Resolver una variable en particular también sería bueno. Necesito algo liviano y rápido también (los cálculos como los anteriores serían preferiblemente de menos de 5 ms, incluida la latencia de inicio).

Después de algunas investigaciones, programas como Sage, Octave o Mathematica son probablemente excesivos (mi aplicación solo será un pequeño <200k exe probablemente). Dotnumerics.com o Mathdotnet.com pueden ser adecuados, pero el primero no parece mencionar la simplificación algebraica, y la falta de documentación y ejemplos en el segundo es un apagón. Me pregunto si hay alternativas apropiadas también. Una lista grande se puede encontrar aquí: http://en.wikipedia.org/wiki/Comparison_of_computer_algebra_systems


Hay una serie de respuestas que se encuentran en una pregunta SO relacionada . Aunque ninguno, aparte de mathdotnet , caiga en la intersección de los símbolos (el tipo de simplificación que está solicitando anteriormente), la ligereza y la accesibilidad en .Net.

Veo que ya has encontrado el foro mathdotnet . Tenga en cuenta que algunos de sus desarrolladores son SO usuarios:

  • Christoph Rüegg
  • Joannes Vermorel (aunque ohloh me dice que está más vinculado a la sección de números)

Eso podría complementar el apoyo que pides.


Me las arreglé para llamar con éxito a SymPy para hacer esto desde C #. SymPy proporciona una función de simplificación relativamente robusta con la que he tenido éxito. Ahora no estoy completamente seguro de cómo empaquetar esto bien (no tengo que instalar Ironpython), o incluso qué tan difícil puede ser un puerto directo del código.

  1. Instalar IronPython
  2. Obtener SymPy
  3. Agrega estos recursos a tu proyecto
    • IronPython.dll
    • IronPython.Modules.dll
    • Microsoft.Dynamic.dll
    • Microsoft.Scripting.dll
  4. Código C # de la siguiente manera:

    var engine = Python.CreateEngine(); var paths = engine.GetSearchPaths(); paths.Add(@"c:/program files (x86)/ironpython 2.7/lib"); paths.Add(@"c:/Development/sympy"); engine.SetSearchPaths(paths); // expression to simplify var expr = "0 + 1 * 1 * (x - 2) / (1 - 2) * (x - 3) / (1 - 3) * (x - 4) / (1 - 4) + 8 * 1 * (x - 1) / (2 - 1) * (x - 3) / (2 - 3) * (x - 4) / (2 - 4) + 27 * 1 * (x - 1) / (3 - 1) * (x - 2) / (3 - 2) * (x - 4) / (3 - 4) + 64 * 1 * (x - 1) / (4 - 1) * (x - 2) / (4 - 2) * (x - 3) / (4 - 3)"; var scope = engine.CreateScope(); var script = engine.CreateScriptSourceFromString(@" from sympy import * import clr from System import String expr = simplify(''" + expr + @"'') result = clr.Convert(expr, String) "); script.Execute(scope); // prints "x**3" Console.WriteLine(scope.GetVariable("result"));


Symbolism es una biblioteca de C # que implementa la simplificación automática de expresiones algebraicas.

Siguiendo con tu expresión de ejemplo, el siguiente programa:

var x = new Symbol("x"); (5 * x * (500 / (x ^ 2) * (sqrt(3.0) / 4) + 1) + 2 * (x ^ 2) + (sqrt(3.0) / 2) * (x ^ 2)) .AlgebraicExpand() .Disp();

Muestra esto en la consola:

1082.5317547305483 / x + 5 * x + 2.8660254037844384 * (x ^ 2)