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