fixedpoint.jp


2006/10/15

ローレンツのアトラクタ

Lorenz's attractor

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)、改変したプログラムの方がより短い時間で処理を終えます。


© 2006-2023 fixedpoint.jp