我正在使用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)
我该怎么做才能获得正确的简化?
答案 0 :(得分:2)
Math.NET Symbolics在构造表达式时始终应用自动简化,因此甚至不能存在非规范化形式。这对于保持代数算法的复杂性很低是必不可少的,但是故意非常有限。这实际上更像是一个术语标准化,而不是简化。
表达式2*H + 2*L - (H + L)
在技术上确实是标准化/自动简化的形式,但是当使用Infix.PrintStrict
时,这可能更加明显,而2*H + 2*L + (-1)*(H + L)
的可读性要低得多,但却清楚地显示了表达式在内部的表示方式:{ {1}}。
有很多代数例程可以用来操作和简化这样的表达式,在这种情况下,一个简单的代数扩展就可以解决这个问题:
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"