如何使用MathNet.Symbolics获得最终结果?

时间:2017-08-16 17:39:59

标签: c# equation mathnet

我正在尝试制作一个计算行列式的方法。为此我使用MathNet.Symbolics库。一切都很好,直到我遇到一个小问题。我试图从决定因素的公式得到最终结果,在我使用Infix.Format之后,我不知道为什么,但它没有给出令人满意的结果。而不是最终的结果它给了我一个介于两者之间的等式。我认为与方程的一部分在2个括号之间的事实有关。我该怎么做才能得到最终结果?

这是我的代码:

using System;
using InputMath;
using MathNet.Symbolics;
using mns = MathNet.Symbolics.Expression;

namespace MathWizard
{
     class Determinants
    {
        //The final result
        public static string fnalResult;

        public static void BasicDeterminant()
        {
            //The inputs before assigning them to theyr specific variable
            string[] inputs;

            inputs = Console.ReadLine().Split(new char[] { ' ' },StringSplitOptions.RemoveEmptyEntries);

            Double x1 = Convert.ToDouble(inputs[0]);
            Double y1 = Convert.ToDouble(inputs[1]);

            Double x2 = Convert.ToDouble(inputs[2]); 
            Double y2 = Convert.ToDouble(inputs[3]);

            var x = mns.Symbol("x");
            var y = mns.Symbol("y");

            var firstResult = Infix.Format(x * x1 * 1 + x1 * y2 * 1 + x2 * y * 1 - (x1 * x2 * 1 + 1 * y2 * x + 1 * y * x1));

            Console.WriteLine(firstResult);
            Console.ReadKey();

        }
    }
}

所以这是一个示例输入:

1 3 6 4

输入后,数字将按如下方式分配:

x1 = 1;
y1 = 3;
x2 = 6;
y2 = 4;

运行所有代码后输出为:

4 + x + 6 * y - (6 + 4 * x + y)

解决此输出后,实际预期结果应为:

-2-3 * X + 7 * Y

1 个答案:

答案 0 :(得分:0)

Math.NET Symbolics确实应用了自动简化,但仅限于严格的规则。这就是为什么某些术语被简化和重新排序的原因,但括号不会自动扩展。

您可以使用符号例程Algebraic.Expand来强制执行扩展:

var expression = x * x1 * 1 + x1 * y2 * 1 + x2 * y * 1 - (x1 * x2 * 1 + 1 * y2 * x + 1 * y * x1);
var expanded = Algebraic.Expand(expression);
var firstResult = Infix.Format(expanded);

firstResult现在具有预期值(-2) + (-3)*x + 5*y

注意:我注意到如果将其格式化为-2 - 3*x + 5*y会更好。我将在下一个版本中尝试改进这一点。