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.
Scarica

Laboratorio 1