; wolves and rabbits
(define (zip . xss) (apply map list xss))
(define (wolves-rabbits init-rabbit rabbit-growth rabbit-death
init-wolf wolf-growth wolf-death limit)
(let loop ((ts (list 0)) (rs (list init-rabbit)) (ws (list init-wolf)))
(if (= (car ts) limit)
(apply zip (map reverse (list ts rs ws)))
(let* ((rabbit-deriv
(- (* rabbit-growth (car rs))
(* rabbit-death (car rs) (car ws))))
(wolf-deriv
(- (* wolf-growth (car ws) (car rs))
(* wolf-death (car ws))))
(rabbit-half
(+ (car rs) (/ rabbit-deriv 2)))
(wolf-half
(+ (car ws) (/ wolf-deriv 2)))
(rabbit-half-deriv
(- (* rabbit-growth rabbit-half)
(* rabbit-death rabbit-half wolf-half)))
(wolf-half-deriv
(- (* wolf-growth wolf-half rabbit-half)
(* wolf-death wolf-half))))
(loop (cons (+ (car ts) 1) ts)
(cons (+ (car rs) rabbit-half-deriv) rs)
(cons (+ (car ws) wolf-half-deriv) ws))))))
(for-each
(lambda (x) (display x) (newline))
(wolves-rabbits 40 0.1 0.01 15 0.005 0.1 200))