The Butterfly Effect, formulated in 1972 by mathematician and meteorologist Edward Lorenz, is part of chaos theory that illustrates the interdependence between seemingly insignificant events and large-scale phenomena. Contrary to common belief, chaos is not random but deterministic and highly sensitive to initial conditions, with well-defined boundaries. Using Lorenz’s attractor, it is possible to simulate and visualize this effect through a system of differential equations that represents the complexity and interconnectedness of the world. Chaos theory goes beyond the simple image of a butterfly flapping its wings, providing a profound understanding of nature and the universe through the beauty and complexity of the fundamental laws of mathematics and physics.
L’Effetto Farfalla è una metafora che ha catturato l’immaginazione del pubblico fin dalla sua prima formulazione nel 1972 da parte del matematico e meteorologo Edward Lorenz. Ma cosa significa davvero questa enigmatica frase, “… una farfalla che sbatte le ali in Brasile potrebbe scatenare un tornado in Texas”? E come possiamo sviscerare gli errori comuni che avvolgono questa affascinante idea?
L’Effetto Farfalla: Un’Introduzione
La descrizione dell’Effetto Farfalla fa parte di quella che viene comunemente chiamata teoria del caos. Il concetto può essere inteso come un segno dell’interdipendenza di eventi apparentemente insignificanti e fenomeni su larga scala, ma ci sono due importanti distinzioni che spesso vengono trascurate nella cultura popolare:
- Il Caos non è Casuale: Contrariamente alla credenza comune, il termine “caotico” in questo contesto non significa “casuale”. Il caos è deterministico e segue regole precise, ma è altamente sensibile alle condizioni iniziali. Una piccola variazione nelle condizioni di partenza può portare a risultati radicalmente diversi.
- Il Futuro non è Completamente Non-Deterministico: L’Effetto Farfalla non significa che qualsiasi cosa possa succedere in qualsiasi momento. Ci sono limiti ben definiti entro i quali i fenomeni possono variare.
Il Codice: Simulando l’Effetto Farfalla
from scipy.integrate import odeint
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import glob
import os
save_folder = 'images/lorenz'
if not os.path.exists(save_folder):
os.makedirs(save_folder)
initial_state = [0.5, 0, 0]
sigma = 10
rho = 28
beta = 8/3
start_time = 1
end_time = 80
interval = 1000
time_points = np.linspace(start_time, end_time, end_time * interval)
def lorenz_system(current_state, t):
x, y, z = current_state
xdot = sigma * (y - x)
ydot = x * (rho - z) - y
zdot = x * y - beta * z
return [xdot, ydot, zdot]
def plot_lorenz(xyz, interval, save_folder):
for n in range(0, len(xyz), interval):
fig = plt.figure(figsize=(12, 9))
ax = fig.add_subplot(111, projection='3d')
x = xyz[:n, 0]
y = xyz[:n, 1]
z = xyz[:n, 2]
ax.plot(x, y, z, color='purple', alpha=0.7, linewidth=0.7)
ax.set_xlim((-30, 30))
ax.set_ylim((-30, 30))
ax.set_zlim((0, 50))
plt.savefig(f'{save_folder}/{n:03d}.png', dpi=60, bbox_inches='tight', pad_inches=0.1)
plt.close()
# Risolvi l'ODE su tutti i punti temporali
points = odeint(lorenz_system, initial_state, time_points)
# Chiama la funzione modificata
plot_interval = 20 # Puoi regolare l'intervallo come preferisci
plot_lorenz(points, interval=plot_interval, save_folder=save_folder)
standard_duration = 10 # Durata uniforme
durations = [standard_duration] * (len(points) // plot_interval)
image_filenames = sorted(glob.glob('{}/*.png'.format(save_folder)), key=lambda x: int(x.split('/')[-1].split('.')[0]))
images = [Image.open(image) for image in image_filenames]
gif_filepath = 'images/animated-lorenz-attractor.gif'
# Set duration for each image
for i, image in enumerate(images[1:]):
image.info['duration'] = durations[i]
# Save the images as a GIF
images[0].save(fp=gif_filepath, format='gif', save_all=True, append_images=images[1:], loop=0)
Attraverso il codice fornito, possiamo simulare e visualizzare l’Effetto Farfalla utilizzando l’attrattore di Lorenz, un sistema di equazioni differenziali. Ecco come il codice funziona:
1. Definire le Condizioni Iniziali
Prima di tutto, impostiamo le condizioni iniziali del sistema, come le costanti \(\sigma\), \(\rho\), e \(\beta\), e lo stato iniziale delle variabili \(x\), \(y\), e \(z\):
initial_state = [0.5, 0, 0]
sigma = 10
rho = 28
beta = 8/3
2. Creare il Sistema di Equazioni
Il cuore della simulazione è un sistema di equazioni differenziali che descrive il comportamento del sistema nel tempo:
def lorenz_system(current_state, t):
x, y, z = current_state
xdot = sigma * (y - x)
ydot = x * (rho - z) - y
zdot = x * y - beta * z
return [xdot, ydot, zdot]
3. Risolvere il Sistema
Utilizziamo la funzione odeint
da SciPy per risolvere il sistema di equazioni nel tempo, ottenendo una traiettoria che mostra come il sistema evolve:
points = odeint(lorenz_system, initial_state, time_points)
4. Visualizzare i Risultati
Infine, possiamo visualizzare i risultati utilizzando Matplotlib, creando una rappresentazione grafica tridimensionale dell’evoluzione del sistema:
plot_lorenz(points, interval=plot_interval, save_folder=save_folder)
Conclusione
L’Effetto Farfalla è un potente promemoria della complessità e dell’interconnessione del mondo che ci circonda. Non è un concetto di puro caso o anarchia, ma piuttosto una descrizione della natura intrinsecamente imprevedibile e sensibile di sistemi complessi.
La teoria del caos e l’Effetto Farfalla offrono una lente attraverso cui possiamo esplorare concetti profondi come la determinazione, la casualità, e la connettività. E attraverso la simulazione e la visualizzazione, possiamo iniziare a toccare con mano la bellezza e la complessità che emergono dalle leggi fondamentali della matematica e della fisica.
Mentre il nome “teoria del caos” potrebbe aver contribuito a malintesi, la realtà è che offre una profonda comprensione della natura e dell’universo, una comprensione che va ben oltre la semplice immagine di una farfalla che sbatte le ali.