#lang racket
(require plot/no-gui)
(define enumerate
(case-lambda
((seq) (enumerate seq 0))
((seq start) (map (lambda (x y)
(cons x y))
(range start (+ (length seq) start))
seq))))
(define seq
(case-lambda
((a b d x0 y0)
(define s
(stream-cons (vector x0 y0)
(stream-map (match-lambda
((vector x y)
(vector (+ (* a x) (* b y)
(/ d (add1 (expt x 2))))
(- x))))
s)))
s)
((a)
(seq a 0.9 15 1 0))))
(define (transpose pos ksx ksy)
(match-let (((vector x y) pos))
(let
((coef
(/ 1 (sqrt 2)))) (vector (* coef (+ x y) ksx)
(* coef (+ (- x) y) ksy)))))
(define (chaos a ksx ksy)
(stream-map (lambda (pos)
(transpose pos ksx ksy))
(seq a)))
(define *data*
'((-0.15 0.96 1.04)
(-0.32 0.92 1.08)
(-0.70 0.81 1.16)
(-1.09 0.67 1.24)
(-1.47 0.51 1.32)
(-1.66 0.41 1.35)))
(module+ main
(parameterize ((plot-x-label #f)
(plot-y-label #f))
(for-each (match-lambda
(`(,i ,a ,ksx ,ksy)
(plot-file
(points
(stream->list
(stream-take
(chaos a ksx ksy)
60000)))
(format "./chaos~a.png" i))))
(enumerate *data*))))
I2xhbmcgcmFja2V0CgoocmVxdWlyZSBwbG90L25vLWd1aSkKCihkZWZpbmUgZW51bWVyYXRlCiAgKGNhc2UtbGFtYmRhCiAgICAoKHNlcSkgKGVudW1lcmF0ZSBzZXEgMCkpCiAgICAoKHNlcSBzdGFydCkgKG1hcCAobGFtYmRhICh4IHkpCiAgICAgICAgICAgICAgICAgICAgICAgIChjb25zIHggeSkpCiAgICAgICAgICAgICAgICAgICAgICAocmFuZ2Ugc3RhcnQgKCsgKGxlbmd0aCBzZXEpIHN0YXJ0KSkKICAgICAgICAgICAgICAgICAgICAgIHNlcSkpKSkKCihkZWZpbmUgc2VxCiAgKGNhc2UtbGFtYmRhCiAgICAoKGEgYiBkIHgwIHkwKQogICAgIChkZWZpbmUgcwogICAgICAgKHN0cmVhbS1jb25zICh2ZWN0b3IgeDAgeTApCiAgICAgICAgICAgICAgICAgICAgKHN0cmVhbS1tYXAgKG1hdGNoLWxhbWJkYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh2ZWN0b3IgeCB5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZWN0b3IgKCsgKCogYSB4KSAoKiBiIHkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLyBkIChhZGQxIChleHB0IHggMikpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtIHgpKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcykpKQogICAgIHMpCiAgICAoKGEpCiAgICAgKHNlcSBhIDAuOSAxNSAxIDApKSkpCgooZGVmaW5lICh0cmFuc3Bvc2UgcG9zIGtzeCBrc3kpCiAgKG1hdGNoLWxldCAoKCh2ZWN0b3IgeCB5KSBwb3MpKQogICAgKGxldCAoKGNvZWYgKC8gMSAoc3FydCAyKSkpKQogICAgICAodmVjdG9yICgqIGNvZWYgKCsgeCB5KSBrc3gpCiAgICAgICAgICAgICAgKCogY29lZiAoKyAoLSB4KSB5KSBrc3kpKSkpKQoKKGRlZmluZSAoY2hhb3MgYSBrc3gga3N5KQogIChzdHJlYW0tbWFwIChsYW1iZGEgKHBvcykKICAgICAgICAgICAgICAgICh0cmFuc3Bvc2UgcG9zIGtzeCBrc3kpKQogICAgICAgICAgICAgIChzZXEgYSkpKQoKKGRlZmluZSAqZGF0YSoKICAnKCgtMC4xNSAwLjk2IDEuMDQpCiAgICAoLTAuMzIgMC45MiAxLjA4KQogICAgKC0wLjcwIDAuODEgMS4xNikKICAgICgtMS4wOSAwLjY3IDEuMjQpCiAgICAoLTEuNDcgMC41MSAxLjMyKQogICAgKC0xLjY2IDAuNDEgMS4zNSkpKQoKKG1vZHVsZSsgbWFpbgogIChwYXJhbWV0ZXJpemUgKChwbG90LXgtbGFiZWwgI2YpCiAgICAgICAgICAgICAgICAgKHBsb3QteS1sYWJlbCAjZikpCiAgICAoZm9yLWVhY2ggKG1hdGNoLWxhbWJkYQogICAgICAgICAgICAgICAgKGAoLGkgLGEgLGtzeCAsa3N5KQogICAgICAgICAgICAgICAgIChwbG90LWZpbGUKICAgICAgICAgICAgICAgICAgKHBvaW50cwogICAgICAgICAgICAgICAgICAgKHN0cmVhbS0+bGlzdAogICAgICAgICAgICAgICAgICAgIChzdHJlYW0tdGFrZQogICAgICAgICAgICAgICAgICAgICAoY2hhb3MgYSBrc3gga3N5KQogICAgICAgICAgICAgICAgICAgICA2MDAwMCkpKQogICAgICAgICAgICAgICAgICAoZm9ybWF0ICIuL2NoYW9zfmEucG5nIiBpKSkpKQogICAgICAgICAgICAgIChlbnVtZXJhdGUgKmRhdGEqKSkpKQo=