Appunti Di Calcolo Numerico Con Codici In Matlab Octave

Calcolatore Numerico per MATLAB/Octave

Strumento interattivo per il calcolo numerico con generazione di codice MATLAB/Octave

Appunti Completi di Calcolo Numerico con Codici MATLAB/Octave

Introduzione al Calcolo Numerico

Il calcolo numerico rappresenta una branca fondamentale della matematica applicata che si occupa di sviluppare algoritmi per approssimare soluzioni di problemi matematici complessi. Questi metodi sono essenziali quando le soluzioni analitiche non sono disponibili o sono troppo complesse da calcolare esattamente.

In ambito ingegneristico e scientifico, strumenti come MATLAB e GNU Octave (la sua alternativa open-source) sono diventati standard de facto per l’implementazione di algoritmi numerici grazie alla loro potenza di calcolo e alla sintassi orientata alle matrici.

Importanza del Calcolo Numerico

  • Approssimazione di soluzioni: Quando le soluzioni esatte non sono disponibili
  • Efficienza computazionale: Riduce i tempi di calcolo per problemi complessi
  • Modellazione di fenomeni reali: Essenziale in fisica, ingegneria, economia
  • Analisi degli errori: Comprensione e controllo degli errori di approssimazione

Metodi per la Ricerca degli Zeri

Metodo di Bisezione

Il metodo di bisezione è uno dei più semplici metodi iterativi per trovare gli zeri di una funzione continua. Si basa sul teorema degli zeri di Bolzano.

Algoritmo:

  1. Scegliere un intervallo [a, b] tale che f(a) e f(b) abbiano segni opposti
  2. Calcolare il punto medio c = (a + b)/2
  3. Valutare f(c)
  4. Determinare il nuovo intervallo:
    • Se f(c) = 0, c è la radice
    • Se f(c) ha lo stesso segno di f(a), il nuovo intervallo è [c, b]
    • Altrimenti, il nuovo intervallo è [a, c]
  5. Ripetere fino al raggiungimento della tolleranza desiderata

Vantaggi: Semplicità e convergenza garantita (se f è continua)

Svantaggi: Convergenza lineare (lenta)

Esempio di codice MATLAB/Octave per il metodo di bisezione:

function [root, iter] = bisection(f, a, b, tol, max_iter)
    if f(a)*f(b) >= 0
        error('La funzione deve avere segni opposti agli estremi dell''intervallo');
    end

    for iter = 1:max_iter
        c = (a + b)/2;
        if abs(f(c)) < tol || (b-a)/2 < tol
            root = c;
            return;
        end

        if f(c)*f(a) < 0
            b = c;
        else
            a = c;
        end
    end

    root = (a + b)/2;
    warning('Raggiunto il numero massimo di iterazioni');
end
                

Metodo di Newton-Raphson

Il metodo di Newton-Raphson (o metodo delle tangenti) è un metodo iterativo che utilizza la derivata della funzione per accelerare la convergenza.

Formula iterativa: xₙ₊₁ = xₙ - f(xₙ)/f'(xₙ)

Vantaggi: Convergenza quadratica (molto veloce vicino alla soluzione)

Svantaggi: Richiede la derivata, sensibile alla scelta del punto iniziale

Esempio di codice MATLAB/Octave per il metodo di Newton-Raphson:

function [root, iter] = newton_raphson(f, df, x0, tol, max_iter)
    x = x0;
    for iter = 1:max_iter
        fx = f(x);
        if abs(fx) < tol
            root = x;
            return;
        end
        dfx = df(x);
        if dfx == 0
            error('Derivata nulla. Metodo fallito.');
        end
        x = x - fx/dfx;
    end
    root = x;
    warning('Raggiunto il numero massimo di iterazioni');
end
                

Metodi di Integrazione Numerica

Regola del Trapezio

La regola del trapezio è un metodo semplice per approssimare l'integrale definito di una funzione. Divide l'intervallo di integrazione in trapezioidi e ne somma le aree.

Formula: ∫ₐᵇ f(x)dx ≈ (b-a)/2n [f(a) + 2∑f(xᵢ) + f(b)]

Errore: O(h²) dove h = (b-a)/n

Implementazione in MATLAB/Octave:

function I = trapezoidal(f, a, b, n)
    h = (b-a)/n;
    x = linspace(a, b, n+1);
    y = f(x);
    I = h*(sum(y) - 0.5*(y(1) + y(end)));
end
                

Regola di Simpson

La regola di Simpson fornisce un'approssimazione più accurata rispetto alla regola del trapezio utilizzando parabole invece di linee rette.

Formula: ∫ₐᵇ f(x)dx ≈ (b-a)/6n [f(a) + 4∑f(xᵢₒᵣₑ) + 2∑f(xᵢₚₐᵣᵢ) + f(b)]

Vantaggi: Errore O(h⁴), più accurato del trapezio

Svantaggi: Richiede un numero pari di intervalli

Sistemi Lineari

Eliminazione di Gauss

L'eliminazione di Gauss è un metodo diretto per risolvere sistemi lineari Ax = b trasformando la matrice A in una matrice triangolare superiore.

Processo:

  1. Triangolarizzazione (eliminazione in avanti)
  2. Sostituzione all'indietro

Complessità: O(n³) per una matrice n×n

Implementazione in MATLAB/Octave:

function x = gauss_elimination(A, b)
    n = length(b);
    % Eliminazione in avanti
    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
                

Analisi degli Errori

Nel calcolo numerico, la comprensione e il controllo degli errori sono fondamentali per garantire l'affidabilità dei risultati.

Tipi di Errore

Tipo di Errore Descrizione Esempio
Errore assoluto Differenza tra valore vero e approssimato |x - x̂|
Errore relativo Errore assoluto normalizzato |x - x̂|/|x|
Errore di troncamento Dovuto all'approssimazione del metodo Approssimare sin(x) con x per x piccolo
Errore di arrotondamento Dovuto alla rappresentazione finita dei numeri 0.1 in binario non è esatto

Propagazione degli Errori

Quando si eseguono operazioni aritmetiche con numeri approssimati, gli errori si propagano. La stima di questa propagazione è cruciale per valutare l'affidabilità dei risultati.

Esempio: Se x = 2.0 ± 0.1 e y = 3.0 ± 0.2, l'errore su x + y sarà √(0.1² + 0.2²) ≈ 0.22

Ottimizzazione dei Metodi Numerici

L'efficienza dei metodi numerici può essere significativamente migliorata attraverso varie tecniche:

  • Precondizionamento: Trasformazione del problema per migliorare la convergenza
  • Adattività: Aggiustamento dinamico dei parametri (es. passo in metodi iterativi)
  • Parallelizzazione: Sfruttamento di architetture multi-core
  • Memorizzazione: Riutilizzo di risultati intermedi

Confronti tra Metodi

Metodo Ordine di Convergenza Vantaggi Svantaggi Costo Computazionale
Bisezione Lineare (1) Semplicità, convergenza garantita Lento O(log(1/ε))
Newton-Raphson Quadratico (2) Molto veloce vicino alla soluzione Richiede derivata, sensibile a x₀ O(log(log(1/ε)))
Secante Superlineare (~1.62) Non richiede derivata Meno veloce di Newton O(log(1/ε)^1.62)
Regola del Trapezio O(h²) Semplice da implementare Meno accurato di Simpson O(n)
Regola di Simpson O(h⁴) Molto accurato Richiede n pari O(n)

Applicazioni Pratiche

I metodi numerici trovano applicazione in numerosi campi:

Ingegneria Strutturale

  • Analisi agli elementi finiti (FEM)
  • Calcolo delle tensioni in strutture complesse
  • Ottimizzazione topologica

Fisica Computazionale

  • Simulazioni di fluidodinamica (CFD)
  • Modellazione di fenomeni quantistici
  • Studio della dinamica molecolare

Finanza Quantitativa

  • Valutazione di derivati (opzioni, swap)
  • Modelli di rischio (Value at Risk)
  • Ottimizzazione di portafoglio

Risorse Accademiche

Per approfondire lo studio del calcolo numerico, si consigliano le seguenti risorse autorevoli:

Best Practices per l'Implementazione

Scelta del Metodo

La selezione del metodo numerico appropriato dipende da diversi fattori:

  • Precisione richiesta: Metodi ad alta precisione come Simpson sono preferibili quando l'accuratezza è critica
  • Complessità del problema: Per sistemi non lineari, metodi iterativi come Newton-Raphson sono spesso necessari
  • Risorse computazionali: Metodi diretti come l'eliminazione di Gauss richiedono più memoria
  • Stabilità numerica: Alcuni metodi sono più stabili di altri per problemi mal condizionati

Validazione dei Risultati

È fondamentale validare i risultati ottenuti dai metodi numerici:

  1. Confrontare con soluzioni analitiche quando disponibili
  2. Utilizzare diversi metodi per lo stesso problema
  3. Variare i parametri (es. tolleranza, numero di intervalli) per verificare la convergenza
  4. Analizzare la sensibilità ai dati di input

Ottimizzazione del Codice

Per implementazioni efficienti in MATLAB/Octave:

  • Evitare cicli quando possibile (vettorizzazione)
  • Preallocare le matrici per migliorare le prestazioni
  • Utilizzare funzioni built-in ottimizzate quando disponibili
  • Sfruttare le capacità di parallel computing
  • Documentare chiaramente il codice con commenti

Esempi Avanzati

Problema ai Valori Iniziali (ODE)

I metodi numerici sono essenziali per risolvere equazioni differenziali ordinarie (ODE) che non ammettono soluzione analitica.

Metodo di Euler in MATLAB/Octave:

function [t, y] = euler_ode(f, t0, tf, y0, n)
    h = (tf-t0)/n;
    t = linspace(t0, tf, n+1);
    y = zeros(1, n+1);
    y(1) = y0;
    for i = 1:n
        y(i+1) = y(i) + h*f(t(i), y(i));
    end
end

% Esempio: dy/dt = -2ty, y(0)=1
f = @(t,y) -2*t*y;
[t, y] = euler_ode(f, 0, 1, 1, 100);
plot(t, y, '-o', t, exp(-t.^2), 'r-');
legend('Euler', 'Soluzione esatta');
                

Interpolazione Polinomiale

L'interpolazione polinomiale consente di approssimare una funzione nota in punti discreti con un polinomio.

Interpolazione di Lagrange in MATLAB/Octave:

function p = lagrange_interpolation(x, y)
    n = length(x);
    p = @(xx) 0;
    for i = 1:n
        L = @(xx) 1;
        for j = 1:n
            if i ~= j
                L = @(xx) L(xx).*(xx - x(j))/(x(i) - x(j));
            end
        end
        p = @(xx) p(xx) + y(i)*L(xx);
    end
end

% Esempio
x = [0, 1, 2];
y = [1, 3, 2];
p = lagrange_interpolation(x, y);
xplot = linspace(0, 2, 100);
plot(x, y, 'o', xplot, p(xplot), '-');
                

Conclusione

Il calcolo numerico rappresenta uno strumento indispensabile per la risoluzione di problemi matematici complessi in ambito scientifico e ingegneristico. La padronanza di questi metodi, unitamente alla capacità di implementarli efficacemente in ambienti come MATLAB e Octave, consente di affrontare una vasta gamma di problemi pratici che altrimenti sarebbero intrattabili.

L'evoluzione continua degli algoritmi numerici e delle capacità computazionali apre nuove possibilità per la modellazione e la simulazione di fenomeni sempre più complessi. È fondamentale per gli studenti e i professionisti mantenersi aggiornati sulle ultime tecniche e best practices in questo campo in rapida evoluzione.

Ricordiamo che la scelta del metodo numerico appropriato, la corretta implementazione e la validazione dei risultati sono elementi chiave per ottenere soluzioni affidabili e significative.

Leave a Reply

Your email address will not be published. Required fields are marked *