新しく発言する EXIT インデックスへ
!修正、2重振り子

  !修正、2重振り子 SECOND 2006/12/16 08:17:59 
  !更新。エネルギー・メーターで検査する。 SECOND 2006/12/17 01:23:11 
   └!続く SECOND 2006/12/17 01:24:39 

  !修正、2重振り子 SECOND 2006/12/16 08:17:59  ツリーへ

!修正、2重振り子 返事を書く
SECOND 2006/12/16 08:17:59
!修正、2重振り子
! ルンゲ・クッタ法 部分を、修正した。

LET g=9.8
LET m1=0.005
LET m2=0.005
LET L1=1
LET L2=1

!------------ 2重振り子の方程式
! d(dθ1)/dt^2=
! [ g*{sinθ2*cosΔ-μ*sinθ1}-{L2*(θ2/dt)^2+L1*(θ1/dt)^2*cosΔ}*sinΔ]
!          /[ L1*{μ-cosΔ^2}]
! d(dθ2)/dt^2=
! [ g*μ*{sinθ1*cosΔ-sinθ2}+{μ*L1*(θ1/dt)^2+L2*(θ2/dt)^2*cosΔ}*sinΔ]
!          /[ L2*{μ-cosΔ^2}]

! g= 重力加速度 μ=(m1+m2)/m2 Δ=θ1-θ2

!---------- 上式と同一。
LET μ2=m2/(m1+m2)
LET L21=L2/L1

!ss1=-g/L1*sinθ1 -μ2*L21*ω2^2*sinΔ
!ss2=-g/L2*sinθ2 +    ω1^2*sinΔ/L21
!D=1-μ2*COSΔ^2
!d(θ1)/dt=ω1
!d(θ2)/dt=ω2
!d(ω1)/dt=[      ss1 - L21*μ2*cosΔ*ss2 ] /D
!d(ω2)/dt=[ -cosΔ/L21*ss1 +        ss2 ] /D

!---------- 式は解けないまま、ルンゲ・クッタ法で描画。
LET θ1=PI*0.8 !初期角度
LET θ2=PI*0.8
LET w1=0 !初期角速度
LET w2=0

DEF ss1(w2,θ1,θ2)=-g/L1*SIN(θ1) -μ2*L21*w2^2*SIN(θ1-θ2)
DEF ss2(w1,θ1,θ2)=-g/L2*SIN(θ2) + w1^2*SIN(θ1-θ2)/L21
DEF D(θ1,θ2)=1-μ2*COS(θ1-θ2)^2

DEF α1(w1,w2,θ1,θ2)=( ss1(w2,θ1,θ2) -L21*μ2*COS(θ1-θ2)*ss2(w1,θ1,θ2) )/D(θ1,θ2)
DEF α2(w1,w2,θ1,θ2)=(-ss1(w2,θ1,θ2)*COS(θ1-θ2)/L21 +ss2(w1,θ1,θ2) )/D(θ1,θ2)

LET dt=0.02

SUB 次次角度
LET w11=w1
LET w12=w2
LET α11=α1(w1,w2,θ1,θ2)
LET α12=α2(w1,w2,θ1,θ2)
LET w21=w1+α11*dt/2
LET w22=w2+α12*dt/2
LET α21=α1(w1+α11*dt/2,w2+α12*dt/2,θ1+w11*dt/2,θ2+w12*dt/2)
LET α22=α2(w1+α11*dt/2,w2+α12*dt/2,θ1+w11*dt/2,θ2+w12*dt/2)
LET w31=w1+α21*dt/2
LET w32=w2+α22*dt/2
LET α31=α1(w1+α21*dt/2,w2+α22*dt/2,θ1+w21*dt/2,θ2+w22*dt/2)
LET α32=α2(w1+α21*dt/2,w2+α22*dt/2,θ1+w21*dt/2,θ2+w22*dt/2)
LET w41=w1+α31*dt
LET w42=w2+α32*dt
LET α41=α1(w1+α31*dt,w2+α32*dt,θ1+w31*dt,θ2+w32*dt)
LET α42=α2(w1+α31*dt,w2+α32*dt,θ1+w31*dt,θ2+w32*dt)
LET ww1=(w11+2*w21+2*w31+w41)/6
LET ww2=(w12+2*w22+2*w32+w42)/6
LET aa1=(α11+2*α21+2*α31+α41)/6
LET aa2=(α12+2*α22+2*α32+α42)/6

LET θ1=θ1+ww1*dt
LET θ2=θ2+ww2*dt
LET w1= w1+aa1*dt
LET w2= w2+aa2*dt
END SUB

!----run
LET w=3
SET WINDOW -w,w,-w,w
LET r1=SQR(m1)
LET r2=SQR(m2)
LET tb=999
LET t0=TIME
DO
LET t=(TIME-t0)
IF t<>tb THEN
LET tb=t
SET DRAW mode hidden
CLEAR
PLOT TEXT,AT w*0.25,w*0.9:"マウス 右ボタンで、終了。"
DRAW 振子0 WITH ROTATE(θ1)*SHIFT(x,y)
CALL 次次角度
SET DRAW mode explicit
!stop
END IF
WAIT DELAY 0.01
MOUSE POLL mx,my,mlb,mrb !マウスの状態取得。
LOOP UNTIL mrb=1

PICTURE 振子0
DRAW circle WITH SCALE(w/80)
DRAW 振子1(L1,r1)
DRAW 振子1(L2,r2) WITH ROTATE(θ2-θ1)*SHIFT(0,-L1)
END PICTURE

PICTURE 振子1(L,r)
PLOT LINES: 0,0;0,-L
DRAW disk WITH SCALE(r)*SHIFT(0,-L)
END PICTURE

END

  !更新。エネルギー・メーターで検査する。 SECOND 2006/12/17 01:23:11  ツリーへ

Re: !修正、2重振り子 返事を書く
SECOND 2006/12/17 01:23:11
!更新。エネルギー・メーターで検査する。
!2重振り子特有の下降衝撃時に、全エネルギーが変動する計算エラーが見られる。
!演算ピッチが小さいと、緩和するが、低速パソコンでは、描画ピッチが伴わない。

!----2重振り子のカオス
LET g= 9.8 !m/s^2
LET m1=0.1 !kg
LET m2=0.1 !kg
LET L1= 5 !m
LET L2= 5 !m

LET dt=0.05 !sec. 演算ピッチ。高速パソコンほど、小さく。(0.05は、500MHz)

!※描画ピッチが、ついて来れなくなったら戻す。
! 2つのピッチが、ズレていると物理的な速度ではなくなる。

!------------ 2重振り子の方程式
! d(dθ1)/dt^2=
! [ g*{sinθ2*cosΔ-μ*sinθ1}-{L2*(θ2/dt)^2+L1*(θ1/dt)^2*cosΔ}*sinΔ]
!          /[ L1*{μ-cosΔ^2}]
! d(dθ2)/dt^2=
! [ g*μ*{sinθ1*cosΔ-sinθ2}+{μ*L1*(θ1/dt)^2+L2*(θ2/dt)^2*cosΔ}*sinΔ]
!          /[ L2*{μ-cosΔ^2}]

! g= 重力加速度 μ=(m1+m2)/m2 Δ=θ1-θ2

!---------- 上式と同一。
LET μ2=m2/(m1+m2)
LET L21=L2/L1

!ss1=-g/L1*sinθ1 -μ2*L21*ω2^2*sinΔ
!ss2=-g/L2*sinθ2 +    ω1^2*sinΔ/L21
!D=1-μ2*COSΔ^2
!d(θ1)/dt=ω1
!d(θ2)/dt=ω2
!d(ω1)/dt=[      ss1 - L21*μ2*cosΔ*ss2 ] /D
!d(ω2)/dt=[ -cosΔ/L21*ss1 +        ss2 ] /D

!---------- 式は解けないまま、ルンゲ・クッタ法で描画。
LET θ1=PI*0.8 !初期角度
LET θ2=PI*0.8
LET w1=0 !初期角速度
LET w2=0

DEF ss1(w2,θ1,θ2)=-g/L1*SIN(θ1) -μ2*L21*w2^2*SIN(θ1-θ2)
DEF ss2(w1,θ1,θ2)=-g/L2*SIN(θ2) + w1^2*SIN(θ1-θ2)/L21
DEF D(θ1,θ2)=1-μ2*COS(θ1-θ2)^2

DEF α1(w1,w2,θ1,θ2)=( ss1(w2,θ1,θ2) -L21*μ2*COS(θ1-θ2)*ss2(w1,θ1,θ2) )/D(θ1,θ2)
DEF α2(w1,w2,θ1,θ2)=(-ss1(w2,θ1,θ2)*COS(θ1-θ2)/L21 +ss2(w1,θ1,θ2) )/D(θ1,θ2)

SUB 次次角度
LET w11=w1
LET w12=w2
LET α11=α1(w1,w2,θ1,θ2)
LET α12=α2(w1,w2,θ1,θ2)

LET w21=w1+α11*dt/2
LET w22=w2+α12*dt/2
LET α21=α1(w21,w22,θ1+w11*dt/2,θ2+w12*dt/2)
LET α22=α2(w21,w22,θ1+w11*dt/2,θ2+w12*dt/2)

LET w31=w1+α21*dt/2
LET w32=w2+α22*dt/2
LET α31=α1(w31,w32,θ1+w21*dt/2,θ2+w22*dt/2)
LET α32=α2(w31,w32,θ1+w21*dt/2,θ2+w22*dt/2)

LET w41=w1+α31*dt
LET w42=w2+α32*dt
LET α41=α1(w41,w42,θ1+w31*dt,θ2+w32*dt)
LET α42=α2(w41,w42,θ1+w31*dt,θ2+w32*dt)

LET θ1=θ1+(w11+2*w21+2*w31+w41)*dt/6
LET θ2=θ2+(w12+2*w22+2*w32+w42)*dt/6
LET w1=w1+(α11+2*α21+2*α31+α41)*dt/6
LET w2=w2+(α12+2*α22+2*α32+α42)*dt/6
END SUB

!続く

   └!続く SECOND 2006/12/17 01:24:39  ツリーへ

Re: !更新。エネルギー・メーターで検査する。 返事を書く
SECOND 2006/12/17 01:24:39
!続く

!----エネルギー・メーター
DEF ep1=m1*g*(L1-L1*COS(θ1)) !位置1
DEF em1=(L1*w1)^2*m1/2 !運動1
DEF ep2=m2*g*( (L1-L1*COS(θ1)+L2)-L2*COS(θ2) ) !位置2
DEF em2=( (L1*w1)^2+(L2*w2)^2-2*L1*w1*L2*w2*COS(PI+θ1-θ2) )*m2/2 !運動2

!----run
LET w=15
SET WINDOW -w,w,-w,w
LET r1=SQR(m1)
LET r2=SQR(m2)
LET t0=TIME
DO
LET t=TIME
IF dt=<ABS(t-t0) THEN
SET DRAW mode hidden
CLEAR
PLOT TEXT,AT w*0.25,w*0.9:"マウス 右ボタンで、終了。"
PLOT TEXT,AT -w*0.9,w*0.9:"エネルギー[J]"
PLOT TEXT,AT -w*0.9,w*0.83:"位置1 運動1  位置2 運動2"
PLOT TEXT,AT -w*0.95,w*0.76,USING"##.#### ##.#### ##.#### ##.####":ep1,em1,ep2,em2
PLOT TEXT,AT -w*0.85,w*0.69,USING"##.####     ##.####":ep1+em1,ep2+em2
PLOT TEXT,AT -w*0.61,w*0.62,USING"##.####":ep1+em1+ep2+em2
PLOT TEXT,AT w*0.4,w*0.76,USING"演算ピッチ=#.### 秒":dt
PLOT TEXT,AT w*0.4,w*0.69,USING"描画ピッチ=#.### 秒":t-t0
LET t0=t
DRAW 振子0 WITH ROTATE(θ1)
CALL 次次角度
SET DRAW mode explicit
!stop
END IF
WAIT DELAY 0 !クロック・アップを押える。
MOUSE POLL mx,my,mlb,mrb !マウスの状態取得。
LOOP UNTIL mrb=1

PICTURE 振子0
DRAW circle WITH SCALE(0.2)
DRAW 振子1(L1,r1,"1")
DRAW 振子1(L2,r2,"2") WITH ROTATE(θ2-θ1)*SHIFT(0,-L1)
END PICTURE

PICTURE 振子1(L,r,w$)
PLOT LINES: 0,0;0,-L
DRAW disk WITH SCALE(r)*SHIFT(0,-L)
PLOT TEXT,AT 0, 0.5-L:w$
END PICTURE

END


インデックスへ EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。