Ricerca Operativa

Corso avanzato su studio di poliedri e problemi su grafi con massimo flusso.

Vari Snippet

Abbiamo implementato questi snippet di codice python per facilitare lo studio e comprendere a livello pratico e grafico alcuni aspetti del corso. Eseguire i codici con python3 file.py e controllare di avere tutte le librerie necessarie installate.

Distanza tra due punti

Codice che calcola e disegna la distanza tra due punti su un piano.

import numpy as np
import matplotlib.pyplot as plt

# Definizione dei punti
x = np.array([3, 4])
y = np.array([0, 0])

# Calcolo della distanza euclidea
distance = np.linalg.norm(x - y)
print(f"Distanza tra {x} e {y}: {distance}")

# Creazione del grafico
plt.figure(figsize=(6,6))
plt.scatter([x[0], y[0]], [x[1], y[1]], color=['red', 'blue'], label='Punti')
plt.plot([x[0], y[0]], [x[1], y[1]], 'k--', label=f'Distanza = {distance:.2f}')

# Annotazioni
plt.text(x[0], x[1], f'  x{tuple(x)}', fontsize=12, verticalalignment='bottom')
plt.text(y[0], y[1], f'  y{tuple(y)}', fontsize=12, verticalalignment='top')

# Configurazione assi
plt.xlim(-1, 5)
plt.ylim(-1, 5)
plt.axhline(0, color='black', linewidth=0.5)
plt.axvline(0, color='black', linewidth=0.5)
plt.grid(True, linestyle='--', linewidth=0.5)
plt.legend()
plt.title("Distanza Euclidea tra due punti in R2")

# Mostra il grafico
plt.show()

Norma (Prodotto Scalare)

Codice che calcola la norma con il prodotto scalare tra vettore e scalare.

import numpy as np
import matplotlib.pyplot as plt

# Definiamo un vettore v
v = np.array([3, 2])

# Definiamo un valore per alpha
alpha = 2

# Calcoliamo il vettore alpha * v
v_alpha = alpha * v

# Calcoliamo le norme dei vettori
norm_v = np.linalg.norm(v)
norm_v_alpha = np.linalg.norm(v_alpha)

# Visualizziamo i vettori v e alpha * v
plt.quiver(0, 0, v[0], v[1], angles='xy', scale_units='xy', scale=1, color='blue', label="v", width=0.005) # width modifica la larghezza
plt.quiver(0, 0, v_alpha[0], v_alpha[1], angles='xy', scale_units='xy', scale=1, color='red', label="α * v", width=0.002) # width modifica la larghezza

# Aggiungiamo le etichette delle norme
plt.text(v[0]/2, v[1]/2, f"||v|| = {norm_v:.2f}", fontsize=12, color='blue')
plt.text(v_alpha[0]/2, v_alpha[1]/2, f"||α * v|| = {norm_v_alpha:.2f}", fontsize=12, color='red')

# Impostiamo i limiti per una visualizzazione migliore
plt.xlim(-1, 7)
plt.ylim(-1, 7)
plt.axhline(0, color='black',linewidth=0.5)
plt.axvline(0, color='black',linewidth=0.5)

# Aggiungiamo la legenda
plt.legend()

# Mostriamo il grafico
plt.gca().set_aspect('equal', adjustable='box')
plt.grid(True)
plt.show()

Disuguaglianza Triagolare (Vettori)

Codice che calcola la disuguaglianza trangolare tra vettori.

import numpy as np
import matplotlib.pyplot as plt

# Definizione dei vettori
x = np.array([3, 2])  # Vettore x
y = np.array([-1, 3])  # Vettore y
sum_xy = x + y  # Somma dei vettori

# Creazione del grafico
fig, ax = plt.subplots()
ax.set_xlim(-2, 5)
ax.set_ylim(-1, 5)
ax.set_aspect('equal')

# Disegna i vettori
ax.quiver(0, 0, x[0], x[1], angles='xy', scale_units='xy', scale=1, color='blue', label='x')
ax.quiver(x[0], x[1], y[0], y[1], angles='xy', scale_units='xy', scale=1, color='green', label='y')
ax.quiver(0, 0, sum_xy[0], sum_xy[1], angles='xy', scale_units='xy', scale=1, color='purple', label='x + y')

# Aggiunge annotazioni
ax.text(x[0]/2, x[1]/2, 'x', fontsize=12, color='blue', verticalalignment='bottom')
ax.text(x[0] + y[0]/2, x[1] + y[1]/2, 'y', fontsize=12, color='green', verticalalignment='bottom')
ax.text(sum_xy[0]/2, sum_xy[1]/2, 'x + y', fontsize=12, color='purple', verticalalignment='bottom')

# Linee per il triangolo
ax.plot([0, x[0], sum_xy[0]], [0, x[1], sum_xy[1]], 'b--')
ax.plot([x[0], sum_xy[0]], [x[1], sum_xy[1]], 'g--')

# Titolo e griglia
ax.set_title("Disuguaglianza Triangolare per Vettori")
ax.grid()

# Mostra il grafico
plt.show()

Coniche piane

Visualizzazione grafica di circonferenze ed ellissi nel piano cartesiano.

import numpy as np
import matplotlib.pyplot as plt

def plot_circle(ax, h, k, r, label):
    theta = np.linspace(0, 2*np.pi, 300)
    x = h + r * np.cos(theta)
    y = k + r * np.sin(theta)
    ax.plot(x, y, label=label)

def plot_ellipse(ax, h, k, a, b, label):
    theta = np.linspace(0, 2*np.pi, 300)
    x = h + a * np.cos(theta)
    y = k + b * np.sin(theta)
    ax.plot(x, y, label=label)

fig, ax = plt.subplots(figsize=(8, 8))
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.axhline(0, color='black', linewidth=0.5)
ax.axvline(0, color='black', linewidth=0.5)
ax.grid(True, linestyle='--', linewidth=0.5)
ax.set_xlim(-3, 5)
ax.set_ylim(-3, 5)

# 1. Circonferenza x^2 + y^2 = 1
plot_circle(ax, 0, 0, 1, "x^2 + y^2 = 1")

# 2. Circonferenza (x - 2)^2 + (y - 3)^2 = 1
plot_circle(ax, 2, 3, 1, "(x - 2)^2 + (y - 3)^2 = 1")

# 3. Ellisse 4x^2 + x + 4y^2 = 63/16
x = np.linspace(-2, 2, 400)
y = np.linspace(-2, 2, 400)
X, Y = np.meshgrid(x, y)
Z = 4*X**2 + X + 4*Y**2 - 63/16
ax.contour(X, Y, Z, levels=[0], colors='r', label="4x^2 + x + 4y^2 = 63/16")

# 4. Ellisse 4x^2 + y^2 = 1
plot_ellipse(ax, 0, 0, 1/2, 1, "4x^2 + y^2 = 1")

# 5. Conica x^2 + 16y^2 - 8y = 0 -> Completamento quadrato su y
Y_shifted = np.linspace(-2, 2, 400)
X = np.sqrt(1 - 16*(Y_shifted - 1/2)**2)
ax.plot(X, Y_shifted, 'g', label="x^2 + 16y^2 - 8y = 0")
ax.plot(-X, Y_shifted, 'g')

ax.legend()
plt.show()

Vettori scalati

Rappresentazione grafica di un vettore moltiplicato per scalari.

import numpy as np
import matplotlib.pyplot as plt

# Definiamo un vettore v
v = np.array([3, 2])

# Calcoliamo i vettori per diversi valori di alfa
alpha_values = [-2, 0, 2]  # alfa < 0, alfa = 0, alfa > 0

# Crea una figura per il grafico
plt.figure(figsize=(8, 8))

# Visualizza ogni caso
for alpha in alpha_values:
    # Calcoliamo il vettore alpha * v
    v_alpha = alpha * v
    # Calcoliamo la norma
    norm_v = np.linalg.norm(v)
    norm_v_alpha = np.linalg.norm(v_alpha)
    
    # Aggiungiamo i vettori al grafico
    color = 'blue' if alpha < 0 else 'red' if alpha > 0 else 'green'
    label = f"α = {alpha}"
    plt.quiver(0, 0, v_alpha[0], v_alpha[1], angles='xy', scale_units='xy', scale=1, color=color, label=label, width=0.005)

    # Aggiungiamo le etichette delle norme
    plt.text(v_alpha[0]/2, v_alpha[1]/2, f"||α * v|| = {norm_v_alpha:.2f}", fontsize=12, color=color)

# Visualizzare il vettore originale v (sempre blu)
plt.quiver(0, 0, v[0], v[1], angles='xy', scale_units='xy', scale=1, color='black', label="v", width=0.005)

# Aggiungiamo i limiti per una visualizzazione migliore
plt.xlim(-7, 7)
plt.ylim(-7, 7)
plt.axhline(0, color='black',linewidth=0.5)
plt.axvline(0, color='black',linewidth=0.5)

# Aggiungiamo la legenda
plt.legend()

# Mostriamo il grafico
plt.gca().set_aspect('equal', adjustable='box')
plt.grid(True)
plt.title("Vettori per diversi valori di α")
plt.show()

Settimana 1: Introduzione

Definizioni Generali.

Settimana 2-3: PM

Programmazione Matematica.

Settimana 4: Convessità

Problemi Convessi.

Settimana 5: PL

Programmazione Lineare.

Dispense Aggiornate

Nuove dispense del corso aggiornate all'anno 2025.

Vedi file

Vecchie Dispense

Vecchie dispense dell'università La Sapienza, Roma.

Vedi File

My Exam

Esame superato con 26/30.

Vedi Esame

Lezioni

Esami Passati

Esami 2018

4 Esami disponibili

Esami 2019

4 Esami disponibili

Esami 2020

4 Esami disponibili

Esami 2021

4 Esami disponibili

Esami 2022

4 Esami disponibili

Esami 2023

4 Esami disponibili

Esami 2024

3 Esami disponibili

Esami 2025

2 Esami disponibili