Be Cloudy or Clear?(October 03, 2005) で紹介されているローレンツのアトラクタを近似的に計算するプログラムを改変してみました:
#!/usr/bin/env gosh
(define (lorenz n dt)
(let loop ((x 0.0)
(y 0.0001)
(z 0.0)
(i 0))
(cond ((= i n)
'())
(else
(format #t "~d\t~d\t~d~%" x y z)
(let ((dx (* (+ (- (* 10.0 x)) (* 10.0 y)) dt))
(dy (* (+ (* 28.0 x) (- y) (- (* x z))) dt))
(dz (* (+ (- (* (/ 8.0 3.0) z)) (* x y)) dt)))
(loop (+ x dx) (+ y dy) (+ z dz) (+ i 1)))))))
(define (main args)
(lorenz 5000 0.01)
0)
上の図は出力を gnuplot によって描画したものです。
Scheme 処理系 gosh で2つのプログラムのパフォーマンスの比較を行いました:
$ time gosh attractor1.scm > /dev/null # original
real 0m0.598s
user 0m0.590s
sys 0m0.010s
$ time gosh attractor2.scm > /dev/null # modified
real 0m0.583s
user 0m0.580s
sys 0m0.000s
この結果を見る限りあまり差がないようです。プロットする点を増やしてみると(例えば 5000 -> 50000)、改変したプログラムの方がより短い時間で処理を終えます。