Я пытаюсь создать набор Мандельброта в коде C; моим выходом будет файл данных, один столбец реальных частей и один столбец мнимых частей, которые будут нанесены на график в Арганде или комплексной плоскости. У меня есть весь сложный математический материал, определенный в заголовке complex.h
, и я использую структуру complex
с double R
для реальной части и double I
для мнимой. Я пытаюсь зацикливать значения для dz и обновлять z iter = 80 раз или пока точка не окажется за пределами определенного радиуса. dz мнимая, по существу, на диапазоне [(dzrmin + i * dzimin), (dzrmax + i * dzimax)]. z - текущее комплексное число, обновляемое как z^2 = dz + z. У меня есть функция csum()
, чтобы суммировать два комплексных числа и функцию csquare()
, чтобы правильно квадратировать комплексное число. Вот весь мой кодПроблема с созданием Mandelbrot Задание графика в C
#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
. Любые предложения относительно того, чего я не хватает?
Будьте осторожны при использовании '«complex.h»'. Стандарт C99 предоставляет стандартный заголовок '', который может легко привести к путанице. Он также обеспечивает встроенную поддержку сложных типов. –