振子の運動
-- では振り子の支点に加速度をかけて振り回してみる timerTicking = false cursor.set("drag grab") screenW = platform.window:width() screenH = platform.window:height() unitLen = screenW/4 -- 1メートルの、画面上での画素数 posTwoAgoX = 0 posTwoA…
--[[ とりあえず支点は固定したまま振り子を振ってみる。 スクリプトのフローは下の 3 行を繰り返すだけである。 ★1. 「今の状態」を描画する。 ★2. タイマーが tick したら「今の状態」を読み込んで「Δt 時間後の状態」を計算する。 ★3. その「Δt 時間後の…
lua から呼びやすいよう、nspire のユーザー定義函数にまとめる。 減衰係数 c は、参考文献と同じく 0.1 とする。rk23() の精度は指定しない(デフォルト値を使う)。 重りの x 座標、y 座標も nspire 側で計算してしまうことにする。 引数は (棒の長さ, 支…
支点を自由に動かせる振り子を考える。x 軸、y 軸の取りかたは参考文献と逆にした。 は角加速度。 は支点の x 軸方向の加速度。 は支点の y 軸方向の加速度。 は角速度。 -c * は摩擦や空気抵抗などもろもろを合わせた減衰項。係数 c は決めようがないので…
local time = 0 -- シム内経過時間〔sec〕 local l1 = 1.1 --〔m〕 local l2 = 1.5 --〔m〕 local m1 = 1.7 --〔kg〕 local m2 = 2.1 --〔kg〕 local step = 0.02 --〔sec〕 local dens = 2 -- 重りの密度〔kg/m^3〕。シミュレーションとは無関係。 local vo…
確認のためとりあえず棒だけ描いた。節と先端とにある質点は描いていない。 local w = platform.window:width() local h = platform.window:height() local x0 = w/2 local y0 = h/2 local step = 0.02 var.store("g", 9.80665) var.store("l1", 1) var.stor…
Nspire の Calculator アプリケーションでの実行結果 同じ函数を Lua から実行する。 local g = 9.80665 local l1 = 1 local m1 = 1 local l2 = 1 local m2 = 1 local tstart = 0 local tstop = 0.06 local ini_theta1 = 1 local ini_v1 = 0 local ini_theta…
二重振子も Lua スクリプトでアニメ化するが、これ↓を math.eval() 函数の引数として Lua スクリプトに記述するのは相当難儀である。 よって Nspire 側でユーザー定義函数にまとめることにする。 引数は左から重力加速度、、、、、スタート時間、ストップ時…
2 つの重りをちょうど下の図の位置に持ってきてそこでパッと手を放す。 横軸が時間、縦軸が角度である。 動きは非常に不規則である。 6.2 秒あたりで が pi を超えている。すなわち往復ではなく回転したということである。 今度は初期条件を少し変えてみる。…
運動方程式は下のとおりである。m は質量、v は角速度、a は角加速度である。(1) Nspire の組込函数 solve() を使って加速度 a について解く。(2) 下のように解ける。(3) 今度は θ' = v θ'' = v' = a と置き換えて一階の連立に直す。(4) これで rk23…
↓ これを Nspire + Lua + ルンゲクッタ法で再現してみる。Pendulum Waves - YouTube Nspire + Lua 版: function on.resize() w = platform.window:width() h = platform.window:height() center = {x = w/2, y = w/80} -- 振子の支点を設定 radius = h/18 -…
振子の棒の長さをリアルタイムに変えられるようにした。 タイミングをうまく合わせると、しだいに振幅が大きくなって、しまいには廻り始める。 function on.resize() w = platform.window:width() -- 画面幅を取得 h = platform.window:height() -- 画面高さ…
下の連立方程式を解く。速度に比例する空気抵抗の項を -k*vel として加える。 棒の長さは 1〔m〕。 係数 k は分からないのでひとまず 0.2 とした。 初期角度は π(鉄棒に倒立しているイメージ)。 初速は 6〔rad/s〕。横軸を角度 θ、縦軸を速度 vel(= θ') …
トンデミーナはだいたいこんな感じ:youtu.be local w = platform.window:width() -- 画面幅を取得 local h = platform.window:height() -- 画面高さを取得 local center = {x = w/2, y = h/2} -- 画面中央座標 local length = 0.9 * h/2 -- 画面上の棒の長…
Nspire での実行結果: 上と同じ計算を Lua から実行する: local g = 9.80665 --重力加速度 local length = 1 -- 棒の長さ local tMin = 0 -- スタート時間 local tMax = 2 -- ストップ時間 local angleInit = 1 -- 角度初期値 local velInit = 0 -- 角速度…
下の微分方程式の近似解を rk23() で求める。 1 階の連立に直してから解く。 θ' = vel vel' = θ'' = (-g/l)*sin(θ) {0, 2} は t の振り幅。 {1, 0} は、1 が θ の初期値、0 が vel の初期値。 0.5 は t の刻み幅。 1.E-10 は error tolerance。 出力された行…
周期は次式で求まる。初期角 θ0 = 3.139〔rad〕で計算した。 カシオの高精度計算サイトには専用のページが用意されている。 wolfram にも同様のページがある。
θ = 0.1〔rad〕の位置へ分銅を持ってきて、そこでパッと手を放したときのようすをルンゲクッタ法の近似解でグラフにしてみる。 横軸が時間、縦軸が θ である。 振子の棒の長さを 1〔m〕にしているので、周期(行って戻ってくるまでの時間)は理科の実験で習…
L は棒の長さ、g は重力加速度、m は分銅の質量。 接線方向の力と加速度との関係から下の運動方程式が導ける。t が時間、θ が角度、θ' が角速度、θ'' が角加速度。 両辺を m*l で割ると下のようになる。 この微分方程式の厳密解を求める。 θ = の形では解け…