Python 用符号替换子表达式?
我有一个3x3矩阵,我计算逆矩阵。只有当某些子表达式被新符号替换时,才能清楚地写出相反的表达式,因为它们出现了多次。我能不能让我试着找出那些子表达式并替换它们?我尝试了以下方法,但没有成功:Python 用符号替换子表达式?,python,sympy,Python,Sympy,我有一个3x3矩阵,我计算逆矩阵。只有当某些子表达式被新符号替换时,才能清楚地写出相反的表达式,因为它们出现了多次。我能不能让我试着找出那些子表达式并替换它们?我尝试了以下方法,但没有成功: 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/
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
使用Symphy 0.6.7(如果需要,我可以升级)
编辑:
我升级到0.7.1-git(准确地说是cf9c01f8f9b4b749a7f59891f5466466e4b38e580),然后运行(感谢@PreludeAndFugue的建议):
获得
⎡ ⎛ 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 ⎦
嗯,那么为什么不得到“-νuxy-2呢⋅我不确定使用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 ]
扩展:
总之:它确实被替换了,但是
subs
在矩阵上不可变地工作<不幸的是,code>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 ⎦
有计划使矩阵在默认情况下是不可变的,然后使可变矩阵在所有操作中都能完全正常工作。看见但是它还没有发生。请注意,
stiff.simplify()
simplifysstiff
inplace,因此返回None
。例如,与之比较,list.sort()
。Symphy的pprint
函数可用于打印经过修饰的版本。@PreludeAndFugue:谢谢你的simplify()
功能。。。本可以检查。所有核心开发人员都在这里:。你应该从他们那里得到很好的答案。是的,上面的subs东西在0.6.7中不起作用(至少对我来说,可能是因为它在.subs()中不识别nu,但在一开始制作符号时识别)。无论如何,升级到0.7.1是个好主意。我尝试了最新的git版本,并将其作为问题的编辑。也许我的机器被诅咒了?
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 ⎦