SymPyによる数式処理

SymPy は数式処理のための Python ライブラリです。もしまだインストールされていないようでしたら,pip install sympy などと打ち込んでインストールしてください。あるいは,こちらでオンラインで使うこともできます(ただし Python 2.7 です。グラフは描画されません)。Google Colaboratory でも使えます(後で書くように数式表示に制約があります)。

ここでは SymPy の中身を全部インポートしてしまいましょう:

from sympy import *

簡単な数式を入力してみましょう。sqrt は平方根(square root)です:

sqrt(8)

2.828… でなく,2*sqrt(2)(または $2\sqrt{2}$)のように出力されたと思います。

表示方法を 2*sqrt(2) から $2\sqrt{2}$ に変えるには,init_printing() と打ち込んで,もう一度やってみてください。

Google Colaboratory では init_printing(use_latex='matplotlib') と打ち込めば図として出力されます。あまりきれいではありません。あるいは無理矢理 MathJax(数式表示用の JavaScript ライブラリ)を読み込ませる方法がここに書いてあります。

文字式も扱えます。以下では $x$ と $y$ を「文字」(symbol)だとします:

x, y = symbols("x y")

文字式を表示してみます:

(x + y)**10

この式を展開してみましょう:

expand((x + y)**10)

$x^{10} + 10 x^{9} y + 45 x^{8} y^{2} + 120 x^{7} y^{3} + 210 x^{6} y^{4} + 252 x^{5} y^{5} + 210 x^{4} y^{6} + 120 x^{3} y^{7} + 45 x^{2} y^{8} + 10 x y^{9} + y^{10}$ のように展開できましたでしょうか。

上の式は latex(expand((x + y)**10)) と打ち込んで出力されたものを LaTeX (MathJax) で数式化しています。

展開結果を変数に代入しておきましょう:

a = expand((x + y)**10)

ここで単に a とだけ打てば,展開式が表示されます。

展開 expand() の逆は因数分解 factor() です。さきほどの長い式を因数分解してみましょう:

factor(a)

元の $(x + y)^{10}$ に戻りました。

積分もできます:

Integral(exp(-x**2/2))

定積分は次のようにします:

Integral(exp(-x**2/2), (x, -oo, oo))

定積分を実行してみましょう:

integrate(exp(-x**2/2), (x, -oo, oo))

$\sqrt{2}\sqrt{\pi}$ になってしまいました。本当は $\sqrt{2\pi}$ としてほしいところですが。

ほかの例として,積分 integrate(sin(x)) や微分 diff(sin(x)) もやってみましょう。

グラフのプロットも簡単です:

plot(exp(-x**2/2))

もしうまくいかなかったら %matplotlib inline と打ち込んでから再度試してみてください。

複数の式を指定したり,$x$ の範囲を指定したりすることもできます:

plot(sin(x), cos(x), (x, 0, 2*pi))

Last modified: