替换子表达式为符号?

2024-09-27 20:16:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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?在


Tags: 表达式矩阵simplifymatrixnuexsymbolssympy
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)

输出还不错:

^{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也不是可变的,很不幸。我明白了

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。但这还没有发生。

相关问题 更多 >

    热门问题