如何用MathNet.Symbolics简化公式?
How to simplify formula with MathNet.Symbolics?
我正在使用 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)
我应该怎么做才能得到正确的简化?
Math.NET 符号学在构造表达式时总是应用自动简化,因此甚至不存在非规范化形式。这对于保持代数算法的低复杂度是必不可少的,但有意限制得非常多。这实际上更像是一个术语规范化,而不是简化。
表达式 2*H + 2*L - (H + L)
在技术上确实是 normalized/auto-simplified 形式,但是当使用 Infix.PrintStrict
时这可能会更明显,后者的可读性要差得多,但可以准确显示表达式在内部的表示方式: 2*H + 2*L + (-1)*(H + L)
.
有相当多的代数例程可用于操作和简化此类表达式,在这种情况下,一个简单的代数展开就可以解决问题:
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"
我正在使用 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)
我应该怎么做才能得到正确的简化?
Math.NET 符号学在构造表达式时总是应用自动简化,因此甚至不存在非规范化形式。这对于保持代数算法的低复杂度是必不可少的,但有意限制得非常多。这实际上更像是一个术语规范化,而不是简化。
表达式 2*H + 2*L - (H + L)
在技术上确实是 normalized/auto-simplified 形式,但是当使用 Infix.PrintStrict
时这可能会更明显,后者的可读性要差得多,但可以准确显示表达式在内部的表示方式: 2*H + 2*L + (-1)*(H + L)
.
有相当多的代数例程可用于操作和简化此类表达式,在这种情况下,一个简单的代数展开就可以解决问题:
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"