Calcolatore Numerico per Esercizi MATLAB
Guida Completa al Calcolo Numerico con MATLAB: Esercizi Svolti e Tecniche di Ripetizione
Il calcolo numerico rappresenta una branca fondamentale della matematica applicata che si occupa di sviluppare algoritmi per approssimare soluzioni di problemi matematici complessi. Quando abbinato a MATLAB, uno dei software più potenti per il computing tecnico, diventa uno strumento indispensabile per ingegneri, fisici e data scientist.
1. Fondamenti del Calcolo Numerico
Prima di addentrarci negli esercizi pratici, è essenziale comprendere i concetti base:
- Errore assoluto e relativo: La differenza tra valore esatto e approssimato (errore assoluto) e la sua proporzione rispetto al valore esatto (errore relativo).
- Condizionamento di un problema: Misura di quanto gli errori sui dati influenzano la soluzione (numero di condizionamento).
- Stabilità degli algoritmi: Capacità di un algoritmo di non amplificare gli errori iniziali.
- Convergenza: Proprietà per cui la soluzione approssimata tende al valore esatto al crescere delle iterazioni.
2. Metodi per la Risoluzione di Equazioni Non Lineari
I metodi iterativi per trovare gli zeri di una funzione f(x) = 0 sono tra gli argomenti più importanti. Analizziamo i principali:
2.1 Metodo di Bisezione
Il metodo più semplice ma robusto, basato sul teorema degli zeri. Richiede che la funzione cambi segno nell’intervallo [a,b].
% Implementazione MATLAB di base
function [c, iter] = bisezione(f, a, b, tol, max_iter)
if f(a)*f(b) >= 0
error('La funzione non cambia segno nell''intervallo')
end
for iter = 1:max_iter
c = (a + b)/2;
if abs(f(c)) < tol
return
end
if f(a)*f(c) < 0
b = c;
else
a = c;
end
end
warning('Raggiunto il numero massimo di iterazioni')
end
2.2 Metodo di Newton-Raphson
Metodo più efficiente (convergenza quadratica) che richiede la derivata della funzione. La formula iterativa è:
xn+1 = xn - f(xn)/f'(xn)
Attenzione: Il metodo di Newton può divergere se la scelta del punto iniziale è inappropriata o se f'(x) = 0 durante le iterazioni. Si consiglia di:
- Visualizzare graficamente la funzione per identificare buoni punti iniziali
- Combinare con il metodo di bisezione per garantire convergenza
- Implementare un controllo sul numero di iterazioni massime
3. Integrazione Numerica
L'integrazione numerica è essenziale quando non esiste una primitiva espressa in forma chiusa. I metodi più utilizzati sono:
| Metodo | Formula | Ordine di Errore | Vantaggi | Svantaggi |
|---|---|---|---|---|
| Regola del Trapezio | ∫f(x)dx ≈ (b-a)/2 [f(a) + f(b)] | O(h²) | Semplice da implementare | Poco accurato per funzioni non lineari |
| Regola di Simpson | ∫f(x)dx ≈ (b-a)/6 [f(a) + 4f((a+b)/2) + f(b)] | O(h⁴) | Molto accurato per funzioni lisce | Richiede n pari di intervalli |
| Quadratura Gaussiana | ∫f(x)dx ≈ Σ wᵢf(xᵢ) | O(h²ⁿ) | Massima precisione con pochi punti | Pesi e nodi non uniformi |
In MATLAB, la funzione integral implementa algoritmi adattivi basati sulla quadratura di Gauss-Kronrod:
% Esempio di integrazione con MATLAB
f = @(x) exp(-x.^2).*sin(x);
Q = integral(f, 0, pi, 'RelTol', 1e-6, 'AbsTol', 1e-10);
fprintf('Integrale calcolato: %.8f\n', Q);
4. Risoluzione di Sistemi Lineari
I metodi diretti (come l'eliminazione di Gauss) e iterativi (Gauss-Seidel, Gradiente Coniugato) sono fondamentali per risolvere sistemi del tipo Ax = b.
4.1 Eliminazione di Gauss
Trasforma la matrice A in una matrice triangolare superiore attraverso operazioni elementari:
- Pivoting parziale per evitare divisioni per zero
- Eliminazione degli elementi sotto la diagonale
- Risoluzione per sostituzione all'indietro
% Implementazione MATLAB
function x = gauss_elimination(A, b)
n = length(b);
% Eliminazione
for k = 1:n-1
for i = k+1:n
factor = A(i,k)/A(k,k);
A(i,k:n) = A(i,k:n) - factor*A(k,k:n);
b(i) = b(i) - factor*b(k);
end
end
% Sostituzione all'indietro
x = zeros(n,1);
x(n) = b(n)/A(n,n);
for i = n-1:-1:1
x(i) = (b(i) - A(i,i+1:n)*x(i+1:n))/A(i,i);
end
end
4.2 Metodi Iterativi
Utilizzati per sistemi grandi e sparsi. Il metodo di Gauss-Seidel è particolarmente efficace:
% Gauss-Seidel in MATLAB
function x = gauss_seidel(A, b, x0, max_iter, tol)
n = length(b);
x = x0;
for iter = 1:max_iter
x_old = x;
for i = 1:n
x(i) = (b(i) - A(i,1:i-1)*x(1:i-1) - A(i,i+1:n)*x_old(i+1:n))/A(i,i);
end
if norm(x - x_old, inf) < tol
break;
end
end
end
5. Interpolazione e Approssimazione
L'interpolazione polinomiale (Lagrange, Newton) e l'approssimazione ai minimi quadrati sono tecniche per stimare funzioni a partire da dati discreti.
5.1 Interpolazione di Lagrange
Dati n+1 punti (xᵢ, yᵢ), trova il polinomio di grado ≤n che passa per tutti i punti:
Pₙ(x) = Σ yⱼ ∏ (x - xᵢ)/(xⱼ - xᵢ) per i ≠ j
5.2 Approssimazione ai Minimi Quadrati
Quando i dati sono affetti da rumore, è meglio approssimare con un polinomio di grado inferiore:
% In MATLAB
x = [0 1 2 3 4];
y = [1 3 2 3 4];
p = polyfit(x, y, 2); % Polinomio di grado 2
x_fit = linspace(0, 4, 100);
y_fit = polyval(p, x_fit);
plot(x, y, 'o', x_fit, y_fit, '-');
6. Esercizi Svolti con MATLAB
Vediamo alcuni esercizi tipici con soluzione dettagliata:
Esercizio 1: Metodo di Newton per f(x) = x³ - 6x² + 11x - 6
Testo: Trovare la radice vicina a x₀ = 1.5 con tolleranza 1e-5.
Soluzione:
f = @(x) x.^3 - 6*x.^2 + 11*x - 6;
df = @(x) 3*x.^2 - 12*x + 11;
x0 = 1.5;
tol = 1e-5;
max_iter = 100;
for i = 1:max_iter
x1 = x0 - f(x0)/df(x0);
if abs(x1 - x0) < tol
break;
end
x0 = x1;
end
fprintf('Radice trovata: %.8f in %d iterazioni\n', x1, i);
Risultato: La radice x ≈ 1.99999999 con convergenza in 4 iterazioni.
Esercizio 2: Integrazione con Simpson di ∫₀¹ eˣ sin(x) dx
Soluzione MATLAB:
f = @(x) exp(x).*sin(x);
a = 0; b = 1; n = 100; % n deve essere pari
h = (b-a)/n;
x = a:h:b;
y = f(x);
% Regola di Simpson
integral = h/3 * (y(1) + y(end) + ...
4*sum(y(2:2:end-1)) + ...
2*sum(y(3:2:end-2)));
fprintf('Integrale approssimato: %.8f\n', integral);
7. Tecniche di Ripetizione Efficaci
Per padronanza del calcolo numerico con MATLAB:
- Pratica costante: Risolvere almeno 3 esercizi al giorno su metodi diversi
- Visualizzazione: Usare sempre
fplotper comprendere il comportamento delle funzioni - Debugging: Verificare i risultati con funzioni MATLAB built-in (
fzero,integral) - Ottimizzazione: Analizzare la complessità computazionale degli algoritmi implementati
- Documentazione: Commentare il codice e tenere un quaderno degli errori comuni
8. Risorse Esterne Autorevoli
Per approfondire:
- Numerical Methods - MIT OpenCourseWare (Corso completo con appunti e esercizi)
- Numerical Analysis - UC Davis (Materiale teorico e implementazioni)
- NIST Digital Library of Mathematical Functions (Riferimento per funzioni speciali)
9. Confronto tra Metodi Numerici
| Metodo | Velocità di Convergenza | Robustezza | Complessità Computazionale | Casi d'Uso Ideali |
|---|---|---|---|---|
| Bisezione | Lineare (O(1/n)) | ⭐⭐⭐⭐⭐ | O(n log(1/ε)) | Funzioni continue con cambio di segno garantito |
| Newton-Raphson | Quadratica (O(ε²)) | ⭐⭐⭐ | O(log log(1/ε)) | Funzioni lisce con derivata nota |
| Secante | Superlineare (O(ε^(1.62))) | ⭐⭐⭐⭐ | O(log(1/ε)) | Quando la derivata è costosa da calcolare |
| Regola del Trapezio | O(h²) | ⭐⭐⭐⭐ | O(n) | Integrazione di funzioni regolari |
| Regola di Simpson | O(h⁴) | ⭐⭐⭐⭐ | O(n) | Funzioni lisce con derivata quarta continua |
10. Errori Comuni e Come Evitarli
Durante l'implementazione di algoritmi numerici, è facile incorrere in errori sistematici:
- Cancellazione numerica: Sottrazione di numeri quasi uguali (es: 1.000001 - 1.000000 = 0.000001 ma con perdita di precisione). Soluzione: Riorganizzare le formule o usare precisione maggiore.
- Overflow/Underflow: Numeri troppo grandi o troppo piccoli. Soluzione: Usare scala logaritmica o normalizzazione.
- Convergenza a soluzioni non desiderate: Nel metodo di Newton, scelta sbagliata del punto iniziale. Soluzione: Analisi grafica preliminare.
- Matrici mal condizionate: Piccole variazioni nei dati portano a grandi errori. Soluzione: Usare decomposizione SVD o metodi iterativi.
- Iterazioni infinite: Mancanza di criterio di arresto. Soluzione: Impostare sempre un limite massimo di iterazioni.
11. Applicazioni Pratiche del Calcolo Numerico
Le tecniche numeriche trovano applicazione in numerosi campi:
- Ingegneria: Analisi strutturale, fluidodinamica computazionale (CFD), ottimizzazione di design
- Finanza: Valutazione di opzioni (metodo di Monte Carlo), gestione del rischio
- Medicina: Modelli farmacocinetici, elaborazione di immagini medicali
- Fisica: Simulazioni quantistiche, dinamica molecolare
- Data Science: Ottimizzazione di modelli di machine learning, riduzione della dimensionalità
12. Strumenti Avanzati in MATLAB
MATLAB offre toolbox specializzati per il calcolo numerico:
- Optimization Toolbox: Funzioni come
fminuncper ottimizzazione non lineare - Symbolic Math Toolbox: Calcolo simbolico con
solveeint - Parallel Computing Toolbox: Accelerazione di algoritmi numerici su GPU
- Curve Fitting Toolbox: Approssimazione avanzata di dati sperimentali
- Partial Differential Equation Toolbox: Risoluzione di PDE con metodi agli elementi finiti
13. Preparazione per Esami e Collqui
Per superare esami o collqui tecnici sul calcolo numerico:
- Studiare a fondo la teoria degli errori e la stabilità degli algoritmi
- Imparare a memoria le formule iterative dei principali metodi
- Esercitarsi con implementazioni "da zero" senza usare funzioni MATLAB built-in
- Saper spiegare perché un metodo è preferibile a un altro in un dato contesto
- Conoscere i limiti teorici (es: il metodo di Newton non converge per funzioni con punti stazionari)
- Saper interpretare i risultati: "Questo risultato è ragionevole? Perché?"
14. Progetti Pratici per Portfolio
Alcune idee per progetti che dimostrano competenza:
- Implementazione di un solver per equazioni differenziali con metodi Runge-Kutta
- Creazione di una GUI in MATLAB per risolvere sistemi lineari con diversi metodi
- Analisi comparativa della precisione di metodi di integrazione su funzioni patologiche
- Sviluppo di un algoritmo per il calcolo degli autovalori usando il metodo delle potenze
- Applicazione del metodo degli elementi finiti a un problema fisico semplice
15. Conclusioni e Prospettive Future
Il calcolo numerico rimane una disciplina in continua evoluzione, soprattutto con l'avvento del computing quantistico e dell'intelligenza artificiale. Padronanza di questi metodi, abbinata alla capacità di implementarli efficientemente in MATLAB, apre porte in numerosi settori tecnologici avanzati.
Per mantenersi aggiornati, si consiglia di:
- Seguire conferenze come la SIAM Annual Meeting
- Leggere riviste come "Journal of Computational Mathematics"
- Esplorare le nuove funzionalità di MATLAB in ambito numerico (es:
vpaper precisione arbitraria) - Sperimentare con librerie Python come NumPy/SciPy per un confronto tra linguaggi