私は逆行列を計算する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に置き換えられないのですか?
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
置換されますが、 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 です。しかし、それはまだ起こっていない。