我正在使用MathNet Symbolics处理我正在处理的程序的符号代数部分。一般用途是创建一对符号公式,然后将这两个公式相除。在大多数情况下,这效果很好。但是,有时它不想做更复杂的简化。例如:

                       (512*r*t*w + 2048*r*t^2*w)
-----------------------------------------------------------------------
(512*r*t*w + 512*r^2*t*w + 3072*r*t^2*w + 3072*r^2*t^2*w + 1024*r*t^3*w)


通过一些工作,我已经能够使它从等式中消除w,因为无论从顶部还是底部,它都是如此:

                    (512*r*t + 2048*r*t^2)
--------------------------------------------------------------
(512*r*t + 512*r^2*t + 3072*r*t^2 + 3072*r^2*t^2 + 1024*r*t^3)


但是,我无法弄清楚如何找到常用术语:

         (512*r*t)*(1 + 4*t)
--------------------------------------
(512*r*t)(1 + r + 6*t + 6*r*t + 2*t^2)


并消除以下术语:

         (1 + 4*t)
-----------------------------
(1 + r + 6*t + 6*r*t + 2*t^2)


我一直使用Wolfram Alpha作为检查工作的黄金标准。我在整个下午的大部分时间里一直在使用LinqPad上的代码,这消除了w

var h1 = MathNet.Symbolics.Infix.ParseOrUndefined("(1/8)*r*t*w + (1/2)*r*t^2*w");
var h2 = MathNet.Symbolics.Infix.ParseOrUndefined("(1/8)*r*t*w + (1/8)*r^2*t*w + (3/4)*r*t^2*w + (3/4)*r^2*t^2*w + (1/4)*r*t^3*w");

Infix.Print(Rational.Expand(h1/h2)).Dump();  //Prints (512*r*t*w + 2048*r*t^2*w)/(512*r*t*w + 512*r^2*t*w + 3072*r*t^2*w + 3072*r^2*t^2*w + 1024*r*t^3*w)
var tot = Rational.Expand(h1 / h2);

var simplified = true;
do
{
    simplified=false;
    foreach (var v in Rational.Variables(tot))
    {
        var result = Polynomial.Divide(v, h1, h2);
        if (!result.Item1.Equals(MathNet.Symbolics.Expression.Zero))
        {
            simplified = true;
            tot = result.Item1;
            break;
        }
    }
}while(simplified);
tot = Rational.Expand(tot);

Infix.Print(tot).Dump();  //Prints (512*r*t + 2048*r*t^2)/(512*r*t + 512*r^2*t + 3072*r*t^2 + 3072*r^2*t^2 + 1024*r*t^3)


有人可以给我指示如何继续使用MathNet吗?我已经尝试过RationalPolynomial的各种功能组合,但无法超越这一点。

最佳答案

我刚刚发布了新的Math.NET Symbolics版本v0.6.0,其中包括一个新的Rational.Reduce例程,该例程删除了这些常见的简单因素(也作为Rational.Expand的一部分执行):

var h1 = Infix.ParseOrThrow("(1/8)*r*t*w + (1/2)*r*t^2*w");
var h2 = Infix.ParseOrThrow("(1/8)*r*t*w + (1/8)*r^2*t*w + (3/4)*r*t^2*w + (3/4)*r^2*t^2*w + (1/4)*r*t^3*w");

var q1 = h1/h2;
Infix.Print(q1);
// returns: ((1/8)*r*t*w + (1/2)*r*t^2*w)/((1/8)*r*t*w + (1/8)*r^2*t*w + (3/4)*r*t^2*w + (3/4)*r^2*t^2*w + (1/4)*r*t^3*w)

var q2 = Rational.Expand(q1);
Infix.Print(q2);
// returns: (1 + 4*t)/(1 + r + 6*t + 6*r*t + 2*t^2)


不幸的是,像新的无平方因子分解这样的相当多的单变量多项式和有理程序还没有多元变量。单变量例程期望一个符号参数,而多变量例程期望一个符号集。

关于c# - 用MathNet Symbolics提取常用术语,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32791138/

10-12 17:33