网上有很多代数求解器和简化器(例如,algebra.com上的代码解析器和简化器)。但是,我正在寻找一些可以插入C#的东西,作为一个更大的项目的一部分(我正在制作我自己的计算器,但显然我会请求许可等)。
理想情况下,我会使用以下代码:
String s = MathLib.Simplify("5x*(500/x^2*(sqrt(3)/4)+1)+2x^2+(sqrt(3)/2)*x^2");
并且's'会简化为:"1082.532/x+5*x+2.866*x^2"
(那里有3dp的准确性,但如果需要,可以改变一下)。
解决特定变量也很不错。我需要一些轻量级和快速的东西(如上所述的计算最好在5ms左右,包括启动延迟)。
经过一些研究,像Sage,Octave或Mathematica这样的程序可能有点过分(我的应用程序可能只是一个小的< 200k exe)。 Dotnumerics.com或Mathdotnet.com可能是合适的,但前者似乎没有提到代数简化,后者缺乏文档和示例是关闭的。我想知道是否有任何合适的替代方案。这里有一个很大的列表: http://en.wikipedia.org/wiki/Comparison_of_computer_algebra_systems
答案 0 :(得分:11)
我已成功调用SymPy从C#完成此操作。 SymPy提供了一个相对强大的简化功能,我已经取得了很大的成功。现在我还不完全确定如何很好地打包它(不必安装ironpython),甚至代码的直接端口可能有多难。
C#代码如下:
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"));
答案 1 :(得分:4)
Symbolism是一个C#库,它实现了代数表达式的自动简化。
使用您的示例表达式,以下程序:
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();
在控制台显示:
1082.5317547305483 / x + 5 * x + 2.8660254037844384 * (x ^ 2)
答案 2 :(得分:3)
在a related SO question中可以找到一系列答案。虽然没有,但是mathdotnet的其他部分落在符号的交叉点(上面要求的那种简化),轻量级和.Net上的可访问性。
我看到you have already found mathdotnet forum。请注意,它的一些开发人员是SO用户:
这可能会补充你所要求的支持。
答案 3 :(得分:0)
您是否尝试创建一些实现Shunting Yard Algorithm(反向波兰表示法)的简单类,而不是使用stack processing堆栈处理来处理后缀表示法?