コラム 人と星とともにある数学 数学

SymPyで漸化式を解く 後編|Pythonで数学を学ぼう! 第31回

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

  • この記事を書いた人
  • 最新記事

桜井進(さくらいすすむ)様

1968年山形県生まれ。 サイエンスナビゲーター®。株式会社sakurAi Science Factory 代表取締役CEO。 (略歴) 東京工業大学理学部数学科卒、同大学大学院院社会理工学研究科博士課程中退。 東京理科大学大学院非常勤講師。 理数教育研究所Rimse「算数・数学の自由研究」中央審査委員。 高校数学教科書「数学活用」(啓林館)著者。 公益財団法人 中央教育研究所 理事。 国土地理院研究評価委員会委員。 2000年にサイエンスナビゲーターを名乗り、数学の驚きと感動を伝える講演活動をスタート。東京工業大学世界文明センターフェローを経て現在に至る。 子どもから大人までを対象とした講演会は年間70回以上。 全国で反響を呼び、テレビ・新聞・雑誌など様々なメディアに出演。 著書に『感動する!数学』『わくわく数の世界の大冒険』『面白くて眠れなくなる数学』など50冊以上。 サイエンスナビゲーターは株式会社sakurAi Science Factoryの登録商標です。

あわせて読みたい

-コラム, 人と星とともにある数学, 数学
-,