Skip to content

Instantly share code, notes, and snippets.

@yamasushi
Created July 16, 2012 05:27
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yamasushi/3120796 to your computer and use it in GitHub Desktop.
Save yamasushi/3120796 to your computer and use it in GitHub Desktop.
Gumowski-mira写像の点列生成(gnuplotで描画する)
#!/usr/bin/env gosh
(use gauche.generator)
(use gauche.parseopt)
(use srfi-27) ; 乱数
(use srfi-1) ; list
(define (make-gm-generator a m x0 y0)
(define (f x)
(let1 xx (* x x)
(+ (* m x) (/ (* 2 (- 1 m) xx) (+ 1 xx) ) )
))
(define (make-gm-map a m)
;;
(lambda(xn yn fxn)
(let* [( xn1 (+ yn (* a (- 1 (* 0.05 yn yn) ) yn) fxn ) )
( fxn1 (f xn1) )
( yn1 (- fxn1 xn))]
(values xn1 yn1 fxn1)
)))
(let1 gm-map (make-gm-map a m)
(generate
(lambda (yield)
(let loop [(xn x0) (yn y0) (fxn (f x0) ) ]
(receive (xn1 yn1 fxn1) (gm-map xn yn fxn)
(yield (cons xn yn) )
(loop xn1 yn1 fxn1)
) ) ) ) ) )
(define (main args)
(let-args (cdr args)
[[ ndrop "ndrop=i"]
[ ntake "ntake=i"]
[ ntraj "ntraj=i"]
[ par-a "a=n"]
[ par-m "m=n"]
. args
]
(let* [(make-g (lambda()
(gconcatenate
(apply gmap
($ list->generator $ list $*)
(list-tabulate
ntraj
(lambda (i)
(gtake
(gmap cons
(gdrop
(make-gm-generator
par-a par-m
(- (random-real) 0.5 )
(- (random-real) 0.5 ) )
ndrop)
(grange) ) ntake )
) ) ) ) ) )]
(let1 frame
(let* [(g (make-g))
(p0 (g))]
(generator-fold
(lambda (p minmax)
;#?= minmax
;#?= (cadr minmax)
`(
( ,(min (caar minmax) (caar p) ) . ,(min (cdar minmax) (cdar p) ) )
.
( ,(max (cadr minmax) (caar p) ) . ,(max (cddr minmax) (cdar p) ) ) ) )
`(,(car p0) . ,(car p0) ) g))
;#?= frame
(format #t "~a ~a 0\n" (caar frame) (cdar frame) )
(format #t "~a ~a 0\n" (cadr frame) (cddr frame) )
)
;;
(do-generator (p (make-g) )
(format #t "~a ~a ~a\n" (caar p) (cdar p) (cdr p) )
) ) ) )
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment