目次
sympy.rsolveを用いて一般項を求める
前回は漸化式を再帰関数を用いて定義する方法をとりあげました。今回は漸化式を解いて一般項を求める方法を紹介していきます。
sympy.rsolveを用いることで一般項を求めることができます。その使い方を説明していきます。
次の図にある2項間漸化式を解くためのコードは次の5行です。
>>> import sympy
>>> sympy.var('n')
>>> a = sympy.Function('a')
>>> f = a(n)-2*a(n-1)-3
>>> sympy.rsolve(f, a(n), {a(1):1})
1行目 SymPyモジュールをインポートします
2行目 数列のナンバリングnをシンボリック変数として定義します
3行目 数列aをシンボリック関数として定義します
4行目 漸化式の左辺をfとして定義します
このとき2つに注意します。
①漸化式はnとn-1の関係式にする
②漸化式は右辺を0にする
例えば、与えられた漸化式がa(n+1)=2a(n)+3であれば、nのナンバリングをnとn-1に置き換えて、a(n)=2a(n-1)+3とします。右辺を0に式変形します。2a(n-1)+3- a(n)=0やa(n)-2a(n-1)-3=0など。
こうして出来上がる左辺の式をPythonの文法に従って翻訳してfとします。
これでお膳立てが出来ました。
5行目 sympy.rsolve()の引数に3つを渡すことでa(n)の一般項(nの式)が出力されます。
第1引数 f 漸化式の左辺f
第2引数 a(n) どの数列について解くかの指定
第3引数 初期値 a(1)=1は{a(1):1}とします
実行結果
jupyter notebookによる実行結果は次のようになります。一般項が2・2n-3が出力されているのがわかります。
sympy.rsolve()の初期値を省略すると未定係数C0を含む一般解が出力されます。
フィボナッチ数列の漸化式を解く
前回も取り上げたフィボナッチ数列の漸化式を解いてみます。
同じく5行のコードでOKです。
第3引数 初期値 F(0)=1、F(1)=1は{F(0):0, F(1):1}とします
得られた一般項のnに数値を代入するには、subsメソッドを使います。
nに2を代入してみるとF(2)=1とはならず、一般項の形のままでその先の数値計算がされません。
sympy.simplify()に渡してあげることで一番シンプルな形まで計算をしてくれます。
漸化式 a(n)=a(n-1)+2n を解く
SymPy1.11 documentationにsympy.rsolve()についての説明があります。それによると漸化式は線形に限定されているようです。
次の漸化式の一般項は求まりました。
したがって次のような分数型の漸化式はsympy.rsolve()では解けません。
次回はこの分数型の漸化式を解くコードを紹介します。
今回使用したプログラムファイル(Jupyter Notebook)はGoogle Colaboratoryで実行(ダウンロード)できます。
https://drive.google.com/file/d/151SAczqJ7rlLdCL5ZdK5eshqDgRyGhXs/view?usp=share_link