仮想計算機構

ブログのひとこと説明 ※ブログ名の近くに表示されます

Schemeで複素関数の可視化

複素関数の可視化

以下のサイトを参考にしつつ、複素関数を可視化。生成する画像は今までどおりbmp形式のもの。プログラムも以前書いたものを利用します。

プログラム

(include "grBMP.scm")
(include "color.scm")
(include "window.scm")

(define (f x y)
    (letrec ((z (+ x (* y 0+1i))))
        z
        ;;;(sin z)
        ;;;(log z)
        ;;;(exp z)
        ;;;(expt z z)
        ;;;(sinh z)
        ;;;(* z z z)
        ;;;(exp (/ 1.0 z))
    )
)

(define min_x -10.0)
(define min_y -10.0)
(define max_x 10.0)
(define max_y 10.0)

(define points_x 400)
(define points_y 400)
(define r (/ 180 3.1415926))

(define dx (/ (- max_x min_x) points_x))
(define dy (/ (- max_y min_y) points_y))

(do
    ((i 0 (+ i 1)))
    ((>= i points_x))
    (do
        ((j 0 (+ j 1)))
        ((>= j points_y))
        (letrec ((x (+ min_x (* i dx))) 
                (y (+ min_y (* j dy))) 
                (z (f x y))
                (h (* r (atan (imag-part z) (real-part z)))))
            (gr_dot (+ i 1) (+ j 1) (hsl-to-rgb h 1.0 0.5))
        )
    )
)
(gr_BMP "test.bmp")

実行結果

デフォルトで640 x 400ピクセルの画像が生成されるので右端の方が余っています。

f(z)=z

f:id:riverta1992:20200603083047j:plain

f(z)=z^2

f:id:riverta1992:20200603083123j:plain

f(z)=z^3

f:id:riverta1992:20200603083226j:plain

f(z)=sin(z)

f:id:riverta1992:20200603083300j:plain

f(z)=sinh(z)

f:id:riverta1992:20200603084814j:plain

f(z)=log(z)

f:id:riverta1992:20200603084827j:plain

f(z)=e^z

f:id:riverta1992:20200603084846j:plain

f(z)=e^{\frac{1}{z}}

ただし\ Re(z)\in[-1,1],Img(z)\in[-1,1]
f:id:riverta1992:20200603223152j:plain

f(z)=z^z

f:id:riverta1992:20200603084900j:plain