2026. június 7., vasárnap

Mandelbrot halmaz szimuláció pythonban

A Mandelbrot-halmaz egy síkbeli alakzat, amelyet egy alapvetően nagyon egyszerű algebrai összefüggés bonyolultabb (végtelennel kapcsolatos, analitikus fogalmakat, határértékszámítást igénylő) elemzése ad meg, rajzol ki. Ezeknek az összefüggéseknek a még legegyszerűbb (bár nem az egyetlen lehetséges) megközelítési módja a komplex számok felhasználásával történhet. A Mandelbrot-halmaz a komplex számsíkon ábrázolható alakzat, amely számsík geometriailag semmiben sem különbözik a jól ismert („euklideszi”) síktól, csak a pontok számokkal való leírása más.

-----------------------

import numpy as np
import matplotlib.pyplot as plt

def mandelbrot(h, w, max_iter=256):
    """Létrehozza a Mandelbrot-halmazt numpy tömbként."""
    y, x = np.ogrid[-1.5:1.5:h*1j, -2.5:0.5:w*1j]
    c = x + 1j * y
    z = c
    divtime = max_iter + np.zeros(z.shape, dtype=int)

    for i in range(max_iter):
        z = z**2 + c
        diverge = z * np.conj(z) > 2**2  # Divergencia vizsgálata
        div_now = diverge & (divtime == max_iter)
        divtime[div_now] = i
        z[diverge] = 2  # Megelőzi a túlcsordulást

    return divtime

# A kép felbontása (növelésével szebb, de lassabb lesz a kép)
width, height = 1000, 800
iterations = 100

# Szimuláció futtatása
fraktal = mandelbrot(height, width, max_iter=iterations)

# Látványos megjelenítés
plt.figure(figsize=(10, 8), dpi=150)
plt.imshow(fraktal, extent=[-2.5, 0.5, -1.5, 1.5], cmap='twilight_shifted')
plt.axis('off') # Eltünteti a tengelyeket a látványért
plt.title("Mandelbrot-halmaz", color='white', fontsize=14)

# Háttérszín feketére állítása a szebb kontrasztért
ax = plt.gca()
ax.set_facecolor('black')

plt.show()
---------------
Eredmény;

A Mandelbrot-halmaz körlapjainak és a szatelliták kardiodlapjainak a határciklusai az adott lapra jellemző hosszúságúak. Ezeknek a lapoknak a helye egyértelműen megadja a határciklusok hosszát. Minden körlap érintkezik egy alaptesttel, egy nagyobb körlappal, vagy kardioiddal.

Egy lap határciklusainak hossza megegyezik az ugyanazt az alaptestet érintő két nála nagyobb szomszédos lap határciklusainak hosszának összegével. Ha csak kisebb lapok vannak, akkor az alaptest járul hozzá az összeghez. A leghíresebb próbálkozás a Mandelbulb, egy háromdimenziós szerkezet, amit a térbeli Mandelbrot-halmaznak is neveznek.



import math
import random
from PIL import Image

# K p m rete
imgx = 512
imgy = 512
image = Image.new("RGB", (imgx, imgy))
pixels = image.load()

# Param terek
maxIt = 128  # Maxim lis iter ci s sz m
power = 8    # A Mandelbulb hatv nya

xa = -1.5
xb = 1.5
ya = -1.5
yb = 1.5

# V letlenszer  forgat si sz gek a 3D t r 2D-s lek pez s hez
pi2 = math.pi * 2.0
xy = random.random() * pi2
xz = random.random() * pi2
yz = random.random() * pi2

sxy = math.sin(xy); cxy = math.cos(xy)
sxz = math.sin(xz); cxz = math.cos(xz)
syz = math.sin(yz); cyz = math.cos(yz)

# Iter ci s folyamat
for i in range(imgx):
    for j in range(imgy):
        # Koordin t k normaliz l sa
        x0 = xa + (xb - xa) * i / imgx
        y0 = ya + (yb - ya) * j / imgy
        z0 = 0.0

        # Forgat s a 3D t rben
        # X tengely k r li forgat s
        x1 = x0
        y1 = y0 * cxy - z0 * sxy
        z1 = y0 * sxy + z0 * cxy
        # Y tengely k r li forgat s
        x2 = x1 * cxz + z1 * sxz
        y2 = y1
        z2 = -x1 * sxz + z1 * cxz
        # Z tengely k r li forgat s
        x = x2 * cyz - y2 * syz
        y = x2 * syz + y2 * cyz
        z = z2
        
        cx, cy, cz = x, y, z # Kezd pont (C)
        
        # Mandelbulb iter ci 
        for iteration in range(maxIt):
            r = math.sqrt(x*x + y*y + z*z)
            if r > 2.0:
                # Sz nez s az iter ci k sz ma alapj n
                brightness = int(iteration * 255 / maxIt)
                pixels[i, j] = (brightness, brightness // 4, brightness // 2)
                break
            
            # G mbkoordin t k sz m t sa
            theta = math.atan2(math.sqrt(x*x + y*y), z)
            phi = math.atan2(y, x)
            
            # Hatv nyoz s  s a pont eltol sa
            zr = r ** power
            theta = theta * power
            phi = phi * power
            
            # Vissza a Descartes-koordin tarendszerbe
            x = zr * math.sin(theta) * math.cos(phi) + cx
            y = zr * math.sin(theta) * math.sin(phi) + cy
            z = zr * math.cos(theta) + cz
        else:
            # Ha a pont a halmaz r sze marad
            pixels[i, j] = (0, 0, 0)

# A k p ment se  s megjelen t se
image.save("mandelbulb_cross_section.png")
image.show()
-------------

https://www.online-python.com/pyodide


Nincsenek megjegyzések:

Megjegyzés küldése