Ho pensato a questa analogia, partendo dalle famose equazioni di Navier-Stokes, ambito dinamica dei fluidi, applicare lo stesso concetto ad un modello di traffico di veicoli. Ovvero aumentando la densità (numero veicoli per km) diminuisce la velocità media e viceversa. Partiamo quindi dalle equazioni di continuità (conservazione della massa) e quantità di moto.


Ho quindi creato un programmino in linguaggio Python che inizializza un tratto di strada con valori random (numero di macchine presenti in ogni cella, ad esempio 1 km, o una certa unità di riferimento) e questo è il valore della densità. Per quanto riguarda la velocità, ho deciso di inizializzarla come f(ρ)-1, in particolare quando ρ=max U=min e quando ρ=min U=max. Con andamento lineare quindi risulta U[i]=u_min+rho_min*(u_max-u_min)/(rho_max-rho_min)*(rho_max/Rho[i]-1)
.
Dopodiché ho risolto il problema numerico con un metodo esplicito alle differenze finite, quindi il sistema delle due equazioni differenziali viene risolto ad ogni step. Ho fatto solo cinque iterazioni (T=5) per mostrare i vari grafici, come cambiano ad ogni iterazione. In blu ho mostrato la velocità, in rosso la densità, visualizzazione tramite istogrammi, si vede in modo ben chiaro. Ovviamente è una semplificazione, ma direi che rende l'idea.
Ecco il codice del programma in Python:
#eq.1 conservazione della massa
#eq.2 conservazione del momento
from matplotlib import pyplot as plt
import numpy as np
import random as rd
N=20
T=5
#dt = 1/T
#dx = 1
rho_min=1
rho_max=10
u_min=1
u_max=10
Rho=np.zeros(N)
U=np.zeros(N)
# INIT densità
for i in range(N):
Rho[i]=rd.randint(rho_min,rho_max)
# INIT velocità, andamento lineare U(Rho)=f^-1(Rho)
for i in range(N):
U[i]=u_min+rho_min*(u_max-u_min)/(rho_max-rho_min)*(rho_max/Rho[i]-1)
#creazione istogrammi
fig,ax=plt.subplots(T,1) #T grafici
# LOOP
for k in range(T):
for i in range(N):
if i>0:
Rho[i]+=-1.0/T*Rho[i]*(U[i]-U[i-1])-1.0/T*U[i]*(Rho[i]-Rho[i-1])
U[i]+=U[i]**2*0.5/Rho[i]*(Rho[i]-Rho[i-1])
if U[i]>u_max:
U[i]=u_max
elif U[i]<u_min:
U[i]=u_min
if Rho[i]>rho_max:
Rho[i]=rho_max
elif Rho[i]<rho_min:
Rho[i]=rho_min
ax[k].bar(i,Rho[i],color="red")
ax[k].bar(i,U[i],color="blue")
plt.suptitle("Andamento densità (rosso) e velocità (blu)")
plt.tight_layout() #ottimizza gli spazi
plt.show()
Ecco infine l'immagine:

Cosa ne pensate? Più che altro pensandoci, almeno sui grandi numeri ho trovato l'analogia tra il movimento di un fluido e il flusso di traffico, abbastanza coerente, come modello ci può stare! 🙂