let epsilon = 0.0001 let input _ = () let hybrid sincos() = let rec der sin = cos init 0.0 and der cos = -. sin init 1.0 in (sin, cos) let sincos_ode45 = Solve.solve_ode45(sincos) let sincos_sundials = Solve.solve_sundials(sincos) let sincos_both = Solve.synchr(sincos_ode45)(sincos_sundials) let hybrid ball () = let rec der y = y' init 50.0 reset z -> 0.0 and der y' = -9.81 init 0.0 reset z -> -0.8 *. (last y') and z = up(-. y) in y let ball_ode45 = Solve.solve_ode45(ball) let ball_sundials = Solve.solve_sundials(ball) let ball_both = Solve.synchr(ball_ode45)(ball_sundials) let node print_ball_both (now, (y1, y2)) = print_float(now); print_string("\t"); print_float(y1); print_string("\t"); print_float(y2); print_string("\n"); () let node print_sincos (now, (sin, cos)) = print_float now; print_string "\t"; print_float sin; print_string "\t"; print_float cos; print_string "\n" let node print_sincos2 (now, ((sin1, cos1), (sin2, cos2))) = print_float now; print_string "\t"; print_float sin1; print_string "\t"; print_float sin2; print_string "\t"; print_float cos1; print_string "\t"; print_float cos2; print_string "\n" let node check_sincos (now, (sin, cos)) = print_sincos (now, (sin, cos)); sin <= 1.0 +. epsilon && sin >= -1.0 -. epsilon && cos <= 1.0 +. epsilon && cos >= -1.0 -. epsilon let node check_sincos2 (now, ((sin1, cos1), (sin2, cos2))) = print_sincos2 (now, ((sin1, cos1), (sin2, cos2))); sin1 <= 1.0 +. epsilon && sin1 >= -1.0 -. epsilon && cos1 <= 1.0 +. epsilon && cos1 >= -1.0 -. epsilon && sin2 <= 1.0 +. epsilon && sin2 >= -1.0 -. epsilon && cos2 <= 1.0 +. epsilon && cos2 >= -1.0 -. epsilon let node main() = let input = Some (Solve.make (30.0, input)) fby None in let o = run sincos_sundials input in Solve.check_t 100 check_sincos o