Vous êtes sur la page 1sur 14

Relazione di laboratorio per il corso

“Calcolo Scientifico”
Mario Pezzella
Marco Panico
Venerdì 5 Ottobre 2018

Sommario
La seguente trattazione riprende l’attività di laboratorio per il corso
“Calcolo scientifico” degli autori e si focalizza sull’analisi di alcuni metodi
particolari per la ricerca degli zeri di una funzione generalmente non lineare,
a valori scalari (bisezione, regula falsi, secanti e Newton Raphson) o a valori
in Ω ⊆ R2 (Newton per sistemi bidimensionali).
Per entrambe le tipologie, oltre ad una descrizione di carattere teorico,
viene fornito il codice per l’implementazione diretta in MATLAB corredato
da una serie di sperimentazioni di tipo numerico.

1 Metodi per la risoluzione di equazioni


1.1 Assetto teorico
Il problema che ci si prefigge di risolvere in tale trattazione è quello della ricerca
degli zeri di una funzione f (x), o meglio della ricerca di soluzioni all’equazione
f (x) = 0.
Anzitutto occorre osservare che condizione necessaria affinchè si possa pensare ad
un metodo numerico iterativo per la risoluzione del problema, è che l’esistenza
dello zero cercato sia assicurata, magari da risultati di natura teorica o derivanti
da altre informazioni sul particolare problema in esame.
Nel caso di funzioni a valori scalari sicuramente di importanza fondamentale è il
seguente teorema, largamente impiegato nelle situazioni di tale genere.

Teorema 1.1. (Degli zeri o di Bolzano) Sia f ∈ C 0 ([a, b] → R) funzione conti-


nua che assuma valori di segno opposto agli estremi dell’intervallo di definizione,
ovvero per cui f (a) · f (b) < 0. Per essa allora esiste almeno un punto x0 ∈ (a, b)
zero della funzione, per il quale ovvero si abbia f (x0 ) = 0.

1
Di seguito ci si metterà sempre nelle ipotesi del Teorema 1.1, sicchè sicura-
mente uno zero da ricercare esista, mentre qualora fosse necessario assicurarne
altresì l’unicità ci si metterebbe in un intervallo in cui la funzione sia strettamente
monotona.

Metodo 1.1. (Bisezione) Tale primo metodo alquanto intuitivo è così denomi-
nato poichè basato sulla ripetuta divisione dell’intervallo in cui sono assicurate
le ipotesi del Teorema 1.1, scegliendo tra i due sottointervalli ottenuti quello che
contiene almeno uno zero, ovvero quello in cui il teorema di Bolzano è ancora
utilizzabile.
Definita la funzione di cui ricercare gli zeri nell’intervallo (a, b), il primo elemen-
to fondamentale per detto metodo è la costruzione di una successione di intervalli
incapsulati {(an , bn )}n∈N tali che:

(a, b) = (a0 , b0 ) ⊃ (a1 , b1 ) ⊃ (a2 , b2 ) ⊃ . . . (ak , bk ) ⊃ . . .

tutti contenenti una radice dell’equazione f (x) = 0 e tali che

lim bn − an = 0.
n→∞

Al generico passo n il metodo, lavorando sull’intervallo (an−1 , bn−1 ), ne deter-


an−1 + bn−1
mina il punto medio, mn = per poi procedere in maniera differente
2
a seconda del caso:

• f (mn ) = 0 ⇒ mn è la radice cercata;

• f (mn )f (bn−1 ) < 0 ⇒ (an , bn ) = (mn , bn−1 );

• f (mn )f (an−1 ) < 0 ⇒ (an , bn ) = (an−1 , mn ).

Ora poichè per costruzione si ha


bn−1 − an−1 bn−2 − an−2 b 0 − a0
b n − an = = 2
= ··· =
2 2 2n
allora se come approssimazione della radice x0 dell’equazione si prende mn+1 si
ottiene la stima dell’errore
b 0 − a0
|x0 − mn+1 | <
2n+1
e benchè la convergenza di tale metodo sia assicurata da considerazioni di carattere
teorico, la velocità della stessa resta relativamente troppo bassa e ad ogni passo si
ottiene una sola cifra binaria esatta.
Il procedimento descritto è dettagliatamente illustrato nella Figura 1 riportata a
pagina 3.

2
Figura 1: Alcuni passi del metodo della bisezione, applicato all’intervallo [a1 ; b1 ]. Il
punto in rosso è la radice dell’ equazione F (x) = 0.

Ulteriore classe di metodi risolutivi per il problema esposto è quella dei meto-
di di punto fisso, il cui passo primo essenziale sta nella riscrittura dell’equazione
f (x) = 0 nella forma x = φ(x) (dove φ è una funzione detta di iterazione op-
portunamente scelta) e nella computazione xn+1 = φ(xn ) dove la successione di
punti {xn }n∈N verrà considerata approssimante lo zero x0 .

Definizione 1.1. Si definisce punto fisso del procedimento iterativo xn+1 = φ(xn )
un qualsiasi valore α che soddisfi la condizione α = φ(α).

Definizione 1.2. Il metodo iterativo che inividui la successione {xn }n∈N si defi-
nisce convergente a β se lim xn = β.
n→∞

Proposizione 1.2. Sia il metodo iterativo xn+1 = φ(xn ) convergente a β secondo


la Definizione 1.2 e sia altresì la funzione φ almeno continua nel suo dominio di
definizione. Allora β è punto fisso per φ, ovvero φ(β) = β.
Dimostrazione. Poichè per definizione xn = φ(xn−1 ), se φ è continua e lim xn = β
n→∞
allora
β = lim xn = lim φ(xn−1 ) = φ( lim xn−1 ) = φ(β)
n→∞ n→∞ n→∞

da cui si ottiene l’asserto.

Attenzione che il risultato precedente assicura che la convergenza sia con-


dizione sufficiente all’esistenza di almeno un punto fisso per la funzione φ, ma

3
tale condizione sicuramente è non necessaria; detto in altro modo, quandanche si
scegliesse una φ con diversi punti fissi, non si avrebbe la certezza che il metodo
iterativo del tipo xn+1 = φ(xn ) con essa definito sia convergente.

I metodi iterativi sono relativamente semplici da programmare ma non sempre


è possibile determinare quanto accurato sia il risultato, quantificare l’eventuale
velocità di convergenza e capire quale sia la scelta migliore per la funzione φ.
Il teorema a seguire fornisce delle condizioni sufficienti per la convergenza di un
metodo iterativo.

Teorema 1.3. Sia α un punto fisso per il procedimento iterativo xn+1 = φ(xn ),
sia h > 0 tale che x0 ∈ (α−h, α+h) e sia φ continua e derivabile in [α−h, α+h].
Allora è sicuramente vera l’implicazione

∃λ ∈ (0, 1) : |φ0 (x)| ≤ λ ∀x ∈ (α − h, α + h) ⇒ α = lim xn = lim φ(xn−1 )


n→∞ n→∞

ovvero il metodo iterativo converge ad α nelle ipotesi di esistenza di un λ siffatto.

Dimostrazione. Sia preso ad arbitrio t ∈ (α − h, α + h) e sia definito s = φ(t)


sicchè, osservato che α = φ(α) si abbia

s − α = φ(t) − α = φ(t) − φ(α).

Utilizzando il teorema di Lagrange allora ∃ξ tra t ed α per il quale si abbia

φ(t) = φ(α) + (t − α)φ0 (ξ) ⇒ s − α = (t − α)φ0 (ξ)

e quindi
|s − α| = |t − α||φ0 (ξ)|.
Inoltre poichè t ed α appartengono ambedue all’intervallo (α − h, α + h) anche ξ
vi appartiene, ovvero ∃λ tale che |φ0 (ξ)| ≤ λ e quindi

|s − α| ≤ λ|t − α|

ovvero s = φ(t) è più vicino a α rispetto a t del fattore λ, per cui l’asserto è
verificato.

Tra le righe della dimostrazione, oltre alla convergenza della successione {xn }n∈N ,
sono altresì dimostrate le seguenti due proprietà:
1. poichè ∀i xi−1 ∈ (α − h, α + h) ⇒ xi ∈ (α − h, α + h), allora l’aver scelto
il punto iniziale x0 in tale intervallo assicura che in esso giacciano tutti gli
xn termini della successione del metodo in esame;

2. ancora l’aver preso x0 ∈ (α − h, α + h) assicura che ∀i |xi − α| ≤ λi |x0 − α|,


condizione equivalente alla convergenza per i → ∞, essendo λ ∈ (0, 1).

4
La seguente definizione ultima sarà utile per la classificazione ed il confronto
dei possibili metodi iterativi della tipologia appena esposta.

Definizione 1.3. Sia {xn }n∈N successione convergente al termine ξ. Allora si


dirà la successione avere ordine di convergenza p ≥ 1 se detto ∀i ei = ξ − xi
|ei+1 |
∃c < ∞ tale che lim p = c.
n→∞ |ei |

Terminata la trattazione teorica necessaria è così possibile passare all’analisi


di taluni tra i metodi iterativi più comunemente utilizzati.

I metodi presentati partono tutti da un approssimazione iniziale x0 di α punto


fisso per la funzione φ, per poi computare una nuova approssimazione x1 consi-
derando una retta di pendenza k0 passante per il punto (x0 , f (x0 )), del quale x1
costituisce l’intersezione con l’asse delle ascisse.
In generale allora la formula iterativa di metodi siffatti diviene

f (xi )
xi+1 = xi − (1)
ki
e a seconda della pendenza scelta si ottiene un metodo piuttosto che un altro.

Figura 2: Alcuni passi della Regula Falsi, applicato all’intervallo [a1 ; b1 ]. Il punto in
rosso è la radice dell’ equazione F (x) = 0.

Metodo 1.2. (Regula falsi) Si ottiene considerando la retta secante per i punti
(x0 , f (x0 )) e (xi , f (xi )).
Esso, secondo la Definizione 1.3, ha convergenza lineare (p = 1) se f 00 (α) 6=
0, altrimenti di ordine p > 1. Rappresentazione geometrica di tale metodo è
riportata nella Figura 2.

5
Figura 3: Alcuni passi del metodo delle Secanti.

Metodo 1.3. (Secanti) Si ottiene considerando la retta secante per i punti (xi−1 , f (xi−1 ))
e (xi , f (xi )).
Esso, secondo la Definizione 1.3, ha convergenza superlineare (p ' 1.618). Rap-
presentazione geometrica di tale metodo è riportata nella Figura 3.

Metodo 1.4. (Newton Raphson) Si ottiene considerando la retta tangente alla


curva nel punto (xi , f (xi )), nelle ipotesi ulteriori che la funzione f sia derivabile
e a derivata non nulla in un intorno di x0 , ovvero prendendo ki = f 0 (xi ).
Esso, secondo la Definizione 1.3, ha convergenza almeno quadratica (p ≥ 2).
Rappresentazione geometrica di tale metodo è riportata nella Figura 4.

Figura 4: Alcuni passi del metodo delle Tangenti, o Newton Raphson che dir si voglia

6
1.2 Implementazione metodi e sperimentazione numerica
Si è proceduto allora alla stesura di un codice nell’ambiente MATLAB per la
computazione del metodo di bisezione precedentemente descritto.

Listing 1: codice MATLAB per il Metodo 1.1


1 function [x , it ]= bisezione (f ,a ,b , epsilon )
2 % Tale algoritmo implementa il metodo di bisezione per
3 % la ricerca di una radice della equazione f(x)=0
4 % INPUT
5 % [a,b]= intervallo in cui si considera il problema
6 % f=funzione di cui ricercare lo zero
7 % OUTPUT
8 % x= vettore approssimazioni dello zero
9 % it=numero iterate effettuate −2
10

11 % Assegno x(1)=a e x(2)=b allo scopo di automatizzare


12 % l’assegnazione degli estremi di ogni intervallo
13 % NOTA: ne consegue che le iterazioni reali diventeranno
14 % in numero pari a it+2
15 x (1) = a ; x (2) = b ;
16 % calcolo anche il valore della funzione negli estremi
17 fa = f ( a ); fb = f ( b );
18 % verifico che la soluzione sia contenuta nell’intervallo
19 % in caso contrario esco dalla funzione
20 if fa * fb > 0 , % non ci sono zeri nell’intervallo
21 disp ( ’ Presenza zero non assicurata ’ );
22 return
23 end
24 % se invece la soluzione risulta contenuta,
25 % calcolo il numero di iterazioni che sono disposto
26 % a fare per ottenere un risultato che stia dentro
27 % i margini di tolleranza indicati in epsilon
28 it = ceil (( log (b - a ) - log ( epsilon )) / log (2));
29 % il comando ceil(x) restituisce il primo
30 % intero maggiore di x
31

32 % avvio il procedimento iterativo, ripetendolo it volte


33 for k =3: it +2
34 % calcolo la x al passo k
35 % notare che a e b sono gli estremi individuati
36 % al passo precedente
37 x ( k ) = ( a + b )/2;
38 % calcolo il valore della funzione in quel punto
39 fxk = f ( x ( k ));
40 % se lo zero si trova nel sottointervallo di sinistra
41 if fa * fxk <= 0
42 b = x ( k );

7
43 fb = fxk ;
44 % altrimenti se si trova a destra
45 else
46 a = x ( k );
47 fa = fxk ;
48 end
49 end
50 % Infine plotto la successione di approssimazioni
51 nodi = linspace (1 , it +2 , it +2);
52 plot ( nodi ,x , ’ .: ’ , ’ MarkerSize ’ ,20)

Il codice prodotto è stato poi utilizzato direttamente per la risoluzione di un sem-


plice esercizio di seguito riproposto.

1.8
Approssimazione zero della funzione

1.6

1.4

1.2

0.8

0.6

0.4

0.2

0
1 2 3 4 5 6 7 8 9 10
Numero iterate

Figura 5: Approssimazioni 3 come zero della funzione f (x) = x2 − 3 in funzione del
numero di iterate per il Metodo 1.1, come riportato nella Sperimentazione 1.1 .

Sperimentazione 1.1. Utilizzando il codice


√ riportato nel listato presentato si è
proceduto ad approssimare il valore di 3 con una cifra decimale esatta, consi-
derando quest’ultimo come zero della funzione f (x) = x2 − 3 nell’intervallo [0, 2].
In tal modo è stato possibile ottenere, in un numero di 10 iterate, il vettore di
approssimazioni

8
 
0 2.0000 1.0000 1.5000 1.7500
xiter
10 =
1.6250 1.6875 1.7188 1.7344 1.7266
nonchè una rappresentazione dell’errore di approssimazione in relazione al nume-
ro di iterate effettuate, come riportato nella Figura 5 di pagina 8.
Si
√ osservi che la soluzione ottenuta è in accordo con quanto richiesto, poichè
3 = 1.7321 e l’approssimazione ultima ottenuta coincide con essa per la parte
intera e per la prima cifra decimale.
Si è poi proceduto a ripetere la sperimentazione imponendo una precisione mag-
giore, osservando che per ottenere due cifre decimali esatte sono necessarie 13
iterate, mentre per ottenerne tre sono neccessarie 17 iterate.

 
0 2.0000 1.0000 1.5000 1.7500
1.6250 1.6875 1.7188 1.7344 1.7266
xiter
20 =
1.7305

1.7324 1.7314 1.7319 1.7322
1.7321 1.7320 1.7320 1.7320 1.7320
In secondo luogo si è proceduto alla implementazione dei metodi di punto
fisso, con particolare attenzione al Metodo 1.2, al Metodo 1.3 e al Metodo 1.4.

Listing 2: codice MATLAB per il Metodo 1.2


1 function [x , ierr , k ]= myfalsi (f , x0 , x1 , ftol , tol , Nmax )
2 % Il seguente programma implementa l’algoritmo di
3 % regula falsi per la risoluzione di equazioni non
4 % lineari del tipo f(x)=0.
5 % Input:
6 % x0,x1= approssimazioni iniziali dello zero
7 % f=funzione di cui ricercare lo zero
8 % ftol= tolleranza massima sulle immagini della funzione
9 % tol= tolleranza massima sullo zero della funzione
10 % Nmax= numero massimo di iterate
11 % OUTPUT
12 % x= approssimazione dello zero
13 % k=numero iterate effettuate
14 % ierr= indicatore di errore
15 % (ierr = 0, se la tolleranza viene rispettata,
16 % ierr=−1 se solo quella sulla x non viene rispettata
17 % infine ierr=−2 se almeno quella sulle immagini,
18 % o entrambe, non sono rispettate).
19

20 ierr =0;
21 k =0;
22 a = x0 ;
23 x = x1 ;
24 % Vado a salvare il termine n+1 della successione in x
25 while k < Nmax && abs ( f ( x )) > ftol | abs (x - a ) > tol

9
26 a=x;
27 % salvo il termine del passo precedente
28 % per la forma dell’errore
29 coef =( f ( x ) - f ( x0 ))/( x - x0 );
30 x =x -( f ( x )/ coef );
31 % questo il termine ennesimo della successione,
32 % che salvo in uno scalare;
33 k = k +1;
34 end
35 if abs (x - a ) > tol
36 ierr = -1;
37 end
38 if abs ( f ( x )) > ftol
39 ierr = -2;
40 end

Listing 3: codice MATLAB per il Metodo 1.3


1 function [x , ierr , k ]= mysecanti (f , x0 , x1 , ftol , tol , Nmax )
2 % Tale algoritmo implementa il metodo di delle secanti
3 % per la ricerca di una radice dell’equazione f(x)=0
4 % INPUT
5 % x0,x1= approssimazioni iniziali dello zero
6 % f=funzione di cui ricercare lo zero
7 % ftol= tolleranza massima sulle immagini della funzione
8 % tol= tolleranza massima sullo zero della funzione
9 % Nmax= numero massimo di iterate
10 % OUTPUT
11 % x= approssimazione dello zero
12 % k=numero iterate effettuate
13 % ierr= indicatore di errore
14

15 ierr =0;
16 % calcoliamo il coefficiente il metodo
17 coeff =( f ( x1 ) - f ( x0 ))/( x1 - x0 );
18 % calcoliamo la soluzione approssiamata
19 x = x1 -( f ( x1 )/ coeff );
20 fx = f ( x );
21 k =1;
22 while k < Nmax && (( abs ( fx ) > ftol | abs ( x - x0 ) > tol ))
23 % aggiorniamo gli estremi
24 x0 = x1 ;
25 x1 = x ;
26 coeff =( f ( x1 ) - f ( x0 ))/( x1 - x0 );
27 x = x1 -( f ( x1 )/ coeff );
28 fx = f ( x );
29 k = k +1;
30 end
31 if k > Nmax

10
32 ierr = -1;
33 end

Listing 4: codice MATLAB per il Metodo 1.4


1 function [x , ierr , k ]= mynewton (f , fd , x0 , tol , ftol , Nmax )
2 % Il seguente programma implementa l’algoritmo di
3 % regula falsi per la risoluzione di equazioni non
4 % lineari del tipo f(x)=0.
5 % Input:
6 % x0,x1= approssimazioni iniziali dello zero
7 % f=funzione di cui ricercare lo zero
8 % fd=derivata della funzione f
9 % ftol= tolleranza massima sulle immagini della funzione
10 % tol= tolleranza massima sullo zero della funzione
11 % Nmax= numero massimo di iterate
12 % OUTPUT
13 % x= approssimazione dello zero
14 % k=numero iterate effettuate
15 % ierr= indicatore di errore
16 % (ierr = 0, se la tolleranza viene rispettata,
17 % ierr=−1 se solo quella sulla x non viene rispettata
18 % infine ierr=−2 se almeno quella sulle immagini,
19 % o entrambe, non sono rispettate).
20

21 ierr =0;
22 k =0;
23 a = x0 ;
24 x = x0 ;
25 while k < Nmax
26 if k >1 & abs (( x - a )/ x ) < tol & abs ( f ( x )) < ftol
27 break
28 end
29 % imponiamo il doppio controllo, usciamo
30 % se siamo sufficientemente vicini;
31 a=x;
32 % esso mi serve per salvare il termine di questo
33 % passo, per non perderlo successivamente;
34 x =x -( f ( x )/ fd ( x ));
35 % questo il termine ennesimo della successione,
36 % che salvo in uno scalare;
37 k = k +1;
38 end
39 if abs (( x - a )/ x ) > tol
40 ierr = -1;
41 elseif abs ( f ( x )) > ftol
42 ierr = -2;
43 end

11
Il codice prodotto è stato poi utilizzato direttamente per la risoluzione di un
semplice esercizio di seguito riproposto.

Sperimentazione 1.2. Utilizzando i codici presentati si è poi passati ad approssi-


mare gli zeri del polinomio di terzo grado p(x) = 4x3 − 10x2 + 2x + 5, lasciandosi
guidare anche dal grafico dello stesso, ivi riportato nella Figura 6.

2
f(x)=4x3 -10x2 +2x+5

-2

-4

-6

-8

-10

-12
-1 -0.5 0 0.5 1 1.5 2
x
Figura 6: Grafico della funzione p(x) = 4x3 − 10x2 + 2x + 5, come riportato nella
Sperimentazione 1.2 .

Guidati dal grafico nella determinazione della posizione degli zeri cercati, uti-
lizzando i vari metodi proposti, si è pervenuti ai risultati riportati nella Tabella 1,
nella Tabella 2 e nella Tabella 3, dove è altresì esplicita la velocità di convergenza
dei metodi in esame (le approssimazioni iniziali sono state in ogni caso scelti in
maniera accurata).

x1zero = −0.56244270988 Regula falsi Secanti Newton-Raphson


−3 −3
Tolleranza imposta 10 10 10−3
Iterate necessarie 7 5 4
Risultato ottenuto -0.56248732276 -0.56244271005 -0.56244272296

Tabella 1: Dati per il primo zero per la funzione della Sperimentazione 1.2 .

12
x2zero = 1.18166411896 Regula falsi Secanti Newton-Raphson
−3 −3
Tolleranza imposta 10 10 10−3
Iterate necessarie 6 4 4
Risultato ottenuto 1.18166841155 1.18166411896 1.18166404303

Tabella 2: Dati per il secondo zero per la funzione della Sperimentazione 1.2 .

x3zero = 1.88077859091 Regula falsi Secanti Newton-Raphson


−3 −3
Tolleranza imposta 10 10 10−3
Iterate necessarie 6 6 4
Risultato ottenuto 1.88073491096 1.880778591209 1.88077860254

Tabella 3: Dati per il terzo zero per la funzione della Sperimentazione 1.2 .

In ultima istanza si è proceduto alla implementazione del metodo di Newton


per la risoluzione di sistemi non lineari di dimensione 2, così come alla sperimen-
tazione numerica per taluni casi particolari.

Listing 5: codice MATLAB per il Metodo di Newton per sistemi bidimensionali


1 function [ zero , ierr , k ]= New_sis ( appros ,f , Jac , tol , kmax )
2 % Il seguente codice implementa l’algoritmo di Newton
3 % per sistemi non lineari, dove con f si intende la
4 % funzione vettoriale a valori vettoriali che
5 % definisce il sistema, Jac rappresenta lo jacobiano
6 % della stessa mentre appros (colonna) rappresenta
7 % la approssimazione iniziale.
8 % kmax=numero massimo di iterate, tol=tolleranza
9 % ierr= indicatore di errore, pari a 0 se la soluzione
10 % risulta sufficientemente accurata, 1 altrimenti.
11 ierr =1;
12 zero = appros ;
13 k =0;
14 while ( ierr ==1 & k <= kmax )
15 app = zero ;
16 zero = zero -[ inv ( Jac ( zero ))*( f ( zero )) ’];
17 if (( norm ( app - zero )/ norm ( app )) < tol )
18 ierr =0;
19 end
20 k = k +1;
21 end
22 if ( ierr ==1)
23 disp ( ’ Tolleranza non soddisfatta ’)
24 end

Sperimentazione 1.3. Utilizzando il codice proposto si è passati a determinare la


soluzione del sistema a seguire, vista altresì come intersezione tra le due coniche

13
rappresentate nella Figura 7.
(
(x − 2)2 + (y − 1)2 = 4
x2 + 3y 2 = 1
Le soluzioni ottenute partendo da approssimazioni inziali ricavate dallo studio

(x-2)2+(y-1)2=4
2.5 x 2+3y2=1

1.5

1
y

0.5

-0.5

-1 0 1 2 3 4
x
Figura 7: Grafico delle coniche riportate nella sperimentazione 1.3

del grafico sono:

Primo zero [x10 , y01 ] x10 = 0.0453 y01 = 0.5768


Secondo zero [x20 , y02 ] x20 = 0.6238 y02 = −0.4512

14

Vous aimerez peut-être aussi