本稿は、以前投稿した「C言語とgnuplotでマンデルブロ集合を表示する」のCソースの一部を複素数型に変更したものです。
今回は、複素数型の変数を宣言して計算しています。複素数型の変数を使うとCコードがより簡潔になります。
リスト1 mandelblot.c
/* マンデルブロ集合計算プログラム */ #include <stdio.h> #include <math.h> #include <complex.h> #define C0r -0.743 // 計算する場所の中心座標(実数部) #define C0i 0.1145 // 計算する場所の中心座標(虚数部) #define VS 0.003 // 計算する場所の中心座標からの範囲(±VS) #define NMAX 3000 // 計算の繰り返し上限 #define STEP 1600 // 計算する刻み // "Coloring Dynamical Systems in the Complex Plane" // http://math.unipa.it/~grim/Jbarrallo.PDF float mandelbrot(const double complex c) { double complex z; int n; z = c; for (n = 0; n < NMAX; ++n) { // if (cabs(z) > 2) { // より簡潔な記法(ただし遅い) if (creal(z) * creal(z) + cimag(z) * cimag(z) > 4) { return (n - (logf(logf(cabsf(z))) / logf(2))); // 発散 } z = z * z + c; } return 0; // 計算の繰り返し上限到達 } int main() { double a, b; for (a = C0r - VS; a < C0r + VS; a += 2 * VS / STEP) { for (b = C0i - VS; b < C0i + VS; b += 2 * VS / STEP) { printf("%e %e %e\n", a, b, mandelbrot(a + b * I) / NMAX); } printf("\n"); // これがないとgnuplotでエラーが出る } return 0; }
リスト2 png.gnuplot (gnuplot実行スクリプト)
set term png size 900, 900 set output "mandelbrot.png" set grid set pm3d map set size ratio -1 unset colorbox unset key set title 'Mandelbrot set' set xlabel 'Re' set ylabel 'Im' set palette defined (0 "#000000", 1 "#d00000", 5 "#e0e000", 9 "#ffffff") splot "data.txt"
リスト3 コンパイル&実行
$ cc -o mandelbrot -lm -O4 -Wall mandelbrot.c $ ./mandelbrot > data.txt $ gnuplot png.gnuplot
【補足】gnuplotがないと言われる場合は、下記手順でインストールしてください。
# apt update # apt install gnuplot
図1 実行結果(mandelbrot.png)
- 計算する場所はリスト1のdefine文の数値を変えることにより可能です。
- 色の変化をスムーズにするため、下記文献を参考にしました。
- Coloring Dynamical Systems in the Complex Plane
0 件のコメント:
コメントを投稿