サブ表現を記号で置き換える?

私は逆行列を計算する3x3行列を持っています。逆式は、複数の部分式が複数回現れるため、一部の部分式が新しい記号に置き換えられた場合にのみ、読みやすい形で書くことができます。 sympyがそれらの部分式を見つけてそれを置き換えることを試みることができますか?私は成功せずに次のことを試みた。

from sympy import *

Ex, Ez, nuxy, nuxz = symbols('E_x E_z nu_xy nu_xz')

# compliance matrix for cross-anisotropic material
compl = Matrix([[1/Ex, -nuxy/Ex, -nuxz/Ez],
                [-nuxy/Ex, 1/Ex, -nuxz/Ez],
                [-nuxz/Ex, -nuxz/Ex, 1/Ez]])

# stiffness matrix
stiff = compl.inv()

# symbols I want to introduce 
m, e = symbols('m e')  

meSubs = {Ex/Ez: e, (1 - nuxy - 2*e*nuxz**2): m}  # instead of these subexpressions

# stiff.simplify() returns None, is that a bug? that's why I apply simplify together with subs here:
stiff.applyfunc(lambda x: simplify(x.subs(meSubs)))
print stiff

sympy 0.6.7を使用して(私は、必要に応じてアップグレードすることができます)。

EDIT:

私は0.7.1-git(正確にはcf9c01f8f9b4b749a7f59891f546646e4b38e580)にアップグレードして、(提案のために@PreludeAndFugueに感謝します):

from sympy import *
Ex,Ez,nuxy,nuxz,m=symbols('E_x E_z nu_xy nu_xz m')
compl=Matrix([[1/Ex,-nuxy/Ex,-nuxz/Ez],[-nuxy/Ex,1/Ex,-nuxz/Ez],[-nuxz/Ex,-nuxz/Ex,1/Ez]])
stiff=compl.inv()
stiff.simplify()
stiff.subs({-nuxy-2*nuxz**2+1:m})    # tried other rearrangements of the equality, as well, same result.
stiff.applyfunc(lambda x: together(expand(x)))
pprint(stiff)

取得する

⎡              ⎛    2    ⎞                         ⎛            2⎞                              ⎤
⎢           Eₓ⋅⎝ν_xz  - 1⎠                     -Eₓ⋅⎝-ν_xy - ν_xz ⎠                 Eₓ⋅ν_xz      ⎥
⎢ ──────────────────────────────────   ────────────────────────────────────  ───────────────────⎥
⎢     2              2         2             2              2         2                    2    ⎥
⎢ ν_xy  + 2⋅ν_xy⋅ν_xz  + 2⋅ν_xz  - 1   - ν_xy  - 2⋅ν_xy⋅ν_xz  - 2⋅ν_xz  + 1  -ν_xy - 2⋅ν_xz  + 1⎥
⎢                                                                                               ⎥
⎢            ⎛            2⎞                         ⎛    2    ⎞                                ⎥
⎢        -Eₓ⋅⎝-ν_xy - ν_xz ⎠                      Eₓ⋅⎝ν_xz  - 1⎠                   Eₓ⋅ν_xz      ⎥
⎢────────────────────────────────────   ──────────────────────────────────   ───────────────────⎥
⎢      2              2         2           2              2         2                     2    ⎥
⎢- ν_xy  - 2⋅ν_xy⋅ν_xz  - 2⋅ν_xz  + 1   ν_xy  + 2⋅ν_xy⋅ν_xz  + 2⋅ν_xz  - 1   -ν_xy - 2⋅ν_xz  + 1⎥
⎢                                                                                               ⎥
⎢              E_z⋅ν_xz                              E_z⋅ν_xz                  E_z⋅(ν_xy - 1)   ⎥
⎢        ───────────────────                   ───────────────────           ────────────────── ⎥
⎢                      2                                     2                            2     ⎥
⎣        -ν_xy - 2⋅ν_xz  + 1                   -ν_xy - 2⋅ν_xz  + 1           ν_xy + 2⋅ν_xz  - 1 ⎦

なぜ、 "-ν_xy - 2・v_xz²+ 1"がmに置き換えられないのですか?

5
追加された 編集された
ビュー: 5
@PreludeAndFugue: simplify()のことをありがとう。ありがとう。
追加された 著者 eudoxos,
stiff.simplify()はインプレースの stiff を単純化するので、 None を返します。たとえば、 list.sort()と比較してください。
追加された 著者 Gary Kerr,
sympyの pprint 関数は、あらかじめ用意されたバージョンを印刷するために使用できます。
追加された 著者 Gary Kerr,
すべての主要な開発者は次のとおりです: groups.google.com/group/sympy/topics 。あなたは彼らから良い答えを得るべきです。
追加された 著者 Gary Kerr,

2 答え

置換されますが、 subs はマトリックス上では変更できません。残念なことに、 applyfunc は変更できません。私は得る

In [10]: pprint(stiff.subs({-nuxy-2*nuxz**2+1:m}))
⎡               ⎛     2    ⎞                            ⎛              2⎞                            ⎤
⎢            Eₓ⋅⎝nu_xz  - 1⎠                        -Eₓ⋅⎝-nu_xy - nu_xz ⎠                Eₓ⋅nu_xz    ⎥
⎢ ──────────────────────────────────────   ────────────────────────────────────────      ────────    ⎥
⎢      2                2          2              2                2          2             m        ⎥
⎢ nu_xy  + 2⋅nu_xy⋅nu_xz  + 2⋅nu_xz  - 1   - nu_xy  - 2⋅nu_xy⋅nu_xz  - 2⋅nu_xz  + 1                  ⎥
⎢                                                                                                    ⎥
⎢             ⎛              2⎞                           ⎛     2    ⎞                               ⎥
⎢         -Eₓ⋅⎝-nu_xy - nu_xz ⎠                        Eₓ⋅⎝nu_xz  - 1⎠                   Eₓ⋅nu_xz    ⎥
⎢────────────────────────────────────────   ──────────────────────────────────────       ────────    ⎥
⎢       2                2          2            2                2          2              m        ⎥
⎢- nu_xy  - 2⋅nu_xy⋅nu_xz  - 2⋅nu_xz  + 1   nu_xy  + 2⋅nu_xy⋅nu_xz  + 2⋅nu_xz  - 1                   ⎥
⎢                                                                                                    ⎥
⎢               E_z⋅nu_xz                                 E_z⋅nu_xz                  -E_z⋅(nu_xy - 1)⎥
⎢               ─────────                                 ─────────                  ────────────────⎥
⎣                   m                                         m                             m        ⎦

デフォルトでMatrixを不変にし、すべての操作でMutableMatrixを完全に動作させる計画があります。 https://code.google.com/p/sympy/issues/ detail?id = 3410 です。しかし、それはまだ起こっていない。

0
追加された

0.6.7を使用しているかどうかはわかりませんが、0.7.1にアップデートすることをお勧めします。

stiff を見ると、便利な meSubs のサブシステンションは見えません。 stiff を作成した後、私は次のことを行いました:

stiff.simplify()
stiff = stiff.subs({2*nuxz**2: 1 - nuxy - m})
stiff = stiff.applyfunc(lambda x: together(expand(x)))
pprint(stiff)

出力はあまりにも悪くありません:

[     /    2    \       /            2\                  ]
[  E_x*\nu_xz  - 1/    E_x*\nu_xy + nu_xz/    E_x*nu_xz    ]
[  ----------------    --------------------     ---------    ]
[   m*(-nu_xy - 1)        m*(nu_xy + 1)             m        ]
[                                                            ]
[   /            2\       /    2    \                    ]
[E_x*\nu_xy + nu_xz/   E_x*\nu_xz  - 1/       E_x*nu_xz    ]
[--------------------    ----------------       ---------    ]
[   m*(nu_xy + 1)         m*(-nu_xy - 1)            m        ]
[                                                            ]
[     E_z*nu_xz             E_z*nu_xz        E_z*(-nu_xy + 1)]
[     ---------             ---------        ----------------]
[         m                     m                   m        ]

expand: http://docs.sympy.org/0.7.1/modules/core.html?highlight=expand#sympy.core.function.expand

together: http://docs.sympy.org/0.7.1/modules/polys/reference.html?highlight=together#sympy.polys.rationaltools.together

0
追加された
私は最新のgitバージョンで試してみました。おそらく私のマシンは呪われていますか?
追加された 著者 eudoxos,
ええ、上のサブ物は0.6.7ではそうはうまくいきません(少なくとも私の場合はおそらく.subs()内のnuを認識しないためですが、最初にシンボルを作るときはそうです)。 0.7.1へのアップグレードは関係なく良いアイデアです。
追加された 著者 VPeric,