Metodi numerici in Matlab
description
Transcript of Metodi numerici in Matlab
![Page 1: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/1.jpg)
Metodi numericiin Matlab
Gabriella Puppo
![Page 2: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/2.jpg)
Argomenti trattati
• Algebra lineare
• Interpolazione
• Studio della matrice del filo elastico
• Risoluzione di alcuni problemi di elasticita’
![Page 3: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/3.jpg)
Algebra lineare
• Risoluzione di sistemi
• Risoluzione di sistemi nel senso dei minimi quadrati
• Calcolo del numero di condizionamento
![Page 4: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/4.jpg)
Risoluzione di sistemi lineari con Matlab
Matlab risolve il sistema lineare Ax=b con il comando:x=A\b.Se A è quadrata, questo comando implica i seguenti passi:- Calcola la fattorizzazione LU con pivoting sulle colonne- Risolvi i due sistemi triangolari
Se A è rettangolare (sistemi sovradeterminati), Matlab calcola lasoluzione nel senso dei minimi quadrati, cioè:- Calcola la fattorizzazione QR con pivoting sulle colonne- Risolve il sistema triangolare superiore
Se il condizionamento di A è elevato, stampa un messaggio diwarning, ma calcola ugualmente la soluzione.
![Page 5: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/5.jpg)
Esempio>> a=[2 -1 0; -1 2 -1; 0 -1 2];>> b=ones(3,1);>> x=a\bx = 1.5000 2.0000 1.5000
![Page 6: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/6.jpg)
Attenzione! Matlab calcola una soluzione anche quando il sistema non ammette soluzione.Nell’esempio seguente, a è singolare:
>> a=[1 2 3; 4 5 6; 7 8 9];>> b=[1; 1; 0];>> x=a\b;Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = 1.541976e-018.>> norm(a*x-b)ans = 5.0990
Non è chiaro il modo in cui Matlab calcola la soluzione in questocaso.
![Page 7: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/7.jpg)
Fattorizzazione LU
Matlab calcola la fattorizzazione LU di una matrice con il comando:[l,u] = lu(a)oppure con il comando:[l,u,p]=lu(a)Nel primo caso, l contiene anche gli scambi di riga effettuati.Se la fattorizzazione è PA = LU, allora l=P-1 L.Nel secondo caso, l=L, u=U, p=P.
![Page 8: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/8.jpg)
Esempio
>> a=[1 2 3; 4 5 6; 7 8 9];>> [l,u]=lu(a)l = 0.1429 1.0000 0 0.5714 0.5000 1.0000 1.0000 0 0u = 7.0000 8.0000 9.0000 0 0.8571 1.7143 0 0 0.0000
Notare che l contiene lamatrice triangolare Lcon le righe scambiate,cioè l=P-1 L
![Page 9: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/9.jpg)
Per forzare la soluzione di un sistema tramite fattorizzazioneLU, devo quindi dare i comandi:
>> [l,u]=lu(a);>> y=l\b;>> x=u\y;
![Page 10: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/10.jpg)
Fattorizzazione QR
Matlab esegue la fattorizzazione A=QR mediante il comando:[q,r] = qr(a)Per forzare la soluzione di un sistema lineare mediante fattorizzazione QR devo quindi dare i comandi:
>> [q,r]=qr(a);>> x=r\q'*b;
![Page 11: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/11.jpg)
Soluzione di sistemi sovradeterminati
Un sistema lineare con una matrice M per N, con M > N, e’ un sistema sovradeterminato, che si puo- risolvere nel senso dei minimi quadrati, usando il comando /
Esempio. Risolvere il sistema Ax=b, con:
>> a=[1 1 1; 1 2 4; 1 -1 1;1 -2 4] ;>> b=[1; 1; 1; 2];
![Page 12: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/12.jpg)
La soluzione e’:
>> x=a\bx = 0.8333 -0.2000 0.1667
Questa non e’ la soluzione del sistema in senso classico, infatti:
>> a*x-bans = -0.2000 0.1000 0.2000 -0.1000
Quindi il residuo e’ diverso da zero.La soluzione trovata e’ il vettore cheminimizza la norma del residuo.
![Page 13: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/13.jpg)
Numero di condizionamento
Matlab stima il numero di condizionamento di una matrice mediante il comando cond. Precisamente:cond(a,p)calcola il numero di condizionamento della matrice a in norma p. Se p non c’e’, si assume che p=2.
Esercizio: calcolare il numero di condizionamento della matrice del filo elastico, per N=10 e N=100. Inoltre, disegnare un grafico con il numero di condizionamento in funzione di N.
![Page 14: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/14.jpg)
Matrice del filo elastico
% Questo script disegna un grafico contenente% il numero di condizionamento della matrice % di rigidita' del filo elastico in funzione di % N, con N=1:200.nmax=200;for n=1:nmax a=tridiag(n); c(n)=cond(a);endplot(c)title('Numero di condizionamento')
![Page 15: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/15.jpg)
Si ottiene questo andamento:
![Page 16: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/16.jpg)
Interpolazione polinomiale
• Interpolazione polinomiale “esatta”
• Interpolazione polinomiale nel senso dei minimi quadrati
• Studio dell-andamaneto di un insieme di dati
![Page 17: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/17.jpg)
Interpolazione polinomiale
Sono assegnati dei dati (x i, f i) con i=1,…,M.Si vuole trovare un polinomio P N di grado N tale che:P N (x i) = f i per i = 1,…,M .
Ci interessano due casi:1) N = M - 1(interpolazione polinomiale globale)2) N < M - 1(interpolazione nel senso dei minimi quadrati)
Matlab gestisce entrambi i casi con la function polyfit
![Page 18: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/18.jpg)
function polyfit
La function polyfit calcola i coefficienti del polinomio che interpola dei dati, precisamente:
>> p=polyfit(x,f,n)
Interpola i dati contenuti nei vettori x ed f con un polinomio di gradon. Il vettore p contiene i coefficienti del polinomio interpolatore,con la convenzione:p(x) =p(1)*x^n +p(2)*x^(n-1) + … +p(n+1).Se n = length(x)-1, si ha interpolazione “esatta”.Se n < length(x)-1, si ha interpolazione nel senso dei minimi quadrati
![Page 19: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/19.jpg)
function polyvalLa function polyval valuta un polinomio su un insieme di valori x:
>> px = polyval(p,x)
Il vettore px contiene i valori del polinomio con coefficientip, calcolato sui punti x.
![Page 20: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/20.jpg)
EsempioInterpolare la funzione F(x) = exp(-x 2) * sin(3x) con due polinomi,usando 5 e 10 punti equispaziati sull’intervallo [0 2]
![Page 21: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/21.jpg)
% Interpola la funzione f(x)=exp(-x^2)*sin(3x)% usando un polinomio di grado 4 e un polinomio di grado 9%f=inline('exp(-x.^2) .* sin(3*x)');x1=linspace(0,2,5); % griglia di interpolazionef1=f(x1);p4=polyfit(x1,f1,4); %trova i coefficenti del polinomio x2=linspace(0,2,10); % griglia di interpolazionef2=f(x2);p9=polyfit(x2,f2,9); %trova i coefficenti del polinomio
Calcola i coefficienti dei due polinomi, p4 e p9
![Page 22: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/22.jpg)
% Disegna il grafico dei due polinomi e della funzione fxg=linspace(0,2,201);fg=f(xg);% calcola il polinomio sulle ascisse del graficop4_xg=polyval(p4,xg);p9_xg=polyval(p9,xg);plot(xg,fg,xg,p4_xg,xg,p9_xg)legend('f','p4','p9')
Disegna il grafico dei due polinomi, sulla stessa figura
![Page 23: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/23.jpg)
Andamento del numero di condizionamento della matrice del filo elastico, in funzione di n.
Vorrei calcolare per quale valore di m cond(A h (n)) ~ n m
Secondo la stima teorica, dovrei trovare m=2.Provo quindi ad interpolare i valori del numero di condizionamentocon un polinomio di grado 2, e a sovrapporre le due curve,cioe’ il numero di condizionamento, ed il polinomio, per vedere se il polinomio rappresenta bene l’andamento della curva.
![Page 24: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/24.jpg)
Questo e’ l’andamento trovato:
![Page 25: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/25.jpg)
% Interpola i dati sul condizionamento con un polinomio% di grado 2nmax=100;for n=1:nmax c(n)=cond( tridiag(n) );endni=1:nmax;p=polyfit(ni,c,2);% Valuta il polinomio sui dati nipn=polyval(p,ni);plot(ni,c,'go'); hold on; plot(ni,pn,'r','Linewidth',2)
E questo e’ lo script:
![Page 26: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/26.jpg)
… ma se non sapessi m a priori, come potrei determinarlo?
Esercizio.
Calcolare diversi polinomi di interpolazione dei dati sul condizionamento e osservare i coefficienti dei polinomi ottenuti.
![Page 27: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/27.jpg)
Esercizio.
Paragonare il numero di condizionamento della matrice del filo elastico per le seguenti condizioni al contorno:1) Dirichlet: u(0) = u(1) = 02) Misto: u’(0) = 1, u(1) = 0.
![Page 28: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/28.jpg)
Alcuni problemi di elasticita’
• Carico uniforme
• Come passare una function come argomento ad un’altra function
• Carico puntiforme
![Page 29: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/29.jpg)
Risolviamo ora il problema del filo elastico nel casoseguente:
- u = f in (0,1)u(0) = u(1) = 0
nel caso in cui f (x) = -1.Consideriamo una griglia uniforme, con N punti interni.Per il vettore di carico, prendiamo:b i ~ h f(x i )
![Page 30: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/30.jpg)
function [u,x]=filo_unif(n)% Risolve il problema del filo elastico % per condizioni al bordo omogenee di% Dirichlet, con carico uniforme% e N punti internia=tridiag(n);h=1/(n+1); % spaziatura di grigliab=-h^2*ones(n,1); % ho portato h a sinistrau=a\b;% Ora aggiungo le condizioni al contornou(2:n+1)=u; u(1)=0; u(n+2)=0;% Calcola il vettore delle ascissefor i=0:n+1; x(i+1) = i*h; end
![Page 31: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/31.jpg)
Scriviamo ora una function che ci permetta di calcolare laposizione di equilibrio del filo, per carichi f da definiredall’esterno.
Ho bisogno di passare il nome della function come argomentoQuesta operazione in Matlab e’ piuttosto delicata.Cerchiamo di ricordare come si procede.
![Page 32: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/32.jpg)
Passare una function come argomento
Molte funzioni “lavorano” su altre funzioni, predefinite dall’utente.Supponiamo di voler scrivere una function che stampa il grafico di una funzione sull’intervallo [a,b].La function richiesta deve avere in input il nome della function di cui vogliamo il grafico e l’intervallo [a,b].La sua intestazione sarà quindi:
function plot_funz(funz,a,b)
La difficoltà nasce dal fatto che per Matlab (prima della versione 6) il parametro “funz” deve essere una stringa di caratteri, contenente il nome della function.
![Page 33: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/33.jpg)
Supponiamo quindi di aver creato un M-file f.m che contiene la function di cui vogliamo il grafico:
function f=f(x)% Calcola la funzione exp(x)*cos(4*x)f=exp(x).*cos(4*x);
Poiché il nome della function deve essere passato come stringa di caratteri, la chiamata a plot_funz per disegnare il grafico di f(x) sull’intervallo [0,5] sarà:
>> plot_funz('f',0,5)
Oppure, in Matlab 6, si puo’ usare anche uno handle (@):
>> plot_funz(@f,0,5)
![Page 34: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/34.jpg)
Function feval
All’interno della function plot_funz, è necessario valutare la funzione passata come argomento sui valori x delle ascisse.Per far questo devo usare la function feval:
f=feval(funz,x);
Questa istruzione trasforma la stringa funz , associando a funzil file funz.m . Poi, esegue il comando funz(x).Possiamo ora dare il listato della function plot_funz
![Page 35: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/35.jpg)
Listato di plot_funz
function plot_funz(funz,a,b)% PLOT_FUNZ(FUNZ,A,B): disegna il grafico della funzione% FUNZ sull'intervallo [a,b], usando 201 punti.% FUNZ deve essere una stringa di caratterih=(b-a)/200;x=a:h:b;f=feval(funz,x); %Valuta funz nei valori xplot(x,f)
![Page 36: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/36.jpg)
Inline functions
Per costruire funzioni semplici, posso usare l’istruzione inline, che genera funzioni di una riga. Consideriamo il file f.m:
function f=f(x)% Calcola la funzione exp(x)*cos(4*x)f=exp(x).*cos(4*x);
Un modo più semplice di generare la stessa funzione è:
>> f=inline('exp(x).*cos(4*x)')f = Inline function: f(x) = exp(x).*cos(4*x)
![Page 37: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/37.jpg)
Attenzione!
L’oggetto f creato dall’istruzione inline è una stringa di caratteri.Quindi se voglio disegnare il grafico di f usando la function plot_funz, ho due possibilità:1) -creo un file f.m, che contiene la funzione desiderata. - chiamo plot_funz con il comando:
>> plot_funz('f',0,5)
2) -creo f come inline function e poi chiamo plot_funz:
>> f=inline('exp(x).*cos(4*x)');>> plot_funz(f,0,5)
![Page 38: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/38.jpg)
Ora possiamo costruire una function che risolva il problema del filo elastico, con un carico assegnato dall’esterno.
Per risolvere un problema specifico, dovremo creare una function come file.m o come oggetto inline che contenga l’espressione del carico
![Page 39: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/39.jpg)
function [x,u]=filo_dir(f,n)% Risolve il problema del filo elastico su (0,1)% per condizioni al bordo omogenee di% Dirichlet, con carico definito dalla funzione% F e N punti internia=tridiag(n);h=1/(n+1); % spaziatura di griglia% calcola la posizione dei nodi interni:for i=1:n; x(i) = i*h; endb=h^2*feval(f,x); b=b'; % ho portato h a sinistrau=a\b;% Ora aggiungo le condizioni al contornou(2:n+1)=u; u(1)=0; u(n+2)=0;x(2:n+1)=x; x(1)=0; x(n+2)=1;
Ho ottenuto il seguente listato:
![Page 40: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/40.jpg)
Esempio.
Risolviamo il problema del filo elastico soggetto ad un caricopuntiforme, cioe’:
f(x) = - delta( x-0.5 )
![Page 41: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/41.jpg)
function che descrive un carico puntiforme:
function f=delta(x)% F=DELTA(X): Costruisce un vettore riga, che contiene% un carico a forma di delta, quindi F(N/2)=-N, dove% N e' la lunghezza di X, cioe' F(N/2) = -N su un intervallo% di ampiezza 1/Nn=length(x);f=zeros(1,n);if mod(n,2)==0 % controlla se n e' pari f(n/2)=-n/2; f(n/2 +1)= -n/2;else f((n+1)/2)=-n;end
![Page 42: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/42.jpg)
Risolviamo il problema per diversi valori di N:
[x,u]=filo_dir(@delta,9);plot(x,u,'r','Linewidth',2)hold on[x,u]=filo_dir(@delta,99);plot(x,u,'g','Linewidth',2)[x,u]=filo_dir(@delta,999); plot(x,u,'c','Linewidth',2)
![Page 43: Metodi numerici in Matlab](https://reader033.fdocument.pub/reader033/viewer/2022061612/56815b17550346895dc8c877/html5/thumbnails/43.jpg)
Si ottiene il seguente grafico: