更新:2024/07/18

Pythonで漸化式を解こう!SymPyを使った数列の扱い方

Pythonで漸化式を解こう!SymPyを使った数列の扱い方
はるか
はるか
SymPyって知ってる?
ふゅか
ふゅか
もちろん!Pythonの強力な数式処理ライブラリよね。今日は漸化式を解く方法を紹介するんだよね!ワクワクするなぁ♪

1. SymPyで漸化式を解く

SymPyを使用して漸化式に基づく数列を解くことができます。漸化式は、数列の各項が前の項や前のいくつかの項に依存する形式で定義されます。SymPyのrsolveメソッドを使用して漸化式を解くことができます。

1.1. 実行環境

  • SymPy 1.13.0
  • Python 3.12.4

2. 漸化式を解く基本的な方法

2.1. 簡単な漸化式

ふゅか
ふゅか
まずは簡単な漸化式から始めよう!

例えば、次の関係を持つ数列を解くことを考えます。 \[ a_n = 3a_{n-1} + 2 \] この漸化式の一般項を求めます。

import sympy as sp
# シンボリック変数の定義
n = sp.symbols('n')
a_n = sp.Function('a')(n)

# 漸化式の定義
recurrence_relation = sp.Eq(a_n, 3*a_n.subs(n, n-1) + 2)

# 漸化式の一般項
solution = sp.rsolve(recurrence_relation, a_n)

このコードは、漸化式 \( a_n = 3a_{n-1} + 2 \) の一般項を計算し、結果を表示します。出力は次のようになります。

2.2. 初期条件を含む漸化式

ふゅか
ふゅか
次は初期条件を含む漸化式の例を見てみましょう!

初期条件を含む漸化式を解く例を示します。例えば、次の漸化式と初期条件を持つ数列を解きます。\[ a_n = 2a_{n-1} + 1 \] \[ a_0 = 100\]

import sympy as sp

# シンボリック変数の定義
a_n = sp.Function('a')(n)
a_n_1 = sp.Function('a')(n - 1)

# 漸化式の定義
recurrence_relation = sp.Eq(a_n, 2*a_n_1 + 1)

# 初期条件の定義
initial_condition = sp.Eq(a_n.subs(n, 0), 1)

# 漸化式の一般項
solution = sp.rsolve(recurrence_relation, a_n, {a_n.subs(n, 0): 1})

このコードは、漸化式 \( a_n = 2a_{n-1} + 1 \) と初期条件 \( a_0 = 100 \) の一般項を計算し、結果を表示します。出力は次のようになります。

2.3. 三項間漸化式

はるか
はるか
次は三項間漸化式。フィボナッチ数列を例にする。

三項間漸化式を解く例を示します。例えば、次のフィボナッチ数列を解きます。 \[ a_n = a_{n-1} + a_{n-2} \]

import sympy as sp
# シンボリック変数の定義
a_n = sp.Function('a')(n)
a_n_1 = sp.Function('a')(n - 1)
a_n_2 = sp.Function('a')(n - 2)

# 漸化式の定義
recurrence_relation = sp.Eq(a_n, a_n_1 + a_n_2)

# 初期条件の定義
initial_conditions = {a_n.subs(n, 0): 0, a_n.subs(n, 1): 1}

# 漸化式の解
solution = sp.rsolve(recurrence_relation, a_n, initial_conditions)

このコードは、漸化式 \( a_n = a_{n-1} + a_{n-2} \) と初期条件 \( a_0 = 0 \), \( a_1 = 1 \) の一般項を計算し、結果を表示します。出力は次のようになります。

2.4. シンボリック変数を含む漸化式

シンボリック変数(任意の変数)を含む漸化式を解くこともできます。例えば、次の漸化式の数列を解きます。 \[ a_n = ka_{n-1} + c \]

import sympy as sp
# シンボリック変数の定義
k, c = sp.symbols('k c')
a_n = sp.Function('a')(n)
a_n_1 = sp.Function('a')(n - 1)

# 漸化式の定義
recurrence_relation = sp.Eq(a_n, k*a_n_1 + c)

# 漸化式の解
solution = sp.rsolve(recurrence_relation, a_n)

このコードは、シンボリックな漸化式 \( a_n = ka_{n-1} + c \) の一般項を計算し、結果を表示します。出力は次のようになります。

ふゅか
ふゅか
これって k=1のときはどうなっちゃうのかな。

はるか
はるか
まぁ、その場合は、単なる等差数列になるけど。この一般項は使えないな。

PR