TI-Nspire & Lua / 古典的ルンゲクッタ法 2 / 何ステップかを一度にまとめて計算する

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

function rk(func, period, init, step)
   local step     = step
   local from     = period[1]
   local to       = period[2]
   local initList = {init}
   local timeList = {from}
   local stepDiv6 = step / 6
   local stepDiv2 = step / 2

   for t = from, (to - step) + (step / 2), step do
      local init      = initList[#initList]
      local halfPoint = t + stepDiv2
      local nextPoint = t + step

      local f1 = func(t         , init                )
      local f2 = func(halfPoint , init + stepDiv2 * f1)
      local f3 = func(halfPoint , init + stepDiv2 * f2)
      local f4 = func(nextPoint , init + step     * f3)

      initList[#initList+1] = init + stepDiv6 * (f1 + 2 * (f2 + f3) + f4)
      timeList[#timeList+1] = nextPoint
   end
   var.store("rk", {})
   var.store("rk", {timeList, initList})
end


-- 確かめる。
function sute(t, x)
   return x^2 - t^2 - 2 * t + 2
end
rk(sute, {0, 1}, 0, 1/8)


Nspire で検算。2 行目が厳密解、3 行目が rk23() による近似解、4 行目が今回の古典ルンゲクッタ法による近似解。
f:id:ti-nspire:20170502115252p:plain

TI-Nspire & Lua / 古典的ルンゲクッタ法 1 / 1 ステップだけ計算する

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

function rk(func, from, initVal, step)
   local f1 = func(from           , initVal                )
   local f2 = func(from + step / 2, initVal + step * f1 / 2)
   local f3 = func(from + step / 2, initVal + step * f2 / 2)
   local f4 = func(from + step    , initVal + step * f3    )

   return initVal + (step / 6) * (f1 + 2 * (f2 + f3) + f4)
end

-- 確かめる。
-- この函数を微分方程式として t = 0 から 1 ステップ (1/8) だけ計算する。初期値は 0 とする。
function sute(t, x)
   return x^2 - t^2 - 2 * t + 2
end
print(rk(sute, 0, 0, 1/8))

f:id:ti-nspire:20170501163325p:plain:w400



Nspire で検算する。1 行目が厳密解、2 行目が rk23() による近似解。
f:id:ti-nspire:20170501163151p:plain:w400

PIC16F1939 & MPUトレーナー 1 of 1 / タッチセンサーを使う

参考: 定番!ARMキット&PIC用Cプログラムでいきなりマイコン制御[DVD-ROM付き] (マイコン活用シリーズ), pp.163-168


PIC16F1789 を PIC16F1939 に差し替える。
f:id:ti-nspire:20170430115001j:plain:h315


main.c

// 閾値 を 0x1000 から 0x1600 に変更した以外はテキスト p.168, リスト 19-2 のまま。
// ~
#define TH_VAL  0x1600
// ~