MinimalPolynomial []用于包含符号的表达式

时间:2013-06-18 12:57:18

标签: wolfram-mathematica

我正在使用Mathematica来解决与几何有关的一些简单方程,然后用不同的语言对这些解决方案进行硬编码†。而不是拥有许多代码页,将解决方案编码为多项式的根将更简洁。

我们来看看:

Solve[{
   dist^2 == xstep^2 + ((h - 2 r)/(NR - 1))^2,
   dist^2 == (w - 2 r - NC xstep)^2 + (h/2 - r - dist/2)^2
         },{xstep, dist}]

产生“非常大的输出”,重量分数和平方根以及第四根。显然,这两个求解的变量是四次方程的根。

请问,是否有适用于包含符号的表达式的MinimalPolynomial []版本?所需要的就是dist四次的五个系数。

谢谢。

†“不同的语言”是PostScript,我真的没有编写// PostScriptForm函数的专业知识。实际上,在一般情况下,在重新计算重复表达式和使用“... dup ... roll”之间找到最佳平衡会很慢。

2 个答案:

答案 0 :(得分:0)

我写了一个名为“Substitutions”(archived here)的包,它提取了一个子表达式层次结构,最大限度地减少了复杂表达式的编码。它包含在旧的MathSource库中。这是描述:

  

它通常很有用,尤其是在将Mathematica用于软件时   开发,将复合表达式的替换应用于减少   他们的形式。对于大型表达式,此任务可能变得乏味。   设计替代[]有助于找到有用的过程   用于简化表达式的替换集。

现在已经很老了,但仍应该有效。

答案 1 :(得分:0)

减少可能是你想要的:

我已将你的一些符号组合并为A,B,C(不是必需的,使其适合屏幕)

Reduce[{dist^2 == xstep^2 + (A)^2 && 
        dist^2 == (C - NC xstep)^2 + (B - dist/2)^2 , {xstep, dist}]]

这会在一系列条件下产生相当大的输出。

如果您知道可以排除各种退化情况的约束,那么指定(我做了这些)

$Assumptions = B != 0  && B^2 != 3 C^2  && NC^2 != 3/4;

注意$假设由Simplify使用,但您需要将其显式添加到Reduce表达式中。

Simplify[Reduce[{dist^2 == xstep^2 + (A)^2 && 
    dist^2 == (C - NC xstep)^2 + (B - dist/2)^2  && $Assumptions }, {xstep, dist}]]

输出..不太难看。根表达式包含你寻找的系数..

 (xstep == 
      Root[9 A^4 - 40 A^2 B^2 + 16 B^4 - 24 A^2 C^2 + 32 B^2 C^2 + 
   16 C^4 + (48 A^2 C NC - 64 B^2 C NC - 
      64 C^3 NC) #1 + (18 A^2 - 40 B^2 - 24 C^2 - 24 A^2 NC^2 + 
      32 B^2 NC^2 + 96 C^2 NC^2) #1^2 + (48 C NC - 
      64 C NC^3) #1^3 + (9 - 24 NC^2 + 16 NC^4) #1^4 &, 1] || 
   xstep == 
    Root[9 A^4 - 40 A^2 B^2 + 16 B^4 - 24 A^2 C^2 + 32 B^2 C^2 + 
      16 C^4 + (48 A^2 C NC - 64 B^2 C NC - 
       64 C^3 NC) #1 + (18 A^2 - 40 B^2 - 24 C^2 - 24 A^2 NC^2 + 
       32 B^2 NC^2 + 96 C^2 NC^2) #1^2 + (48 C NC - 
       64 C NC^3) #1^3 + (9 - 24 NC^2 + 16 NC^4) #1^4 &, 2] || 
  xstep == 
   Root[9 A^4 - 40 A^2 B^2 + 16 B^4 - 24 A^2 C^2 + 32 B^2 C^2 + 
   16 C^4 + (48 A^2 C NC - 64 B^2 C NC - 
      64 C^3 NC) #1 + (18 A^2 - 40 B^2 - 24 C^2 - 24 A^2 NC^2 + 
      32 B^2 NC^2 + 96 C^2 NC^2) #1^2 + (48 C NC - 
      64 C NC^3) #1^3 + (9 - 24 NC^2 + 16 NC^4) #1^4 &, 3] || 
   xstep == 
    Root[9 A^4 - 40 A^2 B^2 + 16 B^4 - 24 A^2 C^2 + 32 B^2 C^2 + 
    16 C^4 + (48 A^2 C NC - 64 B^2 C NC - 
      64 C^3 NC) #1 + (18 A^2 - 40 B^2 - 24 C^2 - 24 A^2 NC^2 + 
      32 B^2 NC^2 + 96 C^2 NC^2) #1^2 + (48 C NC - 
      64 C NC^3) #1^3 + (9 - 24 NC^2 + 16 NC^4) #1^4 &, 4]) && 
   3 A^2 + 4 B dist + xstep (8 C NC + 3 xstep) == 
       4 (B^2 + C^2 + NC^2 xstep^2)