【问题标题】:Sympy fails to factorize to the maximumSympy 无法最大程度地分解
【发布时间】:2017-11-13 14:49:59
【问题描述】:

我正在尝试简化一个矩阵以在之后对其求逆,但 sympy 并没有尽可能地分解它,这会导致不必要的复杂表达式。鉴于我正在处理大型方程,我需要尽可能简化它们,否则 iPython 就会崩溃。

这是我的代码:

from sympy import *
from sympy.diffgeom import *
from __future__ import division
x, y, z, t = symbols('x y z t')
r, theta, phi = symbols('r \\theta \phi')
init_printing(use_latex=True)
m = Manifold('name', 4)
p = Patch('origin', m)
cart = CoordSystem('GP', p, ['t', 'x', 'y', 'z'])
t, x, y, z = cart.coord_functions()
dt, dx, dy, dz = cart.base_oneforms()
Rs, R = symbols('Rs R')
TP = TensorProduct
metric = (1-Rs/sqrt(x**2+y**2+z**2))*TP(dt,dt)-(1+x**2/(x**2+y**2+z**2)*(1-sqrt(x**2+y**2+z**2)/Rs)**-1)*TP(dx,dx)-(1+y**2/(x**2+y**2+z**2)*(1-sqrt(x**2+y**2+z**2)/Rs)**-1)*TP(dy,dy)-(1+z**2/(x**2+y**2+z**2)*(1-sqrt(x**2+y**2+z**2)/Rs)**-1+(x**2+y**2)/(x**2+y**2+z**2))*TP(dz,dz)-x*y/(x**2+y**2+z**2)*(1-sqrt(x**2+y**2+z**2)/Rs)**-1*(TP(dx,dy)+TP(dy,dx))-x*z/(x**2+y**2+z**2)*(1-sqrt(x**2+y**2+z**2)/Rs)**-1*(TP(dx,dz)+TP(dz,dx))-y*z/(x**2+y**2+z**2)*(1-sqrt(x**2+y**2+z**2)/Rs)**-1*(TP(dy,dz)+TP(dz,dy))
A = factor(twoform_to_matrix(metric)).subs({sqrt(x**2+y**2+z**2) : R, x**2+y**2+z**2 : R**2})
A

此时,可以在 A.col(1)[1] 中找到一个错误示例:(-R*x**2 - R*y**2 - R*z**2) 不会被分解为 -R*(x**2+y**2+z**2),我可以反过来将其替换为 R**2 为我打算。

我尝试了 Sympy 的所有内置简化方法,但都没有成功。

提前感谢您的帮助:)

【问题讨论】:

  • 您是否尝试在没有 R 的情况下工作,即从一开始就输入 x^2+...?您还替换了 R 和 R^2 ,这看起来很多余,为什么要添加它?

标签: python sympy


【解决方案1】:

您发布的 A 的原始操作数是 157。经过以下操作,它会下降到 117:

>>> factor_terms(A).replace(lambda x: x.is_Add, lambda x: collect(x, (R, Rs)))
>>> _.count_ops()
117

【讨论】:

    【解决方案2】:

    这不是问题的解决方案,只是OP代码的输出。我希望这将有助于有人回答这个问题。

    <math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
      <mrow>
        <mo>[</mo>
        <mtable rowspacing="4pt" columnspacing="1em">
          <mtr>
            <mtd>
              <mo>&#x2212;<!-- − --></mo>
              <mfrac>
                <mn>1</mn>
                <mi>R</mi>
              </mfrac>
              <mrow>
                <mo>(</mo>
                <mo>&#x2212;<!-- − --></mo>
                <mi>R</mi>
                <mo>+</mo>
                <mi>R</mi>
                <mi>s</mi>
                <mo>)</mo>
              </mrow>
            </mtd>
            <mtd>
              <mn>0</mn>
            </mtd>
            <mtd>
              <mn>0</mn>
            </mtd>
            <mtd>
              <mn>0</mn>
            </mtd>
          </mtr>
          <mtr>
            <mtd>
              <mn>0</mn>
            </mtd>
            <mtd>
              <mo>&#x2212;<!-- − --></mo>
              <mfrac>
                <mn>1</mn>
                <mrow>
                  <msup>
                    <mi>R</mi>
                    <mrow class="MJX-TeXAtom-ORD">
                      <mn>2</mn>
                    </mrow>
                  </msup>
                  <mrow>
                    <mo>(</mo>
                    <mo>&#x2212;<!-- − --></mo>
                    <mi>R</mi>
                    <mo>+</mo>
                    <mi>R</mi>
                    <mi>s</mi>
                    <mo>)</mo>
                  </mrow>
                </mrow>
              </mfrac>
              <mrow>
                <mo>(</mo>
                <mo>&#x2212;<!-- − --></mo>
                <mi>R</mi>
                <msup>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mi mathvariant="bold">x</mi>
                  </mrow>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mn>2</mn>
                  </mrow>
                </msup>
                <mo>&#x2212;<!-- − --></mo>
                <mi>R</mi>
                <msup>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mi mathvariant="bold">y</mi>
                  </mrow>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mn>2</mn>
                  </mrow>
                </msup>
                <mo>&#x2212;<!-- − --></mo>
                <mi>R</mi>
                <msup>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mi mathvariant="bold">z</mi>
                  </mrow>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mn>2</mn>
                  </mrow>
                </msup>
                <mo>+</mo>
                <mn>2</mn>
                <mi>R</mi>
                <mi>s</mi>
                <msup>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mi mathvariant="bold">x</mi>
                  </mrow>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mn>2</mn>
                  </mrow>
                </msup>
                <mo>+</mo>
                <mi>R</mi>
                <mi>s</mi>
                <msup>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mi mathvariant="bold">y</mi>
                  </mrow>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mn>2</mn>
                  </mrow>
                </msup>
                <mo>+</mo>
                <mi>R</mi>
                <mi>s</mi>
                <msup>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mi mathvariant="bold">z</mi>
                  </mrow>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mn>2</mn>
                  </mrow>
                </msup>
                <mo>)</mo>
              </mrow>
            </mtd>
            <mtd>
              <mo>&#x2212;<!-- − --></mo>
              <mfrac>
                <mrow>
                  <mi>R</mi>
                  <mi>s</mi>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mi mathvariant="bold">x</mi>
                  </mrow>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mi mathvariant="bold">y</mi>
                  </mrow>
                </mrow>
                <mrow>
                  <msup>
                    <mi>R</mi>
                    <mrow class="MJX-TeXAtom-ORD">
                      <mn>2</mn>
                    </mrow>
                  </msup>
                  <mrow>
                    <mo>(</mo>
                    <mo>&#x2212;<!-- − --></mo>
                    <mi>R</mi>
                    <mo>+</mo>
                    <mi>R</mi>
                    <mi>s</mi>
                    <mo>)</mo>
                  </mrow>
                </mrow>
              </mfrac>
            </mtd>
            <mtd>
              <mo>&#x2212;<!-- − --></mo>
              <mfrac>
                <mrow>
                  <mi>R</mi>
                  <mi>s</mi>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mi mathvariant="bold">x</mi>
                  </mrow>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mi mathvariant="bold">z</mi>
                  </mrow>
                </mrow>
                <mrow>
                  <msup>
                    <mi>R</mi>
                    <mrow class="MJX-TeXAtom-ORD">
                      <mn>2</mn>
                    </mrow>
                  </msup>
                  <mrow>
                    <mo>(</mo>
                    <mo>&#x2212;<!-- − --></mo>
                    <mi>R</mi>
                    <mo>+</mo>
                    <mi>R</mi>
                    <mi>s</mi>
                    <mo>)</mo>
                  </mrow>
                </mrow>
              </mfrac>
            </mtd>
          </mtr>
          <mtr>
            <mtd>
              <mn>0</mn>
            </mtd>
            <mtd>
              <mo>&#x2212;<!-- − --></mo>
              <mfrac>
                <mrow>
                  <mi>R</mi>
                  <mi>s</mi>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mi mathvariant="bold">x</mi>
                  </mrow>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mi mathvariant="bold">y</mi>
                  </mrow>
                </mrow>
                <mrow>
                  <msup>
                    <mi>R</mi>
                    <mrow class="MJX-TeXAtom-ORD">
                      <mn>2</mn>
                    </mrow>
                  </msup>
                  <mrow>
                    <mo>(</mo>
                    <mo>&#x2212;<!-- − --></mo>
                    <mi>R</mi>
                    <mo>+</mo>
                    <mi>R</mi>
                    <mi>s</mi>
                    <mo>)</mo>
                  </mrow>
                </mrow>
              </mfrac>
            </mtd>
            <mtd>
              <mo>&#x2212;<!-- − --></mo>
              <mfrac>
                <mn>1</mn>
                <mrow>
                  <msup>
                    <mi>R</mi>
                    <mrow class="MJX-TeXAtom-ORD">
                      <mn>2</mn>
                    </mrow>
                  </msup>
                  <mrow>
                    <mo>(</mo>
                    <mo>&#x2212;<!-- − --></mo>
                    <mi>R</mi>
                    <mo>+</mo>
                    <mi>R</mi>
                    <mi>s</mi>
                    <mo>)</mo>
                  </mrow>
                </mrow>
              </mfrac>
              <mrow>
                <mo>(</mo>
                <mo>&#x2212;<!-- − --></mo>
                <mi>R</mi>
                <msup>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mi mathvariant="bold">x</mi>
                  </mrow>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mn>2</mn>
                  </mrow>
                </msup>
                <mo>&#x2212;<!-- − --></mo>
                <mi>R</mi>
                <msup>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mi mathvariant="bold">y</mi>
                  </mrow>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mn>2</mn>
                  </mrow>
                </msup>
                <mo>&#x2212;<!-- − --></mo>
                <mi>R</mi>
                <msup>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mi mathvariant="bold">z</mi>
                  </mrow>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mn>2</mn>
                  </mrow>
                </msup>
                <mo>+</mo>
                <mi>R</mi>
                <mi>s</mi>
                <msup>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mi mathvariant="bold">x</mi>
                  </mrow>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mn>2</mn>
                  </mrow>
                </msup>
                <mo>+</mo>
                <mn>2</mn>
                <mi>R</mi>
                <mi>s</mi>
                <msup>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mi mathvariant="bold">y</mi>
                  </mrow>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mn>2</mn>
                  </mrow>
                </msup>
                <mo>+</mo>
                <mi>R</mi>
                <mi>s</mi>
                <msup>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mi mathvariant="bold">z</mi>
                  </mrow>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mn>2</mn>
                  </mrow>
                </msup>
                <mo>)</mo>
              </mrow>
            </mtd>
            <mtd>
              <mo>&#x2212;<!-- − --></mo>
              <mfrac>
                <mrow>
                  <mi>R</mi>
                  <mi>s</mi>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mi mathvariant="bold">y</mi>
                  </mrow>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mi mathvariant="bold">z</mi>
                  </mrow>
                </mrow>
                <mrow>
                  <msup>
                    <mi>R</mi>
                    <mrow class="MJX-TeXAtom-ORD">
                      <mn>2</mn>
                    </mrow>
                  </msup>
                  <mrow>
                    <mo>(</mo>
                    <mo>&#x2212;<!-- − --></mo>
                    <mi>R</mi>
                    <mo>+</mo>
                    <mi>R</mi>
                    <mi>s</mi>
                    <mo>)</mo>
                  </mrow>
                </mrow>
              </mfrac>
            </mtd>
          </mtr>
          <mtr>
            <mtd>
              <mn>0</mn>
            </mtd>
            <mtd>
              <mo>&#x2212;<!-- − --></mo>
              <mfrac>
                <mrow>
                  <mi>R</mi>
                  <mi>s</mi>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mi mathvariant="bold">x</mi>
                  </mrow>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mi mathvariant="bold">z</mi>
                  </mrow>
                </mrow>
                <mrow>
                  <msup>
                    <mi>R</mi>
                    <mrow class="MJX-TeXAtom-ORD">
                      <mn>2</mn>
                    </mrow>
                  </msup>
                  <mrow>
                    <mo>(</mo>
                    <mo>&#x2212;<!-- − --></mo>
                    <mi>R</mi>
                    <mo>+</mo>
                    <mi>R</mi>
                    <mi>s</mi>
                    <mo>)</mo>
                  </mrow>
                </mrow>
              </mfrac>
            </mtd>
            <mtd>
              <mo>&#x2212;<!-- − --></mo>
              <mfrac>
                <mrow>
                  <mi>R</mi>
                  <mi>s</mi>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mi mathvariant="bold">y</mi>
                  </mrow>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mi mathvariant="bold">z</mi>
                  </mrow>
                </mrow>
                <mrow>
                  <msup>
                    <mi>R</mi>
                    <mrow class="MJX-TeXAtom-ORD">
                      <mn>2</mn>
                    </mrow>
                  </msup>
                  <mrow>
                    <mo>(</mo>
                    <mo>&#x2212;<!-- − --></mo>
                    <mi>R</mi>
                    <mo>+</mo>
                    <mi>R</mi>
                    <mi>s</mi>
                    <mo>)</mo>
                  </mrow>
                </mrow>
              </mfrac>
            </mtd>
            <mtd>
              <mo>&#x2212;<!-- − --></mo>
              <mfrac>
                <mn>1</mn>
                <mrow>
                  <msup>
                    <mi>R</mi>
                    <mrow class="MJX-TeXAtom-ORD">
                      <mn>2</mn>
                    </mrow>
                  </msup>
                  <mrow>
                    <mo>(</mo>
                    <mo>&#x2212;<!-- − --></mo>
                    <mi>R</mi>
                    <mo>+</mo>
                    <mi>R</mi>
                    <mi>s</mi>
                    <mo>)</mo>
                  </mrow>
                </mrow>
              </mfrac>
              <mrow>
                <mo>(</mo>
                <mo>&#x2212;<!-- − --></mo>
                <mn>2</mn>
                <mi>R</mi>
                <msup>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mi mathvariant="bold">x</mi>
                  </mrow>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mn>2</mn>
                  </mrow>
                </msup>
                <mo>&#x2212;<!-- − --></mo>
                <mn>2</mn>
                <mi>R</mi>
                <msup>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mi mathvariant="bold">y</mi>
                  </mrow>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mn>2</mn>
                  </mrow>
                </msup>
                <mo>&#x2212;<!-- − --></mo>
                <mi>R</mi>
                <msup>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mi mathvariant="bold">z</mi>
                  </mrow>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mn>2</mn>
                  </mrow>
                </msup>
                <mo>+</mo>
                <mn>2</mn>
                <mi>R</mi>
                <mi>s</mi>
                <msup>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mi mathvariant="bold">x</mi>
                  </mrow>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mn>2</mn>
                  </mrow>
                </msup>
                <mo>+</mo>
                <mn>2</mn>
                <mi>R</mi>
                <mi>s</mi>
                <msup>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mi mathvariant="bold">y</mi>
                  </mrow>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mn>2</mn>
                  </mrow>
                </msup>
                <mo>+</mo>
                <mn>2</mn>
                <mi>R</mi>
                <mi>s</mi>
                <msup>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mi mathvariant="bold">z</mi>
                  </mrow>
                  <mrow class="MJX-TeXAtom-ORD">
                    <mn>2</mn>
                  </mrow>
                </msup>
                <mo>)</mo>
              </mrow>
            </mtd>
          </mtr>
        </mtable>
        <mo>]</mo>
      </mrow>
    </math>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多