Foto del docente

Emanuele Mingione

Associate Professor

Department of Mathematics

Academic discipline: MATH-04/A Mathematical Physics

Useful contents

PLS 2026, Dinamica Hopfield

import numpy as np
import matplotlib.pyplot as plt
import sympy as sp

# -----------------------------
# Parametri
# -----------------------------
N = 20 # numero di neuroni
n = 20 # passi temporali


# -----------------------------
# Matrice w a segni alterni (scacchiera)
# -----------------------------
upper = np.zeros((N, N), dtype=int)

for i in range(N):
for j in range(N):
upper[i, j] = (-1) ** (i + j)

upper = np.triu(upper, k=1)
W = upper + upper.T


# -----------------------------
# Matrice w a segni alterni ogni due passi
# -----------------------------
W = np.fromfunction(
lambda i, j: (-1) ** ((i + j + 1) // 2),
(N, N),
dtype=int
)

np.fill_diagonal(W, 0)


# -----------------------------
# (alternative — commentate)
# -----------------------------

# pesi casuali ±1
# upper = np.random.choice([-1, 1], size=(N, N))
# upper = np.triu(upper, k=1)
# W = upper + upper.T

# pesi gaussiani
# W = np.random.normal(0, 1, size=(N, N))
# np.fill_diagonal(W, 0)


# -----------------------------
# Stampa matrice W
# -----------------------------
print("W =")
print(sp.Matrix(W))


# -----------------------------
# Stato iniziale casuale
# -----------------------------
sigma = np.random.choice([-1, 1], size=N)

print("\nsigma(0) =")
print(sp.Matrix(sigma))


# -----------------------------
# Energia di Hopfield
# -----------------------------
def energy(s, W):
return -0.5 * np.dot(s, np.dot(W, s))


# -----------------------------
# Dinamica di Hopfield
# -----------------------------
energies = []

for t in range(n):

# scegli neurone casuale
i = np.random.randint(N)

# campo efficace
h_i = np.dot(W[i], sigma)

# aggiornamento asincrono
if h_i >= 0:
sigma[i] = 1
else:
sigma[i] = -1

# salva energia
energies.append(energy(sigma, W))


print("\nsigma(n) =")
print(sp.Matrix(sigma))


# -----------------------------
# Plot energia
# -----------------------------
plt.figure()
plt.plot(energies, marker="o")
plt.xlabel("tempo")
plt.ylabel("Energia")
plt.title("Dinamica di Hopfield")
plt.grid(True)
plt.tight_layout()
plt.show()