用于代数简化和求解的c#库
本文关键字:代数简化 用于 | 更新日期: 2023-09-27 18:02:35
网络上有相当多的代数求解器和简化器(例如,在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"
(3d打印精度,但如果需要,可以更改)。
求解一个特定的变量也会很好。我需要一些轻量级的东西,而且速度也快(上面的计算最好在5ms左右,包括启动延迟)。
经过一些研究,像Sage, Octave或Mathematica这样的程序可能是多余的(我的应用程序可能只有一个很小的<200k的exe)。Dotnumerics.com或Mathdotnet.com可能是合适的,但前者似乎没有提到代数简化,而后者缺乏文档和示例是令人讨厌的。我想知道是否还有其他合适的替代方案。可以在这里找到一个大列表:http://en.wikipedia.org/wiki/Comparison_of_computer_algebra_systems
我已经成功地从c#中调用SymPy来完成这项工作。SymPy提供了一个相对健壮的简化函数,我已经很成功地使用了它。现在我还不完全确定如何很好地打包它(不需要安装ironpython),甚至不知道直接移植代码有多困难。
- 安装IronPython
- 得到SymPy 将这些资源添加到您的项目中
- IronPython.dll
- IronPython.Modules.dll
- Microsoft.Dynamic.dll
- Microsoft.Scripting.dll
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"));
在一个相关的SO问题中可以找到一系列的答案。尽管除了mathdotnet之外,没有一个是符号(您上面要求的那种简化)、轻量级和. net上的可访问性的交叉点。
我看你已经找到了mathdotnet论坛。注意,它的几个开发人员是SO用户:
- Christoph Ruegg
- Joannes Vermorel(虽然ohloh告诉我他更喜欢数字部分)
这可能会补充您所要求的支持
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)
您是否尝试过创建一些简单的类来实现分流场算法(反向波兰符号),而不是使用堆栈处理堆栈处理处理后缀符号?