質問の階差数列の問題をPythonで解いてみた。

 質問の階差数列の問題をPythonで解いてみました。(^_^;

N   解(左列)   解(右列)
1   1        3   
2   4        2   
3   5        7   
4   8        6   

 2数x,yが交互に現れる数列が公差になっているので、漸化式は、次式のような階差数列になります。
 a_{n+1}-a_{n}=\frac{x+y}{2}+\frac{y-x}{2}\times (-1)^n
\therefore a_{n}=a_{1}+\frac{x+y}{2} \sum _{k=1} ^{n-1}1+\frac{y-x}{2} \sum _{k=1} ^{n-1} (-1)^k
\therefore a_n=a_{1}+\frac{x+y}{2} (n-1)+\frac{x-y}{4} \{1+(-1)^{n} \}
\therefore a_n=a_1-\frac{x+3y}{4}+\frac{x+y}{2} n+\frac{x-y}{4}(-1)^n
 したがって、一般項a_nは、p,q,rを定数として、次式のように書くことができます。
 a_n=pn+q+r(-1)^n
 これから、一般項の式の形がわかったので、与えられたデータから、scipyの最小二乗法を使って、一般項を求めてみました。というか、検算してみました。(^_^;

● DifferenceSeq1.py

# coding: UTF-8
# DifferenceSeq1.py

from time import time
import numpy as np
from scipy.optimize import leastsq

def fit_fnc(param,n):
    p,q,r = param
    return p*n+q+r*(-1)**n

# residual
def rsd_fnc(param,x,y):
    return y-fit_fnc(param,x)

def main():
    tm = time()  # Timer Start
    N  = [1,2,3,4]
    L  = [1,4,5,8]
    R  = [3,2,7,6]
    Pn = np.array(N)
    Pl = np.array(L)
    Pr = np.array(R)
    param0 = [0.,0.,0.]     # p,q,rの初期値
    Al = leastsq(rsd_fnc,param0,args=(Pn,Pl))[0]
    Ar = leastsq(rsd_fnc,param0,args=(Pn,Pr))[0]
    print('L: An=(% f)n+(% f)+(% f)*(-1)^n'%(Al[0],Al[1],Al[2]))
    print('R: An=(% f)n+(% f)+(% f)*(-1)^n'%(Ar[0],Ar[1],Ar[2]))
    print("Runtime : %.3f [sec]"%(time()-tm))   # Timer Stop & Disp

if __name__ == '__main__':
    main()

●実行結果

L: An=( 2.000000)n+(-0.500000)+( 0.500000)*(-1)^n
R: An=( 2.000000)n+(-0.500000)+(-1.500000)*(-1)^n
Runtime : 0.000 [sec]

※参考URL
最小二乗法 - Python Project - Seesaa Wiki(ウィキ)
pythonでフィッティングをする - おっぱいそん!
scipyで最小二乗法 - daharuの日記
センター試験の群数列の問題をPythonで解いてみた。(2)