使用MathNet Symbolics提取公共术语

本文关键字:术语 提取 MathNet Symbolics 使用 | 更新日期: 2023-09-27 18:14:38

我使用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的各种功能组合,并且无法越过这一点。

使用MathNet Symbolics提取公共术语

我刚刚出版了一本新的《数学》。. 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)

不幸的是,相当多的单变量多项式和有理例程,如新的无平方分解,还没有一个多变量对应。单变量例程需要一个符号参数,而多变量例程需要一个符号集。