質問の階差数列の問題をPythonで解いてみました。(^_^;
N 解(左列) 解(右列)
1 1 3
2 4 2
3 5 7
4 8 6
2数x,yが交互に現れる数列が公差になっているので、漸化式は、次式のような階差数列になります。
したがって、一般項は、p,q,rを定数として、次式のように書くことができます。
これから、一般項の式の形がわかったので、与えられたデータから、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)