サムネがコーヒーの記事は書きかけです。

数列近似アルゴリズム

数列を近似するアルゴリズムについて考えます。

 The Characteristic Root Technique

今回は数列Aを以下の式に近似する場合について考えます。

$$a_n +ca_{n-1}+da_{n-2} =0\exists c,d \in\mathbb{R}$$

$$ A =\{a_0,a_1,a_2,a_3,,,\}$$

Aを使用すれば、定数c,dを求めることができそうです。

$a_2 + ca_1+da_0=0$

$a_3 + ca_2+da_1=0$

ここで、

$$a_n +ca_{n-1}+da_{n-2} =0\to$$

$$x^2+cx+d=0$$

とすると、$a_n$は解$x_1,x_2$を用いて以下のように開くことができます。

$$a_n=. u(x_1)^n + v(x_2)^n\exists u,v \in \mathbb{r}$$

$a_0$及び$a_1$について解けば、u,vを求められそうです。

よって、数列の一般項を$a_n=. u(x_1)^n + v(x_2)^n$と近似することができます。

アルゴリズム

意外と単純作業なので、一気に自動化していきます。

import math

def get_nth(initial:list[int], n:int) -> int:
    a0,a1,a2,a3 = initial[0],initial[1],initial[2],initial[3]
    c = int((a2**2-a3*a1)/(a0*a2-a1**2)*a0/a1-a2/a1)
    d = int((a3*a1-a2**2)/(a0*a2-a1**2))
    x_p = int((-c+math.sqrt(c**2-4*d))/2)
    x_n = int((-c-math.sqrt(c**2-4*d))/2)
    if x_n == x_p:
        an1 = a1
        an2 = a0
        an = 0
        for i in range(1,n):
            an  = -c*an1 - d*an2 
            print(an)
            an2 = an1
            an1 = an
        return an
    u = a0 -((a1-a0*x_n)/(x_p-x_n))
    v = (a1-a0*x_n)/(x_p-x_n)
    return int(v*(x_p)**n + u*(x_n)**n)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です