【问题标题】:How to simplify formula with MathNet.Symbolics?如何使用 MathNet.Symbolics 简化公式?
【发布时间】:2015-07-30 14:50:42
【问题描述】:

我正在使用 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)

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

【问题讨论】:

    标签: c# math.net mathnet-numerics simplification


    【解决方案1】:

    Math.NET Symbolics 在构造表达式时始终应用自动简化,因此甚至不存在非规范化形式。这对于保持代数算法的复杂度较低是必不可少的,但故意非常有限。这实际上更多的是术语规范化,而不是简化。

    表达式2*H + 2*L - (H + L) 在技术上确实是规范化/自动简化的形式,但是当使用Infix.PrintStrict 时这可能更明显,因为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"
    

    【讨论】:

      猜你喜欢
      • 2019-08-27
      • 1970-01-01
      • 2011-07-06
      • 1970-01-01
      • 2018-04-12
      • 2016-02-23
      • 1970-01-01
      • 1970-01-01
      • 2017-08-16
      相关资源
      最近更新 更多