使用MathNet Symbolics提取常用术语

时间:2015-09-25 21:50:09

标签: c# symbolic-math mathdotnet mathnet

我正在使用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的各种功能组合,但未能超越这一点。

1 个答案:

答案 0 :(得分:1)

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

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)

不幸的是,很多单变量多项式和理性惯例(如新的无平方分解)还没有多变量对应物。单变量例程期望一个符号参数,而多变量例程期望符号集。