Fondamenti di analisi numerica - Maria Laura Lo Cascio 1 Eseguire un grafico Per eseguire il grafico di una curva, occorre un insieme di punti Pi ∈ R2 , il che significa generare un vettore delle ascisse (punti di tabulazione) e un vettore delle ordinate (valori della funzione). Le istruzioni seguenti forniscono il grafico nell’Esempio 1.5 . % Esegue un grafico % Genera un vettore contenente i punti di tabulazione % Intervallo di tabulazione: [0.998,1.002] Passo di tabulazione: 1.e-005 x=[0.998:1.e-005: 1.002]; % calcola i valori della funzione q1=(x-1).^5; q2=x.^5-5*x.^4+10*x.^3-10*x.^2+5*x-1; er=q1-q2; % esegue il grafico a partire dai vettori x, y e inserisce l’asse x plot(x,er,[0.998 1.002],[0 0]) Test Confrontare i valori assunti dalle funzioni p √ f1 (x) = x + 1 − (x), f2 (x) = √ 1 x+1+ p (x) per x ∈ [0, 50] eseguendo il grafico dell’errore relativo. Copyright © 2008 - The McGraw-Hill Companies s.r.l. Fondamenti di analisi numerica - Maria Laura Lo Cascio 2 Risolvere un’equazione di secondo grado I programmi seguenti forniscono le radici dell’equazione di grado 2 ax2 + bx + c = 0 utilizzando l’algoritmo classico √ √ −b + ∆ −b − ∆ ; x2 = , ∆ = b2 − 4ac x1 = 2a 2a e l’algoritmo che utilizza la relazione fra coefficienti e radici dell’equazione √ −b + sign(b) ∆ c x1 = ; x2 = . 2a a x1 In entrambi i casi, vengono richiesti in input i coefficienti dell’equazione, con a 6= 0, e vengono fornite le due radici e i corrispondenti valori assunti dal polinomio. Algoritmo 1 % % % % % % % % % % Soluzione dell’equazione di secondo grado ax^2+bx+c=0 con l’algoritmo classico Stampa accanto a ogni radice il corrispondente valore del polinomio Richiede i coefficienti dell’equazione coef=input(’inserisci i coefficienti [a b c], con a#0 ... e li memorizza con i nomi standard a=coef(1) b=coef(2) c=coef(3) calcolo del discriminante ... del=sqrt(b.^2-4*a*c); ... delle radici (eventualmente complesse) x1=(-b-del)/(2*a); x2=(-b+del)/(2*a); ... e dei corrispondenti valori del polinomio p1=a*x1^2+b*x1+c; p2=a*x2^2+b*x2+c; mostra su monitor i valori calcolati [x1 p1; x2 p2] ’) Copyright © 2008 - The McGraw-Hill Companies s.r.l. Fondamenti di analisi numerica - Maria Laura Lo Cascio 3 Algoritmo 2 % % % % % Soluzione dell’equazione di secondo grado ax^2+bx+c=0 L’algoritmo si basa sulla relazione fra coefficienti e radici Stampa nell’ordine le radici e i corrispondenti valori del polinomio Richiede i coefficienti dell’equazione c=input(’inserisci i coefficienti [a b c], con a#0 % calcola il discriminante ... del=sqrt(c(2)^2-4*c(1)*c(3)); % ... la radice di massimo modulo x1=(-c(2)+sign(-c(2))*del)/(2*c(1)); % ... l’altra radice x2=c(3)/(c(1)*x1); % mostra i risultati su monitor radici=[x1 x2] % calcola i valori del polinomiuo nelle radici ... p1=c(1)*x1^2+c(2)*x1+c(3); p2=c(1)*x2^2+c(2)*x2+c(3); % .. e li invia su monitor valori_p= [p1 p2] ’) Suggerimento Preparare un programma che fornisca le radici dell’equazione di secondo grado ottenute sia con la regola classica, sia con l’Algoritmo 2. Test Si calcolino gli zeri, con entrambi gli algoritmi scegliendo i coefficienti del polinomio in modo casuale e per i valori [a, b, c] seguenti [15, 1003, 0.15], [1, 18.27, 1.01], [3, 15, 2], [3, 125, 1] Copyright © 2008 - The McGraw-Hill Companies s.r.l. Fondamenti di analisi numerica - Maria Laura Lo Cascio 4 Stabilità I programmi seguenti si riferiscono all’esempio 1.7 . Il primo algoritmo genera la successione con la legge di calcolo in avanti In = 1 − nIn−1 , n ≥ 1, 1 I0 = 1 − , e il secondo alla legge all’indietro In−1 = 1 (1 − In ), n ≤ N, n IN = 1 . N +1 Questi algoritmi sono un primo esempio di come si gestisce una formula ricorsiva (l’argomento viene ripreso nel Capitolo 2): in entrambi i casi occorre deciderere quanti termini si vogliono calcolare e assegnare il valore da cui inizia il calcolo (valore di innesco) Algoritmo 1 (Legge in avanti) % Esempio di algoritmo instabile % Calcola Y_N = l’integrale su [0,1] di x^N e^x % generando una successione Y_k, k=0,..,N % Richiede il valore di N % N=input(’esponente finale di x, N=’) % calcola il valore iniziale Y_0: Y=1-exp(-1); % crea una tabella contenente l’esponente e il valore dell’intergrale tab(1,1:2)=[0 Y]; % calcola in un ciclo i successivi valori e li memorizza nella tabella for n=1:N Y=1-n*Y; tab(n+1,1:2)=[n Y]; end Alcune osservazioni: - la tabella è opzionale: se si è interessati solo all’ultimo valore calcolato basta cancellare le linee tab....; - il calcolo degli elementi della successione è stato eseguito senza l’uso dei vettori: una volta aggiornato il valore in Y, il valore precedente non serve per proseguire i calcoli. Se si vuole fare uso del vettore bisogna ricordarsi che l’indice 0 non è ammesso e quindi si dovrà scrivere una sequenza di istruzioni del tipo Copyright © 2008 - The McGraw-Hill Companies s.r.l. Fondamenti di analisi numerica - Maria Laura Lo Cascio 5 N=input(’esponente di x?’, ’N=’) % V(1)=1-exp(-1); % calcola in un ciclo i successivi valori for n=1:N V(n+1)=1-n*V(n); end Algoritmo 2 (Legge all’indietro) % % % % % Esempio di algoritmo stabile Calcola Y_N = l’integrale su [0,1] di x^N e^x generando una successione Y_k, k=NN, NN-1,...,N richiede il valore di N e di NN N=input(’per quale esponente (N>0) di x si vuole l’’integrale? N=’) NN=input( ’da quale valore di esponente NN>N si vuole partire? NN=’) Y=1/(NN+1); for n=NN-1:-1:N Y=1./(n+1)*(1-Y); end Suggerimento: Aggiungere nell’Algoritmo 2 le istruzioni per generare una tabella contenente in ogni riga il valore dell’esponente della x e il valore dell’integrale calcolato dal procedimento (in Y). Test Per rendersi conto di come si comporta l’errore, si adatti il programma della legge in avanti per calcolare la sequenza en = (−1)n n en−1 , n ≥ 1 con e0 = 1.e − 014 e il programma della sequenza all’indietro per calcolare En = En−1 /n, n ≤ NN − 1 con eN N = 1/(NN + 1). Copyright © 2008 - The McGraw-Hill Companies s.r.l.