つれづれなる備忘録

日々の発見をあるがままに綴る

SymPyの使い方7 ~ 極限、テーラー展開、有限差分

 今回はSymPyを用いた数式の極限、テーラー展開、有限差分を計算する方法について紹介していきたい。

atatat.hatenablog.com

1. 極限計算

 極限値を実行するにはlimit(関数,変数,値)コマンドを実行する。例えば、

limit(sin(x)/x,x,0)
>1

代入を実行するsubsで実行すると、特異値では以下のようにnanを返してしまうのでlimitを用いる。

expr=sin(x)/x
expr.subs(x,0)
>nan

無限大はooを用いることで極限値を計算できる。

limit(x**2/exp(x),x,oo)
>0

極限値に対してプラスから近づくか、マイナスから近づくかを指定するにはlimitの4番目の引数として+または-を指定する。

limit(1/x,x,0,'+')
>oo
limit(1/x,x,0,'-')
>-oo

微分積分と同様に極限値を代入せずに定義するLimit(関数,変数,値)というコマンドがある。

expr=Limit(sin(x)/x,x,0)
expr
>Limit(sin(x)/x, x, 0)

評価を実行するには.doit()を用いる。

expr.doit()
>1

2. テーラー展開

 テーラー展開を行うには.series(変数, 展開点, 次数)を用いる。例えば

expr=sin(x)
expr.series(x,0,6)
>x - x**3/6 + x**5/120 + O(x**6)

オーダー項Oを省略したい場合は.removeO() (ゼロではなくオー)を用いる

expr.series(x,0,6).removeO()
>x**5/120 - x**3/6 + x

3. 有限差分

 微分ではなく有限差分をしたい場合はdifferentiate_finite(関数)を用いる。

f, g = symbols('f g', cls=Function)
differentiate_finite(f(x)*g(x))
>-f(x - 1/2)*g(x - 1/2) + f(x + 1/2)*g(x + 1/2)

symbols内のcls=Functionはf,gを変数ではなく関数として定義する場合に用いる。 すでに微分関数が定義されている場合は、微分関数に対して.as_finite_difference()を用いれば有限差分が計算される。

f=Function('f')
dfdx=f(x).diff(x)
dfdx.as_finite_difference()
>-f(x - 1/2) + f(x + 1/2)

なおf(x).diff(x)Derivative(f(x),x)と等価である。差分を計算する上で区間をx-1/2,x+1/2以外を指定するには例えば以下のようにして変更することもできる。

h=Symbol('h')
dfdx.as_finite_difference([x-h/2,x+h/2])
>-f(-h/2 + x)/h + f(h/2 + x)/h

4. まとめ

 今回はSymPyを用いた数式の極限、テーラー展開、有限差分を計算する方法について紹介した。