将 MathNet.Symbolics.ParseResult 转换为 MathNet.Symbolics.Expression

Converting MathNet.Symbolics.ParseResult to MathNet.Symbolics.Expression

我在尝试使用 MathNet.Symbolics 为表达式组合类似术语时遇到问题。对于以下代码,假设我的 'cleanResponse' 是 '2.5q+3.5q=6q'。

    private static string CombineLikeTerms(string cleanResponse)
    {
        var root = GetDocumentTreeFromLaTeX(cleanResponse).Children[0];
        LaTeXNode left = root.Children[1];
        LaTeXNode right = root.Children[0];

        var combinedLeft = Infix.Print(Algebraic.Expand(Infix.ParseOrThrow(Infix.Print(GetEQExpressionFromLaTeXNode(left)))));
        var combinedRight = Infix.Print(Algebraic.Expand(Infix.ParseOrThrow(Infix.Print(GetEQExpressionFromLaTeXNode(right)))));

        return combinedLeft + "=" + combinedRight;
    }

我看到的问题是,返回值仍然是“2.5q+3.5q=6q”。现在,如果把'cleanResponse'改成'2q+4q=6q',返回的结果就是'6q=6q',这正是我所期望的。

我在这里找到了一些东西,https://github.com/mathnet/mathnet-symbolics/issues/3,它允许将类似的项与浮点数组合。但是,因为 Infix.Parse 方法 returns 是一个 ParseResult,而不是一个字符串值,所以我无法按原样使用它。

有谁知道将 ParseResult 转换为表达式的方法吗?

我不太确定我是否遵循了您在此代码示例中尝试实现的目标。例如,为什么要创建一个表达式,将其格式化为中缀,然后再将其解析回表达式?但也许我可以帮助澄清其中的一部分:

  • Infix.Parse做return一个ParseResult,这在C#中处理起来很不方便。这就是为什么在 C# 中我建议改用 Infix.ParseOrThrow,它的工作方式相同,但直接 returns 一个表达式(或抛出异常),跳过 ParseResult.
  • Math.NET 符号中的中缀解析器不允许跳过乘法运算符,即您需要编写 2.5*q+3.5*q.
  • 而不是 2.5q+3.5q
  • 像这样的表达式会自动简化,这就是 Infix.Format(Infix.ParseOrThrow("2.5*q+3.5*q")) returns 6*q 的原因。在这种特殊情况下无需使用 Algebraic.Expand
  • Infix.Print 已弃用,请考虑改用 Infix.Format

看来您的代码可以简化为:

var left = Infix.ParseOrThrow("2.5*q+3.5*q");
var right = Infix.ParseOrThrow("6*q");
var combined = String.Format("{0}={1}", Infix.Format(left), Infix.Format(right));

其中组合将是 6*q=6*q