gpt4 book ai didi

c# - 使用 MathNet Symbolics 提取常用术语

转载 作者:太空宇宙 更新时间:2023-11-03 12:59:24 25 4
gpt4 key购买 nike

我正在使用 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 符号版本 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com