51 lines
1.6 KiB
Text
51 lines
1.6 KiB
Text
|
|
let mp6 = -. (3.1416 /. 6.)
|
|
let g = 9.80665
|
|
let l = 0.2
|
|
|
|
let pi0 = mp6
|
|
let pi1 = 0.
|
|
let pi2 = 0.
|
|
|
|
let acc x = -. g /. l *. (sin x)
|
|
|
|
let hybrid cradle2() =
|
|
let rec der p0 = v0 init pi0 reset h01 -> last p1
|
|
and der v0 = acc(p0) init 0.0 reset h01 -> last v1
|
|
and der p1 = v1 init pi1 reset h01 -> last p0
|
|
and der v1 = acc(p1) init 0.0 reset h01 -> last v0
|
|
and h01 = up(last p0 -. last p1)
|
|
and init h = -0.1
|
|
and present h01 -> do h = -1.0 *. last h done
|
|
else do der h = 0.0 done
|
|
in (h, (p0, v0 /. 10.) , (p1, v1 /. 10.))
|
|
|
|
let hybrid cradle3() =
|
|
let rec der p0 = v0 init pi0 reset h01 -> last p1
|
|
and der v0 = acc(p0) init 0.0 reset h01 -> last v1
|
|
and der p1 = v1 init pi1 reset h01 -> last p0 | h12 -> last p2
|
|
and der v1 = acc(p1) init 0.0 reset h01 -> last v0 | h12 -> last v2
|
|
and der p2 = v2 init pi2 reset h12 -> last p1
|
|
and der v2 = acc(p2) init 0.0 reset h12 -> last v1
|
|
and h01 = up(last p0 -. last p1)
|
|
and h12 = up(last p1 -. last p2)
|
|
and init h1 = -0.1
|
|
and present h01 -> do h1 = -1.0 *. last h1 done else do der h1 = 0.0 done
|
|
and init h2 = -0.1
|
|
and present h12 -> do h2 = -1.0 *. last h2 done else do der h2 = 0.0 done
|
|
in (p0, p1, p2, h1, h2)
|
|
|
|
let node print(v, s) =
|
|
Format.printf "% .10e%s" v s
|
|
|
|
let hybrid main() =
|
|
let der t = 1.0 init 0.0 in
|
|
let (p0, p1, p2, h1, h2) = cradle3() in
|
|
present (period(0.05)) -> (
|
|
print(t, "\t");
|
|
print(p0, "\t");
|
|
print(p1, "\t");
|
|
print(p2, "\t");
|
|
print(h1, "\t");
|
|
print(h2, "\n")
|
|
); ()
|