どうも、木村(@kimu3_slime)です。
今回は、Julia(SymPy)で数列の漸化式を解く方法を紹介します。
準備
SymPyを使うので、持っていなければインストールしておきましょう。
1 2 | using Pkg Pkg.add("SymPy") |
準備として、以下のコードを実行しておきます。
1 | using SymPy |
数列の漸化式を解く方法
最初に、変数\(n\)と関数(数列)\(a(n)\)を記号として用意しておきます。
1 | @syms n::integer a() |
「Eq(左辺,右辺)」で解きたい漸化式を表現しましょう。
1 | ex1 = Eq(a(n+1),a(n)-3) |
\[ \begin{aligned}a{\left(n + 1 \right)} = a{\left(n \right)} – 3\end{aligned} \]
「rsolve(方程式, 数列)」で漸化式を解くことができます。漸化式=再帰関係式(recurrence relation)の頭文字rです。
1 | rsolve(ex1, a(n)) |
\[ \begin{aligned}- 2 C_{0} – 3 n\end{aligned} \]
解として、等差数列が得られました。初期値を指定していないので、定数\(C_0\)が含まれています。
「Dict(a(1)=>2)」のように辞書型によって初期値(初項)を指定して解けます。
1 | rsolve(ex1, a(n), Dict(a(1)=>2)) |
\[ \begin{aligned}5 – 3 n\end{aligned} \]
比が一定となる漸化式を解けば、
1 2 | ex2 = Eq(a(n+1),2*a(n)) rsolve(ex2, a(n)) |
\[ \begin{aligned}a{\left(n + 1 \right)} = 2 a{\left(n \right)}\end{aligned} \]
\[ \begin{aligned}2^{n} C_{0}\end{aligned} \]
等比数列が得られました。
比がだんだんと変わるような漸化式を解けば
1 2 | ex3 = Eq(a(n+1), 2*(n+1)*a(n)) rsolve(ex3, a(n)) |
\[ \begin{aligned}a{\left(n + 1 \right)} = \left(2 n + 2\right) a{\left(n \right)}\end{aligned} \]
\[ \begin{aligned}2^{n} C_{0} n!\end{aligned} \]
階乗を含む解が得られます。
最後に、フィボナッチ数列の漸化式
\[ \begin{aligned}a_{n+2} = a_{n+1}+a_n,\quad a_1=1,a_2=1\end{aligned} \]
を解いてみましょう。
1 2 3 | ex4 = Eq(a(n+2),a(n+1)+a(n)) rsolve(ex4, a(n)) rsolve(ex4, a(n), Dict(a(1)=>1, a(2)=>1)) |
\[ \begin{aligned}a{\left(n + 2 \right)} = a{\left(n \right)} + a{\left(n + 1 \right)}\end{aligned} \]
\[ \begin{aligned}C_{0} \left(\frac{1}{2} – \frac{\sqrt{5}}{2}\right)^{n} + C_{1} \left(\frac{1}{2} + \frac{\sqrt{5}}{2}\right)^{n}\end{aligned} \]
\[ \begin{aligned}- \frac{\sqrt{5} \left(\frac{1}{2} – \frac{\sqrt{5}}{2}\right)^{n}}{5} + \frac{\sqrt{5} \left(\frac{1}{2} + \frac{\sqrt{5}}{2}\right)^{n}}{5}\end{aligned} \]
一般項がきちんと求められました。
「数式.subs(変数,値)」で値を代入して、数列の最初の項を表示してみましょう。
1 2 3 | for i in 1:10 display(simplify(rsolve(ex4, a(n), Dict(a(1)=>1, a(2)=>1)).subs(n,i))) end |
1 2 3 4 5 6 7 8 9 10 | 1 1 2 3 5 8 13 21 34 55 |
以上、Julia(SymPy)で数列の漸化式を解く方法を紹介してきました。
コンピュータで漸化式を計算するとなると、for文を使って初項から再帰的に求めるのが普通ですが、それだと一般項の形はわかりません。SymPyでは、それが代数的に求められるのが嬉しいですね。
木村すらいむ(@kimu3_slime)でした。ではでは。
コロナ社 (2020-03-26T00:00:01Z)
¥7,353 (コレクター商品)
こちらもおすすめ
漸化式(フィボナッチ数列)を線形代数(線形空間、固有ベクトル)で解く方法を解説
Julia(SymPy)で数列の和、無限級数、べき級数を求める方法