TI-Nspire & Lua / 補外法 4 / 何かを偶数次多項式で補外する / Neville の算法で補外値だけを求める / 刻み幅を順次 1/2 にした場合 / 複数の点列に適用する

参考: パソコンで見る天体の動き, p.131-142

local function list2oneColMat(list)
         local oneColMat = {}
         for i = 1, #list do
            oneColMat[i] = {}
            oneColMat[i][1] = list[i]
         end
         return oneColMat
      end
local function neville(...)
         local listOfLists = {...}
         local numOfLists = #listOfLists
         local numOfHs    = #listOfLists[1] -- 7 通り計算する。
         local X          = {}
         local extrapo    = {}
         for n = 1, numOfLists do
            X[n] = list2oneColMat(listOfLists[n]) -- 既知の点列を 1 列行列に変換する。
            for i = 2, numOfHs do
            for j = 2, i  do
               X[n][i][j] = X[n][i][j-1] + (X[n][i][j-1] - X[n][i-1][j-1]) / (4^(j-1) - 1) --順次 1/2 刻みで計算する場合の公式。
            end
            end
            extrapo[n] = X[n][numOfHs][numOfHs] -- 補外値だけ返す。
         end
         return extrapo
      end

-- 確かめる。
do
local x = {0.53627861, 0.53951755, 0.54011910, 0.54025730, 0.54029111, 0.54029951, 0.54030161}
local y = {5.3627861 , 5.3951755 , 5.4011910 , 5.4025730 , 5.4029111 , 5.4029951 , 5.4030161 }
local z = {53.627861 , 53.951755 , 54.011910 , 54.025730 , 54.029111 , 54.029951 , 54.030161 }
print("{"..table.concat(neville(x, y, z), ", ").."}")
end

f:id:ti-nspire:20170710091717p:plain