#lang scheme
(require (planet "ode-initval.ss" ("williams" "science.plt")))
(require (lib "plot.ss" "plot"))
(define (func t y f params)
(let ((y0 (vector-ref y 0)))
(vector-set!
f 0
(* (- 1500.0 (vector-ref y 0)) 0.12))))
(define (main)
(let* ((type rk4-ode-type)
(step (make-ode-step type 1))
(control #f) (evolve (make-ode-evolve 1))
(system (make-ode-system func #f 1 '()))
(t (box 0.0))
(t1 20.0)
(h (box (/ 1.0 60.0)))
(y (vector 150.0))
(y0-values '()))
(let loop ()
(when (< (unbox t) t1)
(begin
(ode-evolve-apply
evolve control step system
t t1 h y)
(set! y0-values (cons (vector (unbox t) (vector-ref y 0)) y0-values))
(loop))))
(printf "Number of iterations = ~a~n" (ode-evolve-count evolve))
(printf "Number of failed steps = ~a~n" (ode-evolve-failed-steps evolve))
(printf "~a~n" (plot (points (reverse y0-values))
(x-min 0.0)
(x-max 20.0)
(x-label "Time")
(y-min 0.0)
(y-max 1500.0)
(y-label "Temperature")
(title "Ingot Temperature over Time")))
))
(main)