Egy vulkáni kitörés összetett fizikai folyamat (magma áramlása, gázok terjedése), így a modellezéséhez a Python nyelvben leggyakrabban a numpy és matplotlib csomagokat alkalmazzák a numerikus számításokhoz és az eredmények vizualizációjához.Az alábbi Python szkript egy Tokajhoz hasonló rétegvulkán kitörését szimulálja: lemodellezi a láva terjedését a gravitáció és a domborzat hatására, valamint a vulkáni hamu szélirány szerinti szóródását.
--------------
import numpy as np
import matplotlib.pyplot as plt
def simulacio_vulkan(grid_size=100, kitoresi_intenzitas=500):
# 1. Alapvető paraméterek és domborzat (Magassági mátrix)
# A kráter a mátrix közepén helyezkedik el
domborzat = np.zeros((grid_size, grid_size))
for i in range(grid_size):
for j in range(grid_size):
tav_kozponttol = np.sqrt((i - grid_size/2)**2 + (j - grid_size/2)**2)
# Egy kúp alakú hegy létrehozása (Tokaji-hegyek jellege)
domborzat[i, j] = 500 - tav_kozponttol * 10
if domborzat[i, j] < 0: domborzat[i, j] = 0
# 2. Láva szimuláció (egyszerűsített celluláris automata)
lava = np.zeros((grid_size, grid_size))
krat_x, krat_y = grid_size // 2, grid_size // 2
lava[krat_x, krat_y] = kitoresi_intenzitas
# Láva terjedése a lejtőn lefelé
for _ in range(20): # Szimulációs lépések
uj_lava = lava.copy()
for x in range(1, grid_size-1):
for y in range(1, grid_size-1):
if lava[x, y] > 0:
szomszedok = [
(x+1, y), (x-1, y), (x, y+1), (x, y-1)
]
for sx, sy in szomszedok:
if domborzat[sx, sy] < domborzat[x, y]:
atadas = lava[x, y] * 0.1
uj_lava[x, y] -= atadas
uj_lava[sx, sy] += atadas
lava = uj_lava
# 3. Hamuszórás szimuláció (Gauss-eloszlás a szélirány alapján)
# Tegyük fel, hogy a szél észak-keleti irányba fúj (Tokaj felé)
hamu = np.zeros((grid_size, grid_size))
szel_irany_x = 5
szel_irany_y = 5
for x in range(grid_size):
for y in range(grid_size):
# Távolság a krátertől szélirányban
dx = x - (krat_x + szel_irany_x)
dy = y - (krat_y + szel_irany_y)
tavolsag = np.sqrt(dx**2 + dy**2)
# Hamu vastagságának csökkenése távolsággal
hamu[x, y] = max(0, 1000 - tavolsag * 20)
# 4. Eredmények vizualizációja
fig, ax = plt.subplots(1, 2, figsize=(12, 6))
# Láva megjelenítése
im1 = ax[0].imshow(lava, cmap='hot', origin='lower')
ax[0].set_title("Láva terjedési modell")
ax[0].set_xlabel("X koordináta (km)")
ax[0].set_ylabel("Y koordináta (km)")
fig.colorbar(im1, ax=ax[0], label='Láva vastagság (m)')
# Hamu szóródás megjelenítése
im2 = ax[1].imshow(hamu, cmap='Greys', origin='lower')
ax[1].set_title("Vulkáni hamu lerakódás (Szélirány: ÉK)")
ax[1].set_xlabel("X koordináta (km)")
ax[1].set_ylabel("Y koordináta (km)")
fig.colorbar(im2, ax=ax[1], label='Hamu vastagság (mm)')
plt.tight_layout()
plt.show()
simulacio_vulkan()
---------------------
Mit csinál a program?
A simulacio_vulkan() függvény 4 fő lépést hajt végre:
Domborzat létrehozása
Láva terjedésének szimulálása
Hamu lerakódásának modellezése
Eredmények vizualizálása
A végén meghívja:
simulacio_vulkan()
1) Domborzat létrehozása
domborzat = np.zeros((grid_size, grid_size))
Ez egy grid_size x grid_size méretű mátrix, alapból 0-val feltöltve.
Ezután minden cellára kiszámolja a középponttól való távolságot:
tav_kozponttol = np.sqrt((i - grid_size/2)**2 + (j - grid_size/2)**2)
Majd ehhez rendeli a magasságot:
domborzat[i, j] = 500 - tav_kozponttol * 10
Tehát:
középen magas
kifelé haladva egyre alacsonyabb
ha negatív lenne, 0-ra állítja
Ez gyakorlatilag egy kúpszerű hegyet készít.
Megjegyzés
A komment szerint „Tokaji-hegyek jellege”, de valójában ez csak egy általános kúpmodell, nem valós topográfia.
2) Láva szimuláció
lava = np.zeros((grid_size, grid_size))
krat_x, krat_y = grid_size // 2, grid_size // 2
lava[krat_x, krat_y] = kitoresi_intenzitas
A kráter a rács közepére kerül, és oda kerül a kezdeti lávamennyiség.
Terjedési logika
A program 20 lépésen keresztül szimulálja a terjedést:
for _ in range(20):
Minden aktív cellánál megvizsgálja a 4 szomszédot:
szomszedok = [(x+1, y), (x-1, y), (x, y+1), (x, y-1)]
Ha a szomszéd alacsonyabban van, mint az aktuális cella:
if domborzat[sx, sy] < domborzat[x, y]:
akkor a láva 10%-át átadja:
atadas = lava[x, y] * 0.1
uj_lava[x, y] -= atadas
uj_lava[sx, sy] += atadas
Fontos viselkedés
Ez azt modellezi, hogy a láva lefelé folyik a lejtőn.
Probléma
A modell egyszerűsége miatt:
egy cella több szomszédnak is adhat ugyanabban a körben
a láva gyorsan eloszlik
nem szerepel viszkozitás, hűlés, megszilárdulás
Ez inkább demonstrációs modell, nem fizikai szimuláció.
3) Hamu szóródás
hamu = np.zeros((grid_size, grid_size))
szel_irany_x = 5
szel_irany_y = 5
Itt feltételezi, hogy a szél észak-keleti irányba fúj.
Ezután minden cellára kiszámolja a krátertől való távolságot a szélirány eltolásával:
dx = x - (krat_x + szel_irany_x)
dy = y - (krat_y + szel_irany_y)
tavolsag = np.sqrt(dx**2 + dy**2)
hamu[x, y] = max(0, 1000 - tavolsag * 20)
Mit jelent ez?
a középponthoz közeli területeken vastagabb hamu
távolabb vékonyabb
a szélirány miatt az eloszlás eltolódik
Megjegyzés
Ez nem valódi légköri modell, hanem egy egyszerű Gauss-szerű lecsengés.
4) Vizualizáció
A program két ábrát rajzol:
Láva
im1 = ax[0].imshow(lava, cmap='hot', origin='lower')
hot színskála
alulról induló koordináta-rendszer
Hamu
im2 = ax[1].imshow(hamu, cmap='Greys', origin='lower')
szürke színskála
világosabb/sötétebb területek mutatják a vastagságot
A colorbar segít az értékek értelmezésében.
Erősségek
Egyszerűen érthető
Jól szemlélteti a rácsalapú modellezést
Szép vizualizációt ad
Jó demonstráció arra, hogyan lehet természeti jelenséget modellezni
Gyengeségek
1. Nem fizikai pontosságú
A láva terjedése túl egyszerű:
nincs hőmérséklet
nincs viszkozitás
nincs megszilárdulás
nincs térfogatmegmaradás
2. A hamu szóródás mesterséges
A szélirány csak egy eltolás:
nincs turbulencia
nincs légköri rétegződés
nincs valós terjedési modell
3. A domborzat statikus
A vulkán kitörése nem változtatja meg érdemben a hegy formáját.
4. A kód lassú lehet nagy rácsnál
Két egymásba ágyazott ciklus van több helyen, ami nagyobb grid_size esetén lassú.
Technikai megfigyelések
Importok
import numpy as np
import matplotlib.pyplot as plt
Ezek megfelelőek, nincs hiányzó import.
Paraméterek
A függvény paraméterei:
def simulacio_vulkan(grid_size=100, kitoresi_intenzitas=500):
Ez jó, mert könnyen állítható.
Szintaxis
A kód alapvetően szintaktikailag helyes.
Összegzés
Ez egy szemléltető, oktatási célú vulkánmodell, generál egy kúpszerű domborzatot,
indít egy láva-terjedést a középpontból, létrehoz egy egyszerű hamu-lerakódási mintát,
Nincsenek megjegyzések:
Megjegyzés küldése