C コードでマンデルブロー集合を作成しようとしています。私の出力は、Argandまたは複素平面にプロットされる実部の1列と虚部の1列のデータファイルになります。私はヘッダーで定義されたすべての複雑な数学のものを持っており、実部と虚部に acomplex.h
を持つ構造を使用しています。dz のトラフ値をループし、z iter=80 回、またはポイントが定義された半径の外側に来るまで更新しようとしています。dz は虚数であり、本質的に範囲 [(dzrmin + i*dzimin), (dzrmax +i*dzimax)] にあります。z は現在の複素数で、z^2 = dz + z として更新されます。2 つの複素数を合計する関数と、複素数を適切に 2 乗する関数があります。ここに私のコード全体がありますcomplex
double R
double I
csum()
csquare()
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "complex.h"
int main(void)
{
double dzrmin, dzrmax, dzimin, dzimax, dzr,dzi, r0,i0, maxrad;
int i,j,k,iter, Ndr,Ndi;
complex z, dz;
dzrmin = -2.1;
dzrmax = 0.6;
dzimin = -1.2;
dzimax = 1.2;
Ndr = 200 ;
Ndi = 180;
dzr = (dzrmax - dzrmin)/Ndr;
dzi = (dzimax - dzimin)/Ndi;
r0 = 0.0;
i0 = 0.0;
z.R = r0;
z.I = i0;
dz.R = dzrmin;
dz.I = dzimin;
maxrad = 2.0;
iter = 80 ;
for(i = 0; i < Ndr; i++ )
{
for(j = 0; j < Ndi; j++ )
{
for(k = 0; k< iter; k++ )
{
printf("%.6lf %.6lf\n", z.R, z.I );
z = csum( csquare( z ), dz ) ;
if( cmag(z) > maxrad) k = iter ;
}
dz.I += dzi ;
}
dz.R += dzr;
z.R = r0;
z.I = i0;
}
return 0;
}
そして私のヘッダーファイルcomplex.h
#include <stdlib.h>
#include <math.h>
typedef struct complexnumber{ double R; double I ; } complex ;
double cmag( complex z)
{
return pow( z.R*z.R + z.I*z.I, 0.5 ) ;
}
complex csquare( complex z ) //returns square of a complex
{
complex product ;
product.R = z.R*z.R - z.I*z.I ;
product.I = 2*z.R*z.I ;
return product ;
}
complex csum( complex z1, complex z2) // sums two complex numbers
{
complex sum ;
sum.R = z1.R + z2.R ;
sum.I = z1.I + z2.I;
return sum ;
}
私はいくつかの実数値を取得しています。それらは非常に急速に大きくなり、半径 2 の外側にあり、多くの実部-nan
と虚部が続きます-nan
。私が欠けているものに関する提案はありますか?