MATLAB è il linguaggio che incontri prima a ingegneria, e Simulink è quasi sempre il modo in cui ti vengono chiesti i progetti di controlli, segnali, dinamica e modellistica. Eppure, in molti corsi del Politecnico, la prima ora di lezione è “ecco MATLAB, andate al lab” — e gli studenti si trovano a inseguire una sintassi che non è quella di Python e una logica vettoriale che non è quella del C.
Quello che segue è il percorso che faccio fare ai miei studenti — dalla matricola fino agli esami più “pesanti” tipo Controlli Automatici o Sistemi Lineari — per arrivare all’esame con MATLAB e Simulink solidi, non improvvisati.
Nota di metodo, se stai leggendo questo post a settembre: il corso è appena iniziato o sta per iniziare, e l’esame è nella sessione invernale, a gennaio. Il modo per non arrivarci impreparato non è “ripassare tutto a dicembre”: è scrivere codice ogni settimana, anche poco, da subito. MATLAB si dimentica in fretta se lo tocchi solo agli appelli di laboratorio — è un linguaggio che si mantiene con la pratica costante, non con il ripasso finale.
Il livello “matricola”: MATLAB come calcolatrice scientifica
Se sei al primo anno e MATLAB è apparso in un corso di calcolo numerico o di algoritmi, ti basta un sottoinsieme molto ridotto del linguaggio:
- Variabili, vettori, matrici (e capire bene la differenza fra
A * BeA .* B). - Operatori
:per creare range (x = 0:0.1:2*pi). - Plot di base (
plot,subplot,figure,xlabel, legend), ehold on/hold off. - Strutture di controllo (
if,for,while) — sintassi diversa da C/Python, occhio agliend. - Funzioni in file
.mseparati e differenza fra script e function.
Non serve OOP, non serve struct, non servono i toolbox. La cosa importante a questo livello è capire che MATLAB pensa per matrici: ogni volta che scrivi un for su un vettore, probabilmente c’è un’operazione vettoriale equivalente che è 10x più veloce e più leggibile.
Tipica trappola da matricola: fare un ciclo for i=1:n per calcolare y(i) = sin(x(i)) invece di scrivere y = sin(x) direttamente. MATLAB applica le funzioni elementwise sui vettori senza che tu debba dirglielo.
Il livello “intermedio”: script ben fatti, debugging, plot leggibili
Dal secondo anno in poi gli esercizi MATLAB iniziano a essere più strutturati: scrivi una funzione che prende parametri, restituisce risultati, magari produce un grafico decente. A questo punto serve:
- Function vs script: la function ha il proprio workspace, lo script no. Capire la differenza evita mille bug “perché la variabile è cambiata”.
- Default arguments e nargin:
narginti dice quanti argomenti sono stati passati e ti permette di scrivere funzioni che accettano parametri opzionali. - Debugging interattivo:
keyboardper fermarti dentro una funzione, breakpoint nell’editor,dbstop if errorper rompere automaticamente al primo errore. - Plot leggibili:
LineWidth,MarkerSize,set(gca, 'FontSize', ...),axis equalquando serve. Un grafico illeggibile in un report ti costa punti, e basta poco per renderlo professionale. - Vectorization sistematica:
bsxfun,arrayfun,meshgrid,repmat. Sapere che esistono ti fa risparmiare ore di for loops.
Il livello “controlli & segnali”: Simulink + toolbox
Quando arrivi ai corsi di Controlli Automatici, Sistemi Lineari, Dinamica, Identificazione, Filtri Digitali, MATLAB diventa il mezzo per usare i toolbox. La sintassi MATLAB pura conta meno: contano i toolbox.
I toolbox che vedo usare di più dai miei studenti:
- Control System Toolbox:
tf,ss,step,impulse,bode,nyquist,pid,pidtune,lqr,place. Tutto quello che serve per progetto di controllore lineare. - System Identification Toolbox:
iddata,arx,armax,n4sid, identificazione da dati. - Signal Processing Toolbox:
fft,filter,butter,cheby1,freqz,spectrogram. - Symbolic Math Toolbox: per quando il prof vuole derivate e integrali simbolici dentro MATLAB (
syms,diff,int,simplify).
A questo livello, Simulink entra in gioco quasi ovunque:
- Modellazione: trascini blocchi (Sum, Gain, Integrator, Transfer Fcn, Saturation, Scope) su un foglio e li colleghi.
- Simulazione: lanci la simulazione, gli scope mostrano l’andamento dei segnali.
- Tuning: PID Tuner integrato per chiudere il loop di controllo, o LQR via codice MATLAB chiamato da una callback.
- Code generation (raro a livello di esame, comune in tesi): generi C dal modello Simulink per microcontrollori.
Vettorizzazione: lo stesso calcolo, due modi diversi di scriverlo
Torno su questo punto con un esempio concreto perché è l’abitudine che distingue uno script “da matricola” da uno “da laboratorio avanzato”, e perché è la stessa richiesta che i correttori dei corsi di Calcolo Numerico e di Controlli fanno più spesso: “non usare un for dove non serve”.
Versione con ciclo for (funziona, ma è la versione da evitare quando il vettore è grande e il codice va scritto per un report):
n = 100000;
x = linspace(0, 10, n);
y = zeros(1, n);
for i = 1:n
y(i) = sin(x(i))^2 + cos(x(i));
end
Versione vettorizzata (stesso identico risultato, riga per riga confrontabile con l’originale):
x = linspace(0, 10, n);
y = sin(x).^2 + cos(x);
Cosa cambia, in pratica:
- Leggibilità: la seconda versione si legge come la formula matematica che rappresenta, la prima è un’implementazione manuale della stessa cosa.
- Velocità: MATLAB è ottimizzato internamente per le operazioni su vettori e matrici; un ciclo
forche itera elemento per elemento è quasi sempre più lento, e la differenza cresce con la dimensione del vettore. - Meno spazio per bug: niente indice
ida inizializzare, incrementare e usare correttamente — una fonte tipica di errori “off by one” quando si passa da un linguaggio a zero-based come Python o C.
La regola pratica che do ai miei studenti: se stai scrivendo for i = 1:length(x) e dentro al ciclo c’è solo un’operazione elementwise (+, -, .*, ./, .^, oppure funzioni come sin, exp, sqrt), quasi certamente puoi toglierlo. Il for resta necessario quando ogni iterazione dipende dal risultato della precedente (es. simulazioni passo-passo, ricorsioni), che è un caso diverso e genuinamente non vettorizzabile.
Errori che vedo più spesso
-
Confondere matrici e elementwise.
A * Bè prodotto matriciale,A .* Bè prodotto elementwise. Sembra ovvio, ma è la causa #1 di errori dimensionali nei progetti. -
Indici da 1. MATLAB indicizza da 1, non da 0 come Python o C. Quando passi codice da uno all’altro, fai attenzione:
x(1)è il primo elemento, non lo zero-th. -
Variabili globali come hack. Se ti trovi a scrivere
globalin più di una funzione, c’è quasi sempre un design migliore (function handle, struct con i parametri, classe). -
Plot senza unità di misura e legenda. Banale ma costa punti in tutti i corsi di laboratorio. Sempre
xlabel,ylabelcon unità tra parentesi, sempre legend se ci sono più curve. -
In Simulink, scope come unica forma di output. Lo scope è ottimo per debug interattivo ma per il report serve esportare i dati in workspace (block “To Workspace”) e fare il plot in MATLAB con stile decente.
-
Tunare PID a occhio in Simulink. Funziona per sistemi semplici, ma per esami di Controlli Automatici è meglio progettare via Bode/luogo delle radici e poi verificare in Simulink. Il prof se ne accorge.
Tempistiche realistiche
- Da zero a esame del primo anno (calcolo numerico tipo): 4-6 lezioni per consolidare la sintassi e fare gli esercizi del laboratorio.
- Esame intermedio (Controlli Automatici, Sistemi e Segnali): 8-12 lezioni distribuite tra MATLAB puro e Simulink. Si parte dai concetti di controllo (continuo o discreto?), si simula in Simulink, si verifica analiticamente in MATLAB.
- Progetto di tesi che usa MATLAB: variabile. In genere uno studente ben preparato usa il tutor per “sbloccare” momenti specifici (un toolbox nuovo, un debug pesante) più che per imparare da zero.
Come lavoriamo nelle lezioni
Le lezioni di MATLAB vanno fatte in live coding condiviso. Apriamo MATLAB su un lato della finestra, l’editor sull’altro, e scriviamo codice insieme: io spiego una struttura, tu la modifichi, io ti faccio sbagliare apposta in modo controllato per vedere cosa ti dice il debugger.
Per Simulink, la stessa cosa: trascini blocchi, simuli, leggiamo lo scope, sistemiamo. Il modello finale lo scrivi tu, ma costruito insieme.
Spesso lavoriamo direttamente sui tuoi materiali del corso (slide del prof, esercitazioni, prova d’esame degli anni passati): è il modo più veloce per essere preparato proprio per quell’esame, non per “MATLAB in generale”.
Vedi anche la pagina dedicata alle ripetizioni di informatica con tutto il programma che seguo (MATLAB, Simulink, Python, C, web development con React). Se un progetto Simulink o un esame di Controlli ti si è impuntato, scrivimi: guardiamo insieme il codice o il modello e troviamo dove si blocca.
Se in parallelo hai gli esami di analisi e algebra lineare, trovi le simulazioni d’esame universitarie di analisi 1, analisi 2 e algebra lineare, nel formato dell’esame. Per la complessità degli algoritmi, che nei corsi di programmazione si incrocia con MATLAB, c’è il post su notazione O grande.
Per approfondire
- Se nello stesso semestre hai anche un esame di basi di dati: basi di dati, schema ER e relazionale, SQL per l’esame.
- Se vieni da un corso di C e la logica a puntatori ti confonde: puntatori e memoria in C spiegati bene.
- Se stai iniziando anche Python da zero: programmazione Python da zero per studenti.
- Per l’algebra lineare che sta dietro a buona parte dei toolbox di controllo: algebra lineare: rango, nucleo e immagine per l’esame.
- Per gli esami di Calcolo Numerico o Metodi Numerici: calcolo numerico: l’esame di metodi numerici.