gpt4 book ai didi

python - 用符号替换子表达式?

转载 作者:太空狗 更新时间:2023-10-30 01:38:47 25 4
gpt4 key购买 nike

我有一个 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(如果需要,我可以升级)。

编辑:

我升级到 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⋅ν_xz² + 1”替换为 m?

最佳答案

您的两个替换都失败了,因为您的矩阵中不存在这些模式。让我们一次看一个:

  1. 没有 Ex/Ez 比率; x.subs(x/y, z)不变
  2. 您有一个额外的 e 出现在 1 - nuxy - 2*e*nuxz**2 中,因此表达式也永远不会匹配。

@asmeurer 表明文字 1 - nuxy - 2*nuxz**2 可以被替换,但它也作为某些分母中的一个因素出现。更复杂的替换可以通过检查模式是否均匀地划分表达式来完成。

让我们创建一个函数来进行替换:

>>> from sympy import *
>>> t = 1 - nuxy - 2*e*nuxz**2
>>> def do(x):
... w, r = div(x, t)
... if not r:
... return m*w
... return x

现在我们将其应用于矩阵的每个元素:

>>> stiff.applyfunc(lambda x: factor_terms(bottom_up(x, do)))
Matrix([
[ -E_x*(nu_xz**2 - 1)/(m*(nu_xy + 1)), E_x*(nu_xy + nu_xz**2)/(m*(nu_xy + 1)), E_x*nu_xz/m],
[E_x*(nu_xy + nu_xz**2)/(m*(nu_xy + 1)), -E_x*(nu_xz**2 - 1)/(m*(nu_xy + 1)), E_x*nu_xz/m],
[ E_z*nu_xz/m, E_z*nu_xz/m, -E_z*(nu_xy - 1)/m]])

对于复杂的表达式/矩阵,有时使用 cse 可以很好地了解结构:

>>> cse(stiff)
([(x0, nu_xz**2), (x1, E_x*x0), (x2, 2*x0), (x3, x2 - 1), (x4, 1/(nu_xy**2 + nu_xy*x2 + x3)), (x5, x4*(-E_x + x1)), (x6, x4*(-E_x*nu_xy - x1)), (x7, 1/(nu_xy + x3)), (x8, nu_xz*x7), (x9, -E_x*x8), (x10, -E_z*x8)], [Matrix([
[ x5, x6, x9],
[ x6, x5, x9],
[x10, x10, x7*(E_z*nu_xy - E_z)]])])

关于python - 用符号替换子表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7916653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com