種別[statuses] cocolog:93456816
セクションJRF のひとこと
日時2022年04月26日
元URLhttp://jrf.cocolog-nifty.com/statuses/2022/04/post-ad8cff.html

Python の SymPy で代入 subs が途中で止まったときなどは…

Python の SymPy で代入 subs が途中で止まったときなどは doit() すればいい。
JRF 2022年4月26日

例えば対称行列 M を扱いたいとき、M.T に M を「逆代入」して rewrite したい。これを subs({M.T: M}) で行うこと自体は成功するのだが…

from sympy import *
x = MatrixSymbol("x", 3, 1)
M = MatrixSymbol("M", 3, 3)
(x.T * M * x).diff(x).subs({M.T: M}).simplify()

…は、現状(バージョン 1.8)では…、

M*x + M*x

…にしかならない。これを次のようにすると simplify がうまくいく。

JRF 2022年4月26日

(x.T * M * x).diff(x).subs({M.T: M}).doit()

…は…、

2*M*x

…にちゃんとなる。

JRF 2022年4月26日

……。

ちなみに subs ではなく replace や xreplace を使う方がこの目的には合ってるかもしれない…。replace の場合は次のようにする。

(x.T * M * x).diff(x).replace(M.T, M).doit()

JRF 2022年4月26日