Alt ifadeyi bir sembolle mi değiştiriyorsunuz?

Tersini hesapladığım 3x3 matrisim var. Ters, yalnızca bazı alt ifadelerin yerini yeni sembollerle değiştirildiği zaman okunabilir şekilde yazılabilir, çünkü bunlar birden çok kez görünür. Semptomları bu alt ifadeleri bulup bunları değiştirmeye çalışabilir miyim? Aşağıdakileri, başarılı olmadan denedim:

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

Semptomu kullanma 0.6.7 (gerekirse yükseltme yapabilirim).

EDIT:

0.7.1-git'e (cf9c01f8f9b4b749a7f59891f546646e4b38e580) kesin olarak yükselttim ve (önerileriniz için @PreludeAndFugue'e teşekkürler):

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)

edinme

⎡              ⎛    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 ⎦

Hm, peki neden "-ν_xy - 2⋅ν_xz² + 1" harfini almıyor?

5
@PreludeAndFugue: sadeleştir() şeyi için teşekkürler ... kontrol edebilirdi.
katma yazar eudoxos, kaynak
stiff.simplify() öğesinin sert değerini basitleştirdiğini unutmayın, böylece None değerini döndürür. Örneğin, list.sort() ile karşılaştırın.
katma yazar Gary Kerr, kaynak
Sympearance'ın pprint işlevi, güzelleştirilmiş bir sürümü yazdırmak için kullanılabilir.
katma yazar Gary Kerr, kaynak
Tüm temel geliştiriciler şu adreste: groups.google.com/group/sympy/topics . Onlardan iyi cevaplar almalısın.
katma yazar Gary Kerr, kaynak

2 cevap

Değiştirilir, ancak subs Matrices üzerinde mutably çalışmıyor. applyfunc , ne yazık ki de mutably çalışmıyor. alırım

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'i varsayılan olarak değişmez hale getirme planları vardır ve daha sonra tüm işlemler için MutableMatrix'i tamamen çalışır hale getirirler. https://code.google.com/p/sympy/issues/ adresine bakın. detay? id = 3410 . Ama henüz gerçekleşmedi.

0
katma

0.6.7 kullanmanın bir sorun olup olmadığından emin değilim - ancak 0.7.1'e güncellemeniz önerilir.

Sert 'e baktığımda, meSubs ' daki alt bölümlerin faydalı olduğunu göremiyorum. sert oluşturduktan sonra şunları yaptım:

stiff.simplify()
stiff = stiff.subs({2*nuxz**2: 1 - nuxy - m})
stiff = stiff.applyfunc(lambda x: together(expand(x)))
pprint(stiff)

Çıktı çok kötü değil:

[     /    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

together: http://docs.sympy.org/0.7.1/modules/polys/reference.html?highlight=together#sympy.polys.rationaltools.together

0
katma
En son git sürümü ile denedim ve soruyu düzenlemek için koydu. Belki de makinem lanetli mi?
katma yazar eudoxos, kaynak
Evet, yukarıdaki alt öğeler 0,6.7'de bu şekilde çalışmaz (en azından benim için, muhtemelen .subs() içindeki nu'yu tanımıyor, ancak sembolü ilk sırada yaparken yapar). Ne olursa olsun, 0.7.1'e yükseltmek iyi bir fikirdir.
katma yazar VPeric, kaynak