我有一个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
使用sympy0.6.7(如果需要,我可以升级)。在
编辑:
我升级到0.7.1-git(准确地说是cf9c01f8f9b749a7f59891f546646e4b38e580),然后运行(感谢@PreludeAndFugue的建议):
^{pr2}$获取
⎡ ⎛ 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⋅νxz²+1”替换为m?在
我不确定使用0.6.7是否有问题,但建议更新到0.7.1。
当我看
stiff
时,我看不出meSubs
中的替代是有用的。在创建stiff
之后,我执行了以下操作:输出还不错:
^{pr2}$展开:http://docs.sympy.org/0.7.1/modules/core.html?highlight=expand#sympy.core.function.expand
一起:http://docs.sympy.org/0.7.1/modules/polys/reference.html?highlight=together#sympy.polys.rationaltools.together
它确实被替换了,但是
subs
在矩阵上不可变地工作。applyfunc
也不是可变的,很不幸。我明白了有计划使Matrix在默认情况下是不可变的,然后使MutableMatrix在所有操作中完全正常工作。见https://code.google.com/p/sympy/issues/detail?id=3410。但这还没有发生。
相关问题 更多 >
编程相关推荐