如何使用 MathNet.Symbolics 获得最终结果?
How can I get the final result using MathNet.Symbolics?
我正在尝试制作一种计算行列式的方法。为此,我正在使用 MathNet.Symbolics 库。一切都很好,直到我 运行 遇到了一个小问题。我试图从行列式的公式中得到最终结果,在我使用 Infix.Format
之后,我不知道为什么,但它并没有给 ma 一个令人满意的结果。而不是最终结果,它给了我一个介于两者之间的方程式。我认为这与等式的一部分位于两个括号之间这一事实有关。我应该怎么做才能获得最终结果?
这是我的代码:
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;
在 运行ning 所有代码后输出为:
4 + x + 6*y - (6 + 4*x + y)
解决这个输出后,实际预期结果应该是:
-2-3*x+7*y
Math.NET 符号学确实应用了自动简化,但只是根据严格的规则。这就是为什么一些术语被简化和重新排序,但括号不会自动扩展的原因。
您可以使用符号例程 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
会更好。我会在下一个版本中尝试改进这一点。
我正在尝试制作一种计算行列式的方法。为此,我正在使用 MathNet.Symbolics 库。一切都很好,直到我 运行 遇到了一个小问题。我试图从行列式的公式中得到最终结果,在我使用 Infix.Format
之后,我不知道为什么,但它并没有给 ma 一个令人满意的结果。而不是最终结果,它给了我一个介于两者之间的方程式。我认为这与等式的一部分位于两个括号之间这一事实有关。我应该怎么做才能获得最终结果?
这是我的代码:
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;
在 运行ning 所有代码后输出为:
4 + x + 6*y - (6 + 4*x + y)
解决这个输出后,实际预期结果应该是:
-2-3*x+7*y
Math.NET 符号学确实应用了自动简化,但只是根据严格的规则。这就是为什么一些术语被简化和重新排序,但括号不会自动扩展的原因。
您可以使用符号例程 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
会更好。我会在下一个版本中尝试改进这一点。