読者です 読者をやめる 読者になる 読者になる

振子の運動

振り子の支点を振り回す 4 of 4

-- では振り子の支点に加速度をかけて振り回してみる timerTicking = false cursor.set("drag grab") screenW = platform.window:width() screenH = platform.window:height() unitLen = screenW/4 -- 1メートルの、画面上での画素数 posTwoAgoX = 0 posTwoA…

振り子の支点を振り回す 3

--[[ とりあえず支点は固定したまま振り子を振ってみる。 スクリプトのフローは下の 3 行を繰り返すだけである。 ★1. 「今の状態」を描画する。 ★2. タイマーが tick したら「今の状態」を読み込んで「Δt 時間後の状態」を計算する。 ★3. その「Δt 時間後の…

振り子の支点を振り回す 2

lua から呼びやすいよう、nspire のユーザー定義函数にまとめる。 減衰係数 c は、参考文献と同じく 0.1 とする。rk23() の精度は指定しない(デフォルト値を使う)。 重りの x 座標、y 座標も nspire 側で計算してしまうことにする。 引数は (棒の長さ, 支…

振り子の支点を振り回す 1

支点の自由に動かせる振り子を考える。x 軸、y 軸の取りかたは参考文献と逆にした。 は角加速度。 は支点の x 軸方向の加速度。 は支点の y 軸方向の加速度。 は角速度。 -c * は摩擦や空気抵抗などもろもろを合わせた減衰項。係数 c は決めようがないので…

(34)二重振子 6(Nspire による二重振子シミュレーター)

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…

(33)二重振子 5(二重振子をアニメ化する)

確認のためとりあえず棒だけ描いた。節と先端とにある質点は描いていない。 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…

(32)二重振子 4(前回作った、Nspire のユーザー定義函数を Lua から実行する)

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…

(31)二重振子 3(アニメ化の準備として Nspire 側でユーザー定義函数を作る)

二重振子も Lua スクリプトでアニメ化するが、これ↓を math.eval() 函数の引数として Lua スクリプトに記述するのは相当難儀である。 よって Nspire 側でユーザー定義函数にまとめることにする。 引数は左から重力加速度、、、、、スタート時間、ストップ時…

(30)二重振子 2(Graphs アプリケーションで近似解を直接描画する)

2 つの重りをちょうど下の図の位置に持ってきてそこでパッと手を放す。 横軸が時間、縦軸が角度である。 動きは非常に不規則である。 6.2 秒あたりで が pi を超えている。すなわち往復ではなく回転したということである。 今度は初期条件を少し変えてみる。…

(29)二重振子 1(rk23() が適用できる形に運動方程式を変形する)

運動方程式は下のとおりである。m は質量、v は角速度、a は角加速度である。(1) Nspire の組込函数 solve() を使って加速度 a について解く。(2) 下のように解ける。(3) 今度は θ' = v θ'' = v' = a と置き換えて一階の連立に直す。(4) これで rk23…

(28)振子の運動 9(pendulum waves)

↓ これを 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 -…

(27)振子の運動 8(ブランコ、parametric excitation)

振子の棒の長さをリアルタイムに変えられるようにした。 タイミングをうまく合わせると、しだいに振幅が大きくなって、しまいには廻り始める。 function on.resize() w = platform.window:width() -- 画面幅を取得 h = platform.window:height() -- 画面高さ…

(26)振子の運動 7(空気抵抗を加味する。初速をつける。)

下の連立方程式を解く。速度に比例する空気抵抗の項を -k*vel として加える。 棒の長さは 1〔m〕。 係数 k は分からないのでひとまず 0.2 とした。 初期角度は π(鉄棒に倒立しているイメージ)。 初速は 6〔rad/s〕。横軸を角度 θ、縦軸を速度 vel(= θ') …

(25)振子の運動 6(アニメ化)

トンデミーナはだいたいこんな感じ: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 -- 画面上の棒の長…

(24)振子の運動 5(rk23() を Lua から実行する)

Nspire での実行結果: 上と同じ計算を Lua から実行する: local g = 9.80665 --重力加速度 local length = 1 -- 棒の長さ local tMin = 0 -- スタート時間 local tMax = 2 -- ストップ時間 local angleInit = 1 -- 角度初期値 local velInit = 0 -- 角速度…

(23)振子の運動 4(rk23() で近似解を求める)

下の微分方程式の近似解を rk23() で求める。 1 階の連立に直してから解く。 θ' = vel vel' = θ'' = (-g/l)*sin(θ) {0, 2} は t の振り幅。 {1, 0} は、1 が θ の初期値、0 が vel の初期値。 0.5 は t の刻み幅。 1.E-10 は error tolerance。 出力された行…

(22)振子の運動 3(周期の計算)

周期は次式で求まる。初期角 θ0 = 3.139〔rad〕で計算した。 カシオの高精度計算サイトには専用のページが用意されている。 wolfram にも同様のページがある。

(21)振子の運動 2(等時性の破れ)

θ = 0.1〔rad〕の位置へ分銅を持ってきて、そこでパッと手を放したときのようすをルンゲクッタ法の近似解でグラフにしてみる。 横軸が時間、縦軸が θ である。 振子の棒の長さを 1〔m〕にしているので、周期(行って戻ってくるまでの時間)は理科の実験で習…

(20)振子の運動 1

L は棒の長さ、g は重力加速度、m は分銅の質量。 接線方向の力と加速度との関係から下の運動方程式が導ける。t が時間、θ が角度、θ' が角速度、θ'' が角加速度。 両辺を m*l で割ると下のようになる。 この微分方程式の厳密解を求める。 θ = の形では解け…