TI-Nspire & Lua / 特殊な方程式に対する 4 段の Cowell 法 2 / 第 1 近似値、第 2 近似値、両者の最大誤差を求める、それに意味のないとき

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

function approx(funcs, w, temp, h) -- ({微分方程式}, {変化しない部分}, {假定値}, 刻み幅)
   local function maxOfErr(listA, listB)
            local sute = {}
            for i = 1, #listA do
               sute[i] = math.abs(listA[i] - listB[i])
            end
            return math.max(unpack(sute))
         end

   local dim     = #funcs
   local approx1 = {}
   local approx2 = {}
   local f       = {}

   for j = 1, dim do
      approx1[j] = w[j] + h*h * 19 * temp[j]/240 -- 第 1 近似値
   end
   for j = 1, dim do
      f[j] = funcs[j](unpack(approx1)) 
   end
   for j = 1, dim do
         approx2[j] = w[j] + h*h * 19 * f[j]/240 -- 第 2 近似値
   end
   
   return approx1, approx2, maxOfErr(approx1, approx2) -- {第 1 近似値}, {第 2 近似値}, 最大誤差  
end


-- 確かめる
do

-- この聯立二階微分方程式で確かめる。
local function xDotDot(x, y) return -2.95912208e-4 * x / (math.sqrt(x^2 + y^2)^3) end
local function yDotDot(x, y) return -2.95912208e-4 * y / (math.sqrt(x^2 + y^2)^3) end

local approx1, approx2, err = approx({xDotDot,yDotDot},{0.7231433,1.0998377},{-0.9547563e-4,-1.8131274e-4},20)
print("{"..table.concat(approx1," , ").."}")
print("{"..table.concat(approx2," , ").."}")
print(err)

end

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