18

网络上有很多代数求解器和简化器(例如,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

4

4 回答 4

11

我已经成功调用 SymPy 以从 C# 完成此操作。SymPy 提供了一个相对强大的简化函数,我已经取得了很好的成功。现在我还不完全确定如何很好地打包它(不必安装 Ironpython),甚至不知道直接移植代码可能有多难。

  1. 安装IronPython
  2. 获取SymPy
  3. 将这些资源添加到您的项目中
    • IronPython.dll
    • IronPython.Modules.dll
    • Microsoft.Dynamic.dll
    • Microsoft.Scripting.dll
  4. 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"));
    
于 2011-10-11T22:35:55.917 回答
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)
于 2013-04-01T01:31:31.107 回答
3

在相关的 SO question中可以找到一系列答案。尽管除了mathdotnet 之外,没有一个属于符号(您在上面要求的那种简化)、轻量级和 .Net 上的可访问性的交集。

我看到你已经找到mathdotnet 论坛。请注意,它的一些开发人员是 SO 用户:

这可能会补充您要求的支持。

于 2011-07-17T20:44:52.480 回答
0

您是否尝试过创建一些实现分流场算法(反向波兰表示法)的简单类,而不是使用堆栈处理堆栈处理来处理后缀表示法?

于 2011-07-19T16:31:47.360 回答