1

我正在使用 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”之间找到最佳平衡会很慢。

4

2 回答 2

0

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

它通常很有用,尤其是在使用 Mathematica 进行软件开发时,对复杂表达式应用替换以减少它们的形式。对于大型表达式,此任务可能会变得乏味。Substitutions[] 旨在帮助找到一组有用的替换来简化表达式。

它现在已经很老了,但应该仍然可以工作。

于 2013-06-18T21:08:39.343 回答
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;

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

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

输出..不要太笨拙.. Root 表达式包含您寻求的系数..

 (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)
于 2013-06-18T21:09:04.070 回答