如何用MathNet.Symbolics简化公式

本文关键字:Symbolics 何用 MathNet | 更新日期: 2023-09-27 18:05:30

我正在使用MathNet.Symbolics库来简化像

这样的代数公式
string f = Infix.Print(Infix.ParseOrThrow("L+H+L+H"))

得到f="2*L+2*H"

当我需要减去以下两个公式时,问题出现了:

string f = Infix.Print(Infix.ParseOrThrow("L+H+L+H - (L+H)"))

这里我得到f="2*L+2*H - (L+H)"而不是(L+H)

我该怎么做才能得到正确的简化?

如何用MathNet.Symbolics简化公式

数学。. NET Symbolics在构造表达式时总是应用自动简化,这样非规范化的形式甚至不可能存在。这对于保持较低的代数算法复杂性是必要的,但也有意地限制了复杂度。这实际上更多的是术语规范化,而不是简化。

表达式2*H + 2*L - (H + L)在技术上确实是标准化/自动简化的形式,但这可能在使用Infix.PrintStrict时更明显,CC_6可读性差得多,但准确地显示了表达式的内部表示方式:

有相当多的代数例程可以用来操作和简化这样的表达式,在这种情况下,一个简单的代数展开就可以做到这一点:

var e1 = Infix.ParseOrThrow("L+H+L+H");
var e2 = Infix.ParseOrThrow("L+H");
var e3 = e1 - e2;
// or: var e3 = Infix.ParseOrThrow("L+H+L+H - (L+H)");
var expanded = Algebraic.Expand(e3);
Infix.Print(expanded); // prints "H + L"