Множество Мандельброта — это увлекательный математический объект, который очаровывал математиков, ученых и художников. Это набор комплексных чисел, которые при итеративном вычислении либо остаются ограниченными, либо уходят в бесконечность. В этой статье мы рассмотрим различные методы создания и визуализации множества Мандельброта с использованием языка программирования R и библиотеки caTools.
Метод 1: базовая итерация
Самый простой способ создания множества Мандельброта — это итерационные вычисления. Вот пример фрагмента кода с использованием библиотеки caTools:
library(caTools)
# Define the dimensions of the fractal image
width <- 800
height <- 800
# Create a blank canvas
canvas <- matrix(0, nrow = height, ncol = width)
# Define the range in the complex plane to explore
real_range <- c(-2.5, 1)
imag_range <- c(-1, 1)
# Iterate over each pixel and determine if it belongs to the Mandelbrot set
for (i in 1:width) {
for (j in 1:height) {
# Map the pixel to a complex number in the specified range
c <- complex(real = map(i, 1, width, real_range),
imaginary = map(j, 1, height, imag_range))
# Perform Mandelbrot iteration
z <- 0
for (k in 1:100) {
z <- z^2 + c
if (abs(z) > 2) {
break
}
}
# Color the pixel based on the number of iterations
canvas[j, i] <- k
}
}
# Display the fractal image
image(canvas, col = heat.colors(100))
Метод 2: параллельная обработка
Чтобы ускорить создание множества Мандельброта, вы можете использовать возможности параллельной обработки библиотеки caTools. Вот пример фрагмента кода:
library(caTools)
library(parallel)
# Define the number of cores to use
num_cores <- detectCores()
# Set up parallel processing
cl <- makeCluster(num_cores)
clusterExport(cl, c("map"))
# Define the dimensions of the fractal image
width <- 800
height <- 800
# Create a blank canvas
canvas <- matrix(0, nrow = height, ncol = width)
# Define the range in the complex plane to explore
real_range <- c(-2.5, 1)
imag_range <- c(-1, 1)
# Define the function for generating a single row of the fractal
generate_row <- function(j) {
row <- matrix(0, nrow = 1, ncol = width)
for (i in 1:width) {
c <- complex(real = map(i, 1, width, real_range),
imaginary = map(j, 1, height, imag_range))
z <- 0
for (k in 1:100) {
z <- z^2 + c
if (abs(z) > 2) {
break
}
}
row[1, i] <- k
}
return(row)
}
# Generate the fractal in parallel
rows <- parLapply(cl, 1:height, generate_row)
for (j in 1:height) {
canvas[j, ] <- rows[[j]]
}
# Stop the parallel cluster
stopCluster(cl)
# Display the fractal image
image(canvas, col = heat.colors(100))
Метод 3: продвинутые методы раскраски
Помимо базовой итерации, вы можете поэкспериментировать с продвинутыми методами раскраски, чтобы повысить визуальную привлекательность множества Мандельброта. Одним из популярных методов является алгоритм плавной окраски. Вот пример фрагмента кода:
library(caTools)
# Define the dimensions of the fractal image
width <- 800
height <- 800
# Create a blank canvas
canvas <- matrix(0, nrow = height, ncol = width)
# Define the range in the complex plane to explore
real_range <- c(-2.5, 1)
imag_range <- c(-1, 1)
# Iterate over each pixel and determine if it belongs to the Mandelbrot set
for (i in 1:width) {
for (j in 1:height) {
c <- complex(real = map(i, 1, width, real_range),
imaginary = map(j, 1, height, imag_range))
z <- 0
for (k in 1:100) {
z <- z^2 + c
if (abs(z) > 2) {
break
}
}
# Apply smooth coloring based on the number of iterations
if (k == 100) {
# Pixel is in the Mandelbrot set
canvas[j, i] <- 0
} else {
# Pixel is outside the Mandelbrot set
log_iter <- k + 1 - log(log(abs(z)) / log(2)) / log(2)
canvas[j, i] <- log_iter
}
}
}
# Display the fractal image
image(canvas, col = terrain.colors(100))
В этой статье мы рассмотрели различные методы создания и визуализации множества Мандельброта с использованием языка программирования R и библиотеки caTools. Мы начали с базового итерационного метода, а затем перешли к более сложным методам, таким как параллельная обработка и усовершенствованные алгоритмы раскраски. Экспериментируя с этими методами и настраивая код, вы можете создавать потрясающие визуальные представления множества Мандельброта. Удачи в изучении бесконечной сложности фракталов!