Metodi numerici con elementi di Programmazione A.A. 2013-2014 Esercizi svolti in Laboratorio Lezione del 10-12-2013 1
Docente: Vittoria Bruni Email: vittoria.bruni@sbai.uniroma1.it Ufficio: Via A. Scarpa, Pal. B, I piano, Stanza n. 16 Tel. 06 49766648 Ricevimento: Giovedì 14.00-15.00 2
Il materiale didattico è disponibile sul sito http://ingaero.uniroma1.it/ nella pagina dedicata al corso Metodi Numerici con elementi di Programmazione Per consultazione: Getting Started with MatLab The mathworks www.mathworks.com 3
Esercizio 1 Modificare la funzione Matlab num_cond2.m e chiamarla num_cond3.m usando opportunamente l istruzione switch/case/otherwise/ 4
A parte il nome, in questa prima parte non cambia nulla rispetto alla funzione num_cond2 function [K,varargout] = num_cond3(a,varargin) % function [K,varargout] = num_cond3(a,varargin) % calcola il numero di condizionamento K della matrice quadrata % A rispetto alla norma indicata in tipo_norma. % Se tipo_norma non è data in input, il condizionamento è calcolato % rispetto alla norma infinito. tipo_norma non può assumere valori % diversi da 1, 2 o inf % Se si chiedono due output, allora il primo è K e il secondo è la % matrice inversa di A % Se si chiedono tre output, il primo è K, il secondo è la matrice % inversa di A, il terzo è la norma di A 5
Controllo del numero delle variabili di input L istruzione condizionale annidata if elseif elseif else usata in num_cond2 è sostituita con l istruzione switch sulla variabile switch nargin nargin case 0 % non sono assegnati input error('e'' necessario definire una matrice!!!') case 1 % è assegnato un solo input, cioè la matrice tipo_norma = inf; case 2 % sono assegnati due input, cioè la matrice e tipo_norma tipo_norma = varargin{1}; if (tipo_norma ~= 1) & (tipo_norma ~= 2) & (tipo_norma ~= inf) error('la norma deve essere 1 2 o inf') otherwise error('troppe variabili di input!!!') 6
Lista di istruzioni per il controllo degli input dim = size(a); if dim(1)~=dim(2) error('la matrice deve essere quadrata') if det(a)==0 error('la matrice e singolare') Lista di istruzioni per il calcolo del numero di condizionamento rispetto al tipo di norma scelto non cambia nulla rispetto alla funzione num_cond2 IA = inv(a); % matrice inversa di A NA = norm(a,tipo_norma); % norma di A NIA = norm(ia,tipo_norma); % norma della matrice inversa K = NA*NIA; % numero di condizionamento 7
L istruzione condizionale annidata if elseif else usata in num_cond2 è sostituita con l istruzione switch sulla variabile nargout otherwise corrisponde sia ad un numero di output troppo grande rispetto a Controllo e assegnazioni output quello previsto, sia ad un switch nargout numero troppo piccolo!!! case 2 % sono stati richiesti due output varargout{1} = IA; case 3 %sono stati richiesti tre output varargout{1} = IA; varargout{2} = NA; otherwise % il numero delle variabili di output richieste è troppo % alto o troppo basso error('controllare il numero delle variabili di output!!!') 8
Dalla finestra del Command Window >> A = [1 1.01;0.99 1]; >> KA_1 = num_cond3(a,1); >> disp(ka_1) 4.0401e+004 non cambia nulla rispetto alla funzione num_cond2 >> [KA,B] = num_cond3(a); >> disp(ka) 4.0401e+004 >> disp(b) 1.0e+004 * 1.0000-1.0100-0.9900 1.0000 >> [KA,B,nA] = num_cond3(a); >> disp(na) 2.0100 9
Esercizio 2 10
function [P] = successione(a,m) %[P] = successione(a,m) calcola i primi M elementi della successione così definita % P(1) = 2*a % P(2) = 4*a^2-1 % P(k) = 2*a*P(k-1)-P(k-2), k>2 % % e la confronta con la successione così definita % Q(k) = 1/(2*sqrt(a^2-1) )* (abs(a+sqrt(a^2-1))^(k+1) - abs(a-sqrt(a^2-1))^(k+1)); % % % INPUT % a = numero reale tale che a >1. La funzione offre tre possibilità per % correggere il valore della variabile data in input, altrimenti % interrompe l'esecuzione % M = numero intero positivo % OUTPUT % P = vettore contenente gli elementi della successione Pn 11
% controllo del numero delle variabili di input e di output if (nargin<=1) (nargin>2) error('il numero degli input non e'' corretto!!!') if (nargout>1) error('il numero degli output non e'' corretto!!!') % controllo del primo input tentativi = 0; while abs(a)<=1 & tentativi <3 a= input('il modulo di a deve essere maggiore di 1! a= '); tentativi = tentativi + 1; Nota: All uscita del ciclo while si possono avere le due situazioni seguenti: Il valore di a è in modulo maggiore di 1 e tentativi<=3 Il numero di tentativi ha raggiunto il valore 3 e il valore 12 di a è in modulo minore o uguale a 1
if abs(a)>1 % controllo del secondo input if (round(m)~=m) (M<=0) error('il secondo input deve essere un numero intero positivo!!!') % calcolo del vettore P P(1) = 2*a; P(2) = 4*a^2-1; for k=3:m P(k)=2*a*P(k-1)-P(k-2); % calcolo del vettore Q Q(1:M) = 1/(2*sqrt(a^2-1)) * (abs(a+sqrt(a^2-1)).^(2:m+1) - abs(a-sqrt(a^2-1)).^(2:m+1)); % grafico dei risultati figure, plot(p,'k-') hold on, plot(q,'r--') xlabel('k'), ylabel('successioni'), title('confronto successioni') leg('vettore P','vettore Q') else error('gli input inseriti non sono corretti!') 13
Dal Command Window >> [P] = successione(2,-10);??? Error using ==> successione at 38 il secondo input deve essere un numero intero positivo!!! >> [P] = successione(2,1.5);??? Error using ==> successione at 38 il secondo input deve essere un numero intero positivo!!! >> [P] = successione(2,-1.6);??? Error using ==> successione at 38 il secondo input deve essere un numero intero positivo!!! >> [P] = successione(6);??? Error using ==> successione at 22 il numero degli input non e' corretto!!! 14
Dal Command Window >> [P] = successione(-.5,100); il modulo di a deve essere maggiore di 1! a=.5 il modulo di a deve essere maggiore di 1! a=.2 il modulo di a deve essere maggiore di 1! a=.4??? Error using ==> successione at 53 gli input inseriti non sono corretti! >> [P] = successione(2,10); >> [P] = successione(2,100); >> [P] = successione(6,100); >> [P] = successione(-6,100); A queste chiamate la funzione non da messaggi di errore e grafica i risultati 15
Esercizio 3 crivere la function Matlab lebesgue.m che:.riceva in input i vettori xnodi e xpunti; se xpunti non viene dato in input, ssegni a xpunti 1000 punti equispaziati nell' intervallo [xnodi(1); nodi(length(xnodi)];.costruisca il vettore fleb contenente i valori della funzione di Lebesgue alcolata in xpunti;.se xpunti contiene più di un elemento, grafichi la funzione di Lebesgue alcolata in xpunti etichettando opportunamente gli assi;.restituisca in output xpunti, il massimo valore di fleb e il punto p_mfleb n cui è realizzato. tilizzare la function per il seguente vettore di nodi [1.0; 1.5; 2.0; 2.5; 3.0] salvare gli output nel file risultati_es3.mat 16
function [xpunti,mfleb,p_mfleb] = lebesgue(xnodi,varargin) % [xpunti,mfleb,p_mfleb] = lebesgue(xnodi,varargin) valuta e grafica la funzione di % Lebesgue costruita sui nodi contenuti in xnodi in corrispondenza dei punti in % xpunti, ne calcola il massimo e il punto in cui quest'ultimo è realizzato. % Se xpunti non è dato in input, l'intervallo [xnodi(1), xnodi()] è suddiviso in % 1000 punti equispaziati % % INPUT % - xnodi = vettore dei nodi % % OUTPUT % - xpunti = vettore dei punti in cui è stata valutata la funzione di Lebesgue. % Se non è dato in input, è costituito da 1000 punti equispaziati in % [xnodi(1), xnodi()] % - Mfleb = valore massimo assunto dalla funzione di Lebesgue sul vettore di % punti in xpunti % - p_mfleb = punto di xpunti in cui la funzione di Lebesgue assume il valore % massimo 17
% controllo degli input if nargin<1 nargin>2 error('il numero delle variabili di input non e'' corretto!'); elseif nargin==1 if length(xnodi)>1 xpunti = linspace(xnodi(1),xnodi(),1000); else error('xnodi deve essere un vettore di almeno due elementi!'); else if length(xnodi)>1 xpunti = varargin{1}; else error('xnodi deve essere un vettore di almeno due elementi!'); NOTA: Modificare insero il seguente controllo su xpunti: gli elementi di xpunti devono essere contenuti nell intervallo [xnodi(1), xnodi()] 18
% Calcolo i polinomi di base di Lagrange e li valuto in ogni elemento di xpunti n_xnodi = length(xnodi); n_xpunti = length(xpunti); for i=1:n_xpunti % per ogni elemento di xpunti for n=1:n_xnodi % per ogni nodo in xnodi plag(i,n) = prod(xpunti(i)-xnodi(1:n-1))*prod(xpunti(i)-xnodi(n+1:n_xnodi))/ (prod(xnodi(n)-xnodi(1:n-1))*prod(xnodi(n)-xnodi(n+1:n_xnodi))); NOTA: La variabile plag è una matrice con n_xpunti righe e n_xnodi colonne Ogni elemento in posizione (i,n) contiene il valore che il polinomio della base di Lagrange relativo al nodo n-simo assume in corrispondenza dello i-simo elemento di xpunti 19
% calcolo il valore della funzione di Lebesgue in ogni elementi di xpunti fleb = sum(abs(plag')); % calcolo il massimo di fleb [Mfleb,p_Mfleb] = max(fleb); % grafico della funzione di Lebesgue if n_xpunti>1 figure, plot(xpunti,fleb) xlabel('xpunti') ylabel('funzione di Lebesgue') 20
Dal Command Window >> xnodi=[1.0, 1.5, 2.0, 2.5, 3.0]; >> [xpunti,mfleb,p_mfleb] = lebesgue(xnodi); >> save risultati_es3.mat xpunti Mfleb p_mfleb Sono equivalenti >> [xpunti,mfleb,p_mfleb] = lebesgue(xnodi,linspace(xnodi(1),xnodi(),1000)); >> [xpunti,mfleb,p_mfleb] = lebesgue(xnodi,2.2); Non produce grafici >> [xpunti,mfleb,p_mfleb] = lebesgue(xnodi(1));??? Error using ==> lebesgue at 24 xnodi deve essere un vettore di almeno due elementi! 21
Si consideri la successione Esercizio 4 Scrivere la funzione Matlab successione2.m che riceva in input due interi positivi x0 e M e restituisca in output il vettore S contenente i primi M termini della successione x n generata da x0. Se la successione costruita raggiunge il valore 1 in un numero di passi N < M, la funzione deve stampare il valore di N dopo il seguente messaggio "Si raggiunge 1 in un numero di passi pari a ". La funzione deve graficare gli elementi di S usando un pallino blu per gli elementi ottenuti secondo la regola (2), un asterisco nero per quelli ottenuti con la regola (3) e un quadrato rosso per l'eventuale elemento pari a 1. Il grafico deve essere completo di titolo, etichette per gli assi e lega. 22
Esercizio 5 Scrivere la function Matlab fun_esercizio5.m che: 1.riceva in input i vettori xnodi e ynodi, un numero reale z e un intero N; se N non viene dato in input, assegni ad N la lunghezza del vettore xnodi diminuita di 1; 2.detta f la funzione che assume i valori in ynodi in corrispondenza dei valori in xnodi, e detto p N il polinomio di grado N che interpola f in un sottoinsieme opportuno di xnodi, valuti, se possibile, e restituisca in output l'errore che si commette approssimando f(z) con p N (z), altrimenti interrompa l'esecuzione e stampi un messaggio di errore. Data la seguente tabella di dati i 0 1 2 3 4 xi -0.5 0.25 0.5 1.5 2.5 f(xi) -0.750-0.375-0. 250 0.250 0.750 utilizzare la function per stimare l'errore commesso approssimando f(0) con p 4 (0) e salvare sia gli input che gli output nel file 23 risultati_esercizio5.mat