Sunteți pe pagina 1din 193

ADRIAN CHISLI

ANA
Biblioteca de Analiz numeric surse Fortran 90

Manual de utilizare











Universitatea Tehnic din Cluj-Napoca
Cluj-Napoca, 2013
2

Not copyright
Versiune ANA (on-line): Ianuarie 2013
Ediie Manual de utilizare (on-line): Ianuarie 2013
ANA se gsete la urmtorul URL:
ftp.utcluj.ro/pub/users/chisalita/ANA/
(Manualul se gsete n folderul ANA/_DOC/)

Copyright Adrian Chisli 1991-2012

Drepturi de utilizare a bibliotecii ANA
1. n scop educaional:
- Utilizarea este liber.
- Utilizatorul are dreptul la o copie a Bibliotecii i Manualului, pentru uz
personal.
- Utilizatorul poate modifica rutinele dup voie, n scop personal. Referirea la
rutinele modificate se va face cu citarea sursei originale.
Prevederile de mai sus echivaleaz cu licena educaional.

2. n scop comercial:
- Utilizarea n scopuri comerciale, sau ncorporarea de rutine ntr-un produs
comercial, este ilegal fr obinerea unei licene comerciale.
- Reproducerea n orice form (tiprit/electronic) a Bibliotecii sau
Manualului, este interzis.
- Alte prevederi ale Legii dreptului de autor sunt aplicabile.

Reproducerea unor pri din ANA sau Manual, cu titlu de exemplu sau citare, n orice
form (tiprit/electronic), este permis numai cu menionarea copyright-ului.

Manualul de utilizare
Textul Manualului de utilizare se supune prevederilor Legii dreptului de autor.

3
Autorul garanteaz coninutul bibliotecii ANA, numai pentru utilizarea n scop
educaional.
Autorul i declin responsabilitatea pentru orice consecine care ar decurge din
utilizarea bibliotecii n alt scop.
Sursele din ANA sunt oferite aa cum sunt.
Codul surs i Manualul pot fi modificate de autor fr notificare.

Actualizare
Att sursele din ANA, ct i Manualul, sunt actualizate permanent.
Pot exista surse mai recente, sau surse suplimentare, fa de cele descrise n Manual.
Versiunile cele mai recente ale surselor se gsesc la URL-ul de mai sus.

Modificri n versiunea curent
- Au fost create supra-foldere tematice, cu numele $ NUME. Ele conin foldere
ale metodelor numerice (sau ale unor problemelor de analiz numeric). Au
fost pstrate numai ultimele versiuni ale proiectelor (ale fiierelor din
proiecte).
- A fost creat folderul ANA-OLD care conine versiuni mai vechi ale
proiectelor/surselor.









4
CUPRINS
Not copyright ........................................................................................................... 2
Actualizare ............................................................................................................ 3
INTRODUCERE Biblioteca ANA .......................................................................... 8
CAPITOLUL I REPREZENTAREA NUMERELOR N CALCULATOR i ERORI
.................................................................................................................................12
Recurrence ...........................................................................................................12
Bessel ...............................................................................................................12
Exemplul Muller-Kahan ...................................................................................13
Errors ...................................................................................................................13
Assoc_sum .......................................................................................................13
Do ....................................................................................................................14
Ecuatie_gr2 ......................................................................................................14
Integer2 ............................................................................................................15
Intrinsec_2 ........................................................................................................15
Loss_signif .......................................................................................................15
Rump_pol .........................................................................................................16
Rump II ............................................................................................................17
Special_Values .................................................................................................18
SSH ..................................................................................................................19
Sum_Armonic ..................................................................................................20
Sum_ErrFree ....................................................................................................21
Test_eps ...........................................................................................................21
Ulp .......................................................................................................................22
CAPITOLUL II ECUAII NELINIARE ...............................................................23
II-1 Ecuaii de forma f(x) = 0 ....................................................................................23
Bis ........................................................................................................................24
Secant ...................................................................................................................26
Newton .................................................................................................................29
II-2 Ecuaii de forma x = g(x). Metoda punctului fix. ................................................34
Fix ........................................................................................................................34
Stationar ...............................................................................................................37
Aitken ..................................................................................................................39
Aitken\Aitken-G ...............................................................................................42
5
II-3 Sisteme de ecuaii neliniare ................................................................................44
Fix_Sys ................................................................................................................45
Newton_Sys .........................................................................................................48
II-4 Rdcinile polinoamelor ....................................................................................50
C_pol....................................................................................................................50
Pol ........................................................................................................................53
Pol_Direct ............................................................................................................56
Pol_Complex ........................................................................................................58
Laguerre ...............................................................................................................60
Muller ..................................................................................................................63
Muller\Muller_Complex ...................................................................................67
CAPITOLUL III SISTEME DE ECUAII LINIARE ............................................70
III-1 Metode directe ..................................................................................................70
Gauss....................................................................................................................70
Gauss_AB ............................................................................................................76
LU ........................................................................................................................77
LU\Crout ..........................................................................................................85
LU_Complex ........................................................................................................85
LU_Complex\Crout_Complex ..........................................................................88
Cholesky ..............................................................................................................88
Cholesky_S ..........................................................................................................91
Cholesky_Band ....................................................................................................92
III-2 Analiza erorii i condiionare ............................................................................96
Numar_Conditie ...................................................................................................96
Hilbert ..................................................................................................................99
III-3 Metode iterative ............................................................................................. 101
Jacobi ................................................................................................................. 101
Gauss_Seidel ...................................................................................................... 103
Sor ...................................................................................................................... 105
CAPITOLUL IV VALORI I VECTORI PROPRII ............................................ 109
Problema de valori proprii (sumar) ..................................................................... 109
Power ................................................................................................................. 116
Power_Complex ................................................................................................. 123
Inverse_Power_Shift .......................................................................................... 124
6
Inverse_Power_Complex .................................................................................... 128
Sim_Iter ............................................................................................................. 131
Jacobi ................................................................................................................. 137
QR ...................................................................................................................... 143
Metoda (sumar) .............................................................................................. 143
Algoritm i cod ............................................................................................... 147
Detalii de implementare .................................................................................. 148
Balansare ........................................................................................................ 150
Fiiere ............................................................................................................. 153
Structura fiierului de date .............................................................................. 156
Exemple ......................................................................................................... 159
General_R, General_R1 ...................................................................................... 170
Problema generalizat de valori proprii ........................................................... 171
Reducerea la problema standard ...................................................................... 171
Retrieve_Eigen_from_R ..................................................................................... 176
Fiiere surs: ................................................................................................... 176
Fiiere de date (intrare): .................................................................................. 176
Fiiere de ieire (rezultate): ............................................................................. 177
INTERPOLARE .................................................................................................... 179
Newton ............................................................................................................... 179
UTILITARE ........................................................................................................... 186
Function_expression i width .............................................................................. 186
Function_expression.f90; Function_expression_g.f90; Function_expression-
2.f90; Function_expression_Sys.f90 ............................................................... 186
width.f90 ........................................................................................................ 187
Grafic ................................................................................................................. 187
Bibliografie ............................................................................................................ 189
Lista Figurilor ........................................................................................................ 191
Index ...................................................................................................................... 192





7





8

INTRODUCERE Biblioteca ANA
Metodele din ANA sunt bazate pe teoria i algoritmii expui n manualul: Adrian
Chisli, Numerical Analysis (2002). n ceea ce urmeaz, citrile unor capitole,
paragrafe, se refer la aceast lucrare.
Not:
- Unii algoritmi din ANA sunt mai evoluai dect cei expui n Numerical
Analysis.
- Unele surse din ANA pot fi mai evoluate dect cele descrise in acest Manual.
n acest caz, actualizrile i, n particular, structura fiierului de intrare, se
descriu n comentariile din programul principal (Main-...).


ANA este organizat pe foldere care conin rutinele necesare pentru utilizarea unei
metode numerice, calculul unor mrimi (exemplu: numrul de condiie), sau ilustrarea
erorilor sau preciziei n calculul cu numere reprezentate n virgul flotant.

Folderele conin fiierele surs necesare pentru construcia unui proiect. n general,
folderul conine:
1. Programul principal
2. Subrutina metodei
3. Subprogramul de tip function/subroutine pentru definirea funciei /
funciilor cu care se lucreaz (pentru ecuaii neliniare)
4. Alte subrutine utilitare
Programul principal realizeaz, cel puin, urmtoarele aciuni:
- Citete datele de intrare
- Apeleaz subrutina metodei
- Tiprete rezultatele.
Unitile de program 1 i 3 se presupun scrise de utilizator. Pentru facilitate, ele sunt
incluse n folder.
9
Unitatea 3 conine cod pentru un exemplu de test. Pentru rdcinile polinoamelor,
sistemele de ecuaii liniare i pentru problema de valori proprii, n locul unitii 3, n
folder este inclus un fiier cu datele pentru un exemplu de test. Utilizatorul va
modifica codul din 3 sau datele din exemplul de test, pentru problema concret cu
care se lucreaz.
De asemenea, utilizatorul poate modifica programul principal.
Utilitarele sunt rutine incluse n proiect, n special pentru tiprirea datelor de ieire.
Descrierea lor se d n capitolul UTILITARE.

Nume foldere. Nume uniti de program i fiiere asociate
n general:
- Numele folderului este o mnemonic a metodei.
- Numele subrutinei metodei este tot o mnemonic a metodei.
Exemplu: pentru metoda biseciei, numele folderului i al subrutinei este BIS.
- Programul principal are numele MAIN- urmat de numele subrutinei. Exemplu:
MAIN-BIS.
- Numele funciei este fun, f, g, etc.
n cteva cazuri, programul principal ncorporeaz i metoda; n acest caz, numele
unitii de program este o mnemonic a metodei (fr a mai fi precedat de MAIN-).
Nume foldere/Nume Fiiere Surs
- Pentru metodele n dubl precizie, n general, numele folderului i numele
fiierelor surs, sunt succedate de caracterele _D, _d.
(n versiuni mai vechi, ar putea fi precedate de caracterele D, d).
- Fr sufix (sau prefix): n general: Metode i surse n simpl precizie.
Uneori, rutina ncorporeaz mai multe niveluri de precizie.
Not
- Cnd numele folderului sau al unui fiier-surs conine o specificaie de an,
codul din acestea este n versiunea cea mai recent.
Exemplu (folder): Gauss 2010 i Gauss.
- Cnd numele folderului sau al unui fiier-surs conine terminaia -IVF,
compilarea este presupus pentru compilatorul Intel Visual Fortran.
10


Cod
n scrierea codului, s-a dat ntietate claritii programrii metodei, uneori n dauna
compacitii codului. Datele de intrare se citesc fie de la terminal, fie dintr-un fiier de
date. Aceeai observaie pentru scrierea datelor de ieire. Cnd se utilizeaz un fiier
de date, n general, datele de ieire se scriu n acest fiier, n continuarea datelor de
intrare. Soluia fiierului de date se poate adopta ntotdeauna, prin modificarea
codului.
- Pentru simplificare, n versiunile mai vechi de cod, s-a evitat utilizarea
ferestrelor de dialog pentru deschiderea / selectarea / crearea unui fiier sau
directoriu. n acest caz: fiierul de intrare se specific cu cale complet; sau, se
poate specifica numai cu nume, dac fiierul se gsete n folderul proiectului
(n acelai folder cu sursele).
- n versiunile actuale de cod, operaiile de mai sus se fac prin fereastra de
dialog standard (n particular, selectarea fiierului de intrare).
Codurile prezentate n versiunea simpl precizie, pot fi convertite uor la dubl
precizie prin adugarea declaraiilor necesare. Limbajul este Fortran 90/95.
Unitile de program conin comentariile necesare pentru semnificaia datelor de
intrare, parametrilor de apel ai subrutinelor, etc. Pentru concretizarea datelor de
intrare v. fiierul de test al metodei.

Observaie
Testele de oprire a unei iteraii sunt, n general, de forma: eps x x
n n
s
+
| |
1
i
numr de iteraii lnit. Tolerana eps i numrul maxim de iteraii lnit sunt date
de intrare. Trebuie ca ) (
n
x ULP eps > , unde ) (
n
x ULP este cel mai mic numr care
adunat la
n
x d, prin rotunjire, un numr mai mare ca
n
x v. Cap. 1, 3.6. n caz
contrar, cu excepia cazului
n n
x x =
+1
, primul test nu poate fi satisfcut i iteraia
se oprete prin depirea lui lnit. Uneori codul testeaz i corecteaz tolerana eps
introdus de utilizator v. ca exemplu metoda biseciei. n caz contrar, la
introducerea datei eps, utilizatorul se va ine cont de condiia de mai sus
11

Utilizare
Cu rutinele din folder se construiete un proiect de tip Console Application. Pentru
simplificare i portabilitate, rutinele nu conin dialoguri i nici ieiri grafice. Utilizarea
este presupus pentru compilatorul Compaq Visual Fortran 6.6C, 2002 (i pentru
mediul Developer Studio), dar rutinele pot fi utilizate i pe o alt platform. n
particular, rutinele cu numele nume-IVF se refer la compilatorul Intel Visual Fortan
11.x, 2010 (i mediul Microsoft Visual Studio 2008).

Descrierea fiierelor din foldere i a metodelor numerice, se d n capitolele
urmtoare. Pentru unele metode (n particular: Muller, problema de valori proprii, i
Interpolare), prezentarea teoretic este mai desvoltat.
Pentru detalii suplimentare, ca i pentru cele mai recente actualizri, v. comentariile
din surse. Unele comentarii pot fi n limba englez.
Avertizare: Exemple de test i Rezultate
Majoritatea rezultatelor numerice din exemplele de test sunt obinute prin
rularea cu un procesor Pentium IV, i cu compilatorul CVF 6.6c cu opiunile
de compilare implicite al mediului Developer Studio, dac nu se specific
altfel. (Cu excepia rezultatelor indicate ca obtinute cu compilatorul IVF 11.1;
procesorul este Intel Duo T2450).
Utilizarea altor procesoare i altor compilatoare (sau opiuni de compilare) ar
putea face ca, n unele cazuri, rezultatele numerice s nu se reproduc exact
ci numai apropiat.


Fonturi
Text: Times New Roman
Nume foldere: Arial
Nume fiiere; nume rutine: Arial 11
Date de intrare; rezultate (din fiierul de ieire); secvene de cod: Courier New 11

Caracterul indic sfritul unei Propoziii, Observaii, Exemplu, etc.
12

CAPITOLUL I REPREZENTAREA NUMERELOR N
CALCULATOR i ERORI
Foldere tematice: $ Recurrence ; $ Errors; $ Ulp.
Recurrence
Bessel
Calculul funciei Bessel: direct, i prin recuren. Se pune n eviden, instabilitatea
algoritmului bazat pe formula de recuren cu trei termeni. Implementarea Exemplului
4, Cap. 0, 2.2.
Fiiere:
Bessel.f90

Se calculeaz valorile funciilor Bessel de spea I-a, pe argumentul 1 = y , pentru
10 , 1 = m , n dou moduri:
(a) Direct (serie): ( )
( )
( )

=
0
4
1
2
1
! !
) 1 (
k m k
J
k
m
m

Seria se trunchiaz n momentul cnd termenul curent este mai mic dect, sau
egal cu 1E-15 (i se nsumeaz cel mult 100 termeni). Valorile obinute se
consider valorile exacte.
(b) Prin recuren: ) 1 ( ) 1 ( 2 ) 1 (
1 1 +
=
m m m
J J m J
Se pornete cu valorile ) 1 (
0
J i ) 1 (
1
J calculate cu trei grade de precizie,
exprimate prin numrul de cifre semnificative exacte: 1516 (dubl-precizie),
10, i 7 (simpl precizie). Calculul, cu aceste valori de pornire, se face n dubl
precizie.

Rezultatele se scriu n fiierele bess-n.rez, unde 16 ; 10 ; 7 = n .
Pentru calculul direct: numrul de termeni care se nsumeaz efectiv este 9 5
(pentru 10 , , 1 , 0 = m ); acest numr se listeaz n fiierul de ieire. Primul termen
neglijat n serie este de ordinul
18 17
10 10

; acest termen se listeaz la display.
13
Se remarc divergena cresctoare cu m, a valorilor calculate prin recuren n raport
cu valorile exacte chiar pentru un numr mare de cifre semnificative (16), n
0
J i
1
J . Singurele erori introduse n calculul (b) sunt erorile de rotunjire n valorile lui
0
J
i
1
J .
Exemplul Muller-Kahan
Cf. Kahan [2006].
Se consider funcia
y z z y f / ) / 1500 815 ( 108 ) , ( =
Se definete irul:
1 ), , (
25 . 4 ; 4
1 1
1 0
> =
= =
+
n x x f x
x x
n n n

irul converge ctre o limit L; se propune a se gsi L, prin calculul lui
n
x pentru
" mare " = n , de exemplu 80 ~ n .
Calculul n dubl precizie (i n precizie extins) conduce la 100 ~ L . Limita
adevrat este 5 = L - v. Lucr. citat.
Exemplul arat instabilitatea formulei de recuren cu 3 termeni pentru calculul lui
1 + n
x .
Not
Calculul n precizie cvadrupl d rezultatul corect, anume:
=
81
x 4.99979690071464772103694582965119
Errors
Folderul conine urmtoarele sub-foldere, coninnd ilustrri de erori, n calculul cu
numere reprezentate n virgul flotant.
Assoc_sum
Ne-asociativitatea sumei.
Fiiere:
Sum_1.f90, FP_precis.f90

Se consider termenii
x1 = 1.25E20; x2 = 555.5,
14
i sumele
s1_p = x1 + x2 x1
s2_p = x1 x1 + x2.
p noteaz precizia pentru reprezentarea termenilor (i a sumelor pariale), anume:
s: precizie simpl (24 bii), d: precizie dubl (53 bii), i e: precizie extins (64 bii).
Precizia de reprezentare de 64 bii se seteaz cu subrutina fpprecis.
Rezultatele se scriu n fiierul sum.rez, anume:
s1_s = 0.000000
s1_d = 0.000000000000000
s1_e = 552.0000000000000000
Suma s2_p are valoarea corect (pentru oricare p): s2 = 555.50 0.
Do
Calculul unei sume ntr-un ciclu DO, n formele:
sum1 = 0.; sum1 = sum1 +h; n termeni.
sum2 = j-h; n j , 1 =
Fiiere:
Do2003.f90

Programul listeaz sum1, sum2, i eroarea relativ a lui sum1, pentru
6
10 = n , cu
pasul 20,000. Se observ c eroarea relativ crete odat cu numrul termenilor.
Ecuatie_gr2
Pierderea de semnificaie la rdcinile unei ecuaii de gradul 2.
Fiiere:
Ecuatie_gr2.f90

Se consider ecuaia 0 1 26
2
= + x x , cu rdcinile 168 13
2 , 1
= x . Rdcinile se
calculeaz n simpl i dubl precizie; valorile n dubl precizie se consider valorile
exacte. n simpl precizie, rdcina
2
x se calculeaz n dou moduri: dup formul
caz n care apare pierdere de semnificaie, i sub forma
168 13
1
, 2
+
=
m
x . Se listeaz
erorile relative ale rdcinilor; se constat c valoarea
m
x
, 2
este exact.
15
Integer2
Calculaii cu integer(2).
Fiiere:
Integer2.f90

Se tie c integer(2) se reprezint pe 2 octei, iar plaja de reprezentare este
32767 ) 2 ( 32768 s s integer (Cap. 1, 2). Programul testeaz suma 2 32767 i + , unde
i2 este integer(2); de exemplu, pentru i2 = 3, se obine -32766. Explicaie: termenii
sumei se reprezint ca mai jos (Cap 1, 2; vezi i reprezentarea acestor numere cu
utilitarul Bitview):
0|1111111 11111111 = 32767
0|0000000 00000011 = 3
Adunarea produce numrul
1|0000000 00000010 = -32766
Intrinsec_2
Apelul funciilor intrinseci Fortran, pentru parametrii reprezentrii.
Fiiere:
Intrinsec-2.f90

Se exemplific apelul, pentru o dat real(4) i real(8), a urmtoarelor funcii
intrinseci:
Digits; Exponent; Fraction; Maxexponent; Minexponent; Nearest; Huge; Precision;
Range; Spacing; Tiny; Epsilon.
Se testeaz 1 + epsilon(1.0) > 1.
Pentru semnificaia funciilor intrinseci v. Compaq Visual Fortran Language
Reference Manual, 2001.
Loss_signif
Pierderea de semnificaie.
Fiiere:
Loss_signif.f90

Proiectul implementeaz Exemplul 2, Cap.2, 4.1. Se consider calculul funciei:
16
) 1 ( ) ( x x x x f + = ,
pentru
j
x 10 = , j = 1, 2, 7, n simpl i dubl precizie. Valorile f (x) calculate n
dubl precizie sunt considerate valorile exacte. Se calculeaz n simpl precizie,
valorile funciei g(x) dat de
x x
x
x g
+ +
=
1
) ( .
g este transformata lui f, care evit calculul diferenei x x +1 care produce
pierderea de semnificaie. Analitic, g(x) = f(x).
Se listeaz: valorile f(x) n simpl precizie; valorile f(x) n dubl precizie, rotunjite la 8
cifre semnificative; valorile g(x) n simpl precizie. Se observ c:
- Valorile f(x) n simpl precizie se altereaz odat cu creterea lui j, datorit
pierderii de semnificaie.
- Valorile g(x) au 7 cifre semnificative corecte.
Rump_pol
Polinomul lui Rump [Rump S.E., 2010, 1988].
Fiiere:
main-rump.f90; FP_precis.f90;

Se consider funcia
) 2 /( 5 . 5 ) 2 121 11 ( 75 . 333 ) , (
8 4 6 2 2 2 6
y x y y y y x x y y x f + + + =
i evaluarea lui funciei, pentru x = 77617 i y = 33096.
(Partea esenial e constituit din polinomul format de primii 3 termeni i, din acest
motiv, exemplul poart numele de polinomul lui Rump. Polinomul a fost considerat
de Rump in 1983 i reluat in lucrarea din 1988).
Programul listeaz valorile polinomului calculate cu 3 nivele de precizie (oferite de
compilatorul CVF 6.6), anume:
24 bii (precizie simpl): -1.180592E+21
53 bii (precizie dubl): -1.180591620717411E+21
64 bii (precizie extins): 5.764607523034234880E+17
Valoarea corect:
-0.82739 60599 46821 36814 11650 95479 81629 19990 331
17
(obinut cu precizie de 43 cifre zecimale de precizie; 144 bii).
Not
n precizie cvadrupl (compilatorul IVF 11.1), se obine:
113 bii (Precizie cvadrupla): 1.17260394005318

Pentru rezultate similare, obinute cu compilatorul FORTE Developer 6 (Fortran 95,
Sun) v. Loh & Walster (2002).
Explicaie:
Cei patru termeni ai polinomului au valorile:
t1: 4.386057508463932E+29
t2: -7.917111779274714E+36
t3: 7.917111340668962E+36
t4: 1.17260394005318
Astfel, nu se produce depire de format nici pentru simpla precizie. Dar termenii doi
i trei sunt egali cu aproximativ
123
2 , i astfel, pentru reprezentarea cu toate cifrele
pentru evitarea pierderii de semnificaie, este necesar o precizie de cel puin 123 bii.
Ori, chiar precizia cvadrupl (real(16)) nu ofer dect 113 bii. Astfel, pentru
evaluarea polinomului n forma dat, trebuie apelat la un pachet multi-precizie cum
este, de exemplu, MPFUN, v. High-Precision Software Directory, 2010.
Explicaia analitic este urmtoarea (Loh & Walster (2002)): x i y dai, satisfac
relaia 1 5 . 5
2 2
+ = y x . Cu aceasta, termenii de ordin superior lui 1 n x i y se reduc, i
expresia polinomului devine
y
x
y x f
2
2 ) , (
1
+ = .
Astfel, suma adevrat a primilor 3 termeni (exceptnd fracia) este -2.
Programul listeaz i valoarea lui ) , (
1
y x f , calculat n precizie dubl.

Rump II
Polinomul nr. 2 al lui Rump [Rump S.E., 2010]
Fiiere:
main-rump II.f90; FP_precis.f90;

18
Exemplul este similar cu cel din paragraful anterior, dar cu o expresie mai simpl; a
fost introdus de Rump in 2010.
b a b b a a b b b b a a b b b a f + + = 2 / 10 55 2 21 ) , (
Se calculeaz n aceleai valori: a = 77617.; b = 33096.
Suma primilor 4 termeni este -2 (valoarea adevrat).
Programul listeaz, ca in ex. precedent, valorile polinomului calculate cu 3 nivele de
precizie (compilatorul CVF 6.6), i anume:
24 bii (precizie simpl): 1.17260
53 bii (precizie dubl): 1.17260396480560
64 bii (precizie extins): 1.172603964805603027

Cu precizie cvadrupl (compilatorul IVF 11.1), se obine:
-.827396059946821368141165
Valoarea corect cu 43 cifre zecimale de precizie, este tot cea din paragraful
Rump_Pol, ntruct analitic, polinomul se scrie
b
a
b a f
2
2 ) , (
1
+ =
Note
- Rezultatul calculat cu precizie cvadrupl (113 bii, compilatorul IVF 11), are
toate cifrele semnificative corecte (24);
- Valoarea corect se obine cu MPFUN, cu minimum 22 cifre zecimale de
precizie, anume: -.8273960599468213681411;

Special_Values
Valori speciale.
Fiiere:
Special_Values.f90

Programul ilustreaz calculul i tiprirea urmtoarelor valori speciale Cap.1, 3.5:
- Zero cu semn: -0.; . 0 ) 1 ( -
- Infinit cu semn: . 0 / . 1
- NaN (Not a Number): 0./0; (1./0)-0; (1./0) +(-1./0)
- Numr denormalizat: 10
-45

19
- Depire format (superioar): 10
40

- Depire format (inferioar): 10
-46

n Project Settings, se va seta opiunea Enable IEEE Minus Zero Support, n tab-ul
Fortran/Floating Point.

SSH
Problema Sea Surface Height.
Fiiere:
Main_SSH-2.f90
ssh.dat

Un model de circulaie a oceanului a fost desvoltat de He & Ding (2001). Variabila
SSH stocheaz nlimea medie a suprafeei mrii, din simularea n model. Datele
corespunznd simulrii dintr-o zi, pentru o reea de 12064 = 7680 de puncte (120
longitudini i 64 de latitudini), au fost stocate ntr-un tablou ssh(120,64), cu
precizia de 64 bii. Datele sunt numere de ordinul de mrime
14 10
10 10 i de semne
diferite, n timp ce rezultatul sumrii e de ordinul lui 1.
Datele se citesc din fiierul de intrare ssh.dat. Ele se gsesc stocate cu 17 cifre
zecimale.

Programul calculeaza suma elementelor din tabloul ssh, cu precizie dubl i
cvadrupl.
Not
Pentru compilatorul CVF 6.x, instruciunile referitoare la tipul real(16) vor fi
fcute comentarii (sau eliminate)
Ordonarea sumei dup diferite criterii produce rezultatele de mai jos:
Real(8):
sum_row = 7.39062500000000
sum_col = 7.39062500000000

sum_row_reverse = 6.93945312500000
sum_col_reverse = 6.64746093750000

Sum on array (Real(8)):
20
sum_plus = 2.651252030584858E+016
sum_minus = -2.651252030584855E+016
sum_plus +sum_minus = 24.0000000000000

Real(16):
sum_row_16 = 0.357985839247703552246093750000000
sum_col_16 = 0.357985839247703552246093750000000

Valoarea corect este cea obinut cu precizia cvadrupl (real(16)) oferit de
compilatorul IVF 11.1.
Not
Rezultatul corect se poate obine i cu pachetul soft de precizie multipl MPFUN
(Bailey, 2010). He & Ding au utilizat metoda sumrii auto-compensat (SCS).

Sum_Armonic
Suma seriei armonice strategia de sumare.
Fiiere:
Sum-armonic.f90

Programul calculeaz suma
n
S
1
4
1
3
1
2
1
1 + + + + + = ,
pentru
i
n 10 = , i = 2, 3, ..., 7, astfel:
a) Sum_Smallest: de la cel mai mic la cel mai mare simpl precizie;
b) Sum_Largest: de la cel mai mare la cel mai mic simpl precizie;
c) Sum_Double: de la mic la mare dubl precizie, pentru
Sum_Double se consider valoarea exact. Se listeaz valorile sumelor i erorile
relative ale primelor dou sume. Se observ, pentru 5 > n , c eroarea relativ a sumei
(a) este mai mic dect cea a sumei (b).
Proiectul conine i sursa pentru calculul sumei seriei armonice alternate.
n Project Settings, se va seta opiunea "Enable Floating Point Consistency"
21
Sum_ErrFree
Algoritm de sumare fr erori.
Fiiere:
Main-ErrFree.f90; sub-Sum_2.f90; sub-Sum_N.f90; width.f90;

Proiectul implementeaz un algoritm de sumare precis din Ogita T., Rump S.M., and
Oishi S., Accurate Sum and Dot Product (2003). Acesta este definit de urmtorii doi
algoritmi:
Algorithm 3.1. Error-free transformation of the sum of two
floating point numbers.
function [x, y] = TwoSum(a, b)
x = fl(a + b)
z = fl(x a)
y = fl((a (x z)) + (b z))

Algoritmul 3.1 transform dou numere a, b reprezentate FP, n alte dou numere FP
x, y, astfel c: y x b a + = + i ) ( b a fl x + = .

Algorithm 4.1. Cascaded summation.
function res = Sum2s(p)
1 = p1; 1 = 0;
for i = 2 : n
[i, qi] = TwoSum(i1, pi)
i = fl(i1 + qi)
res = fl(n + n)

Algoritmii sunt implementai prin rutinele sum_2(a,b,x,y) i sum_N(n, p,
s_EF, cor). Cu acetia, se calculeaz suma din proiectul Assoc_sum. Se obine
valoarea corect.
Test_eps
Test pentru eroarea de rotunjire a unitii.
Fiiere:
test_eps.f90

22
Se definesc (Cap.1, 3.8):
24
0 . 2 _

= EPS machine ;
23
0 . 2 1

= ULP ; ) 0 . 1 ( EPSILON EPS = ;
Se testeaz c:
1 + ULP1 >1.0
1 + machine_EPS = 1.0
1+ EPS >1.0

Ulp
Calculul lui ULP(x), pentru o plaj de valori x.
Fiiere:
main-ULP2003.f90; ULP(x)-2003.f90;

Se definete v. Cap.1, 3.8,
P e
x ULP

= 2 ) ( ,
unde: e este exponentul reprezentrii lui x n modelul tiinific, returnat de funcia
exponent(x); P este precizia reprezentrii, n bii ( 24 = P sau 53 = P ).
Se calculeaz:
) ( 1 x ULP x x + = ; 2 / ) ( 2 x ULP x x + =
Se testeaz c:
x x x x = > 2 ; 1 .

Pentru test, se recomand:
- O plaj de valori 31 1 = x ;
- O valoare mare (de ex. 1E6).
Programul listeaz parametrii reprezentrii lui x (n modelul tiinific), anume fracia
i exponentul, ULP(x), i verific relaiile de mai sus.

Folderul conine sursele pentru versiunea n simpl precizie; folderul Ulp_d conine
sursele pentru versiunea n dubl precizie.
23

CAPITOLUL II ECUAII NELINIARE
Folder tematic: $ Nonlinear Equations
Problema: Foldere:
1. Ecuaii de forma f(x) = 0: Bis; Secant; Newton;
2. Ecuaii de forma x = g(x), metoda punctului fix: Fix; Stationar; Aitken;
3. Sisteme de ecuaii neliniare: Fix_Sys; Newton_Sys;
4. Rdcinile polinoamelor: C_pol; Pol; Pol_Direct; Pol_Complex;
Laguerre; Muller.

II-1 Ecuaii de forma f(x) = 0
Pentru metodele biseciei, Newton i secantei, funcia de test este:
2
3 ) ( x e x f
x
=
Aceasta admite 3 rdcini situate n intervalele [-1,0], [0,1], [3,4].
Aproximaiile rdcinilor, cerute de metodele numerice (respectiv, intervalele care
conin rdcina), se determin prin metode algebrice.
Mai simplu, aproximaiile rdcinilor se pot gsi prin inspecia graficului funciei.
Ca exemplu, graficul funciei
2
3 ) ( x e x f
x
= se d mai jos.
Acesta este construit cu programul GRAPH, pe baza fiierului de ieire din programul
coninut n folderul Grafic.











24



Figura 1 Graficul funciei
2
3 ) ( x e x f
x
=


Bis
Metoda biseciei.
Fiiere:
Bis2005.f90: subrutina metodei
Main_Bis2005.f90: programul principal
Fun.f90: subprogram de tip function, care definete funcia f(x). Expresia
funciei poate include un parametru p; dac exist, valoarea lui p este
dat de intrare.
Function_expression.f90, width.f90: UTILITARE.
25

Metoda:
Funcia f se presupune definit i continu pe intervalul ] , [ b a , lund valori de semne
contrare n capetele intervalului, i avnd o singur rdcin n interval.
Se definete
2 / ) ( b a c + =
Se ia ca nou interval ] , [ b a acela dintre ] , [ c a i ] , [ b c n care funcia ia valori de
semne contrare la capete; etc. irul punctelor c converge la rdcin, liniar.

Subrutina metodei este:
bis(f, a, b, eps, iter, rad, kod, ktip)

Parametrii formali sunt:
f: Numele funcei f(x). Este declarat cu atributul external in programul
principal.
a, b: Intervalul care conine rdcina.
eps: Tolerana.
iter: Numrul maxim de iteraii lnit (intrare) / Numrul efectiv de iteraii (ieire)
rad: Rdcina calculat.
kod: Cod de terminare a iteraiei (utilizat intern):
0: s-a atins tolerana eps
1: s-a depit lnit
-1: pentru intervalul specificat f(a)-f(b) > 0
2: rdcin n a sau b
ktip: Cod de tiprire iteraii: 0 (Nu); = 0 (Da)

Testul pentru atingerea toleranei eps este
eps c b s | | ,
unde ] , [ b a este intervalul curent. Metoda ajusteaz tolerana eps: dac ) (c ULP eps < ,
se pune ) (c ULP eps = .

Datele de intrare se introduc de la terminal.
26
Rezultatele se scriu n fiierul de ieire nume.rez, unde nume este introdus de
utilizator, i conin:
- expresia funciei f (scris de utilitarul Function_expression)
- [p, dac exist]
- datele de intrare a, b, lnit, eps
- modul de ncheiere a iteraiei (mesaj, conform codului kod)
- rdcina calculat rad
- valoarea f(rad)
- numrul efectiv de iteraii.

Datele de intrare pentru exemplul de test (3 rdcini):
a, b: -1, 0; 0, 1; 3, 4
eps: 1E-6
lnit: 50; 20; 20
ktip: 0 sau 1
Rezultate:
Tolerana eps atins.
Radacini / Numr de iteraii
-0.4589624 20; 0.9100084 20; 3.733079 20;

Exerciiu
Rulati, din nou, pentru una dintre rdcini, cu tolerana 1E-8 i lnit = 30

Secant
Metoda secantei.
Fiiere:
Secant2005.f90: subrutina metodei
Main_Secant2005.f90: programul principal
fun.f90: subprogram de tip function, care definete funcia f(x).
Expresia funciei poate include un parametru p.
Period.f90: subrutin pentru perioada procesului staionar
Function_expression.f90; width.f90: utilitare

27
Metoda:
Funcie f continu pe un interval n jurul rdcinii .
Formula de iterare este
) ( ) (
) (
1
1
1

=
n n
n n
n n n
x f x f
x x
x f x x ; 1 > n ;
0
x i
1
x = date.
Aproximaiile
0
x i
1
x pot ncadra sau nu rdcina.
Dac
0
x i
1
x sunt suficient de apropiate de (i f f ' , i f ' ' sunt continue), irul
o
n
x , iar ordinul de convergen este 618 . 1 ~ p .

Subrutina metodei este:
secant(f, x0, x1, eps, lnit, rad, kod)

Parametrii formali sunt:
f: numele funciei;
x0, x1: cele dou aproximaii iniiale cerute de metoda secantei.
eps: Tolerana
lnit: Numrul limit de iteraii (intrare); numrul efectiv de iteraii (ieire)
rad: Rdcina calculat
kod: Intrare: cod de tiprire a iteraiilor: 0 (nu); = 0 (da)
Ieire: cod de ncheiere a iteraiei (intern)
0: tolerana eps atins
1: depirea numrului maxim de iteraii admis lnit
2: Proces staionar
-1: divergen
-2: numitor nul n formula metodei.

Teste:
Testul pentru atingerea toleranei eps este
eps x x s | 1 2 |
Testul pentru divergena local este
| 0 1 | | 1 2 | x x x x > ,
unde x0, x1, x2, sunt trei iterate succesive. Acest test nu oprete iteraia.
28
Testul de numitor nul este
f eps x f x f _ | ) 0 ( ) 1 ( | s ,
unde tolerana este aleas ca 7 2 _ = E f eps (aceast valoare se poate modifica).

Datele de intrare se introduc de la terminal.
Rezultatele se scriu n fiierul de ieire nume.rez, unde nume este introdus de
utilizator, i conin:
- expresia funciei f (scris de utilitarul Function_expression)
- [p, dac exist]
- datele de intrare x0, lnit, eps
- diferena curent dif, la ncheierea iteraiei
- modul de ncheiere a iteraiei (mesaj, conform codului kod)
- rdcina calculat rad; valoarea f(rad)
- numrul efectiv de iteraii.
n cazul tipririi iteraiilor (ktip = 0), dac procesul manifest divergen se scrie
mesajul divergen local.

Datele de intrare pentru exemplul de test (3 rdcini) se dau mai jos. Ca aproximaii
iniiale se iau capetele intervalelor din metoda biseciei.
x0, x1: -1, 0; 0, 1; 3, 4;
eps: 1E-6
lnit: 10; 10; 10
ktip: 0 sau 1
Rezultate:
Tolerana eps atins.
Rdcini / Numr de iteraii
-0.4589623 7; 0.9100076 6; 3.733079 7;

Observaie
Ca aproximaii iniiale s-au luat capetele intervalelor considerate n metoda
biseciei, i aceeai tolerana eps ca n metoda biseciei. Aceasta, pentru a compara
rezultatele metodei secantei cu cele din metoda biseciei (anume: valoarea
rdcinii i numrul de iteraii)
29

Newton
Metoda Newton (o singur ecuaie).
Fiiere:
Newton.f90: subrutina metodei
Main_Newton.f90: programul principal
sub.f90: subprogram care definete (i returneaz) valorile funciei f(x) i
derivatei ) (x f ' . Expresia funciei f(x) poate include un parametru p.
Period.f90: funcie care returneaz perioada procesului staionar
Function_expression; Function_expression-2.f90; width.f90: utilitare.

Metoda:
Funcie f continu i derivabil, n vecintatea unei rdcini .
Formula de iterare este
dat ; 0 ;
) (
) (
0 1
= >
'
=
+
x n
x f
x f
x x
n
n
n n

Dac
0
x este suficient de aproape de rdcina simpl (i f f ' , i f ' ' sunt
continue), irul
n
x converge ctre , cu ordinul de convergen 2.

Subrutina metodei este:
Newton(SUB, x0, eps, lnit, rad, kod, n_div)

Parametrii formali sunt:
SUB: Numele subrutinei care returneaz valorile funciei i derivatei
x0: Aproximaia iniial
eps: Tolerana
lnit: Numrul limit de iteraii (intrare); numrul efectiv de iteraii (ieire)
rad: Rdcina calculat
kod: Intrare: cod de tiprire a iteraiilor: 0 (nu); = 0 (da)
Ieire: cod de ncheiere a iteraiei (intern)
0: tolerana eps atins
1: depirea numrului maxim de iteraii admis lnit
30
2: Proces staionar
-1: divergen
-2: derivata funciei in x0 este aproximativ nul.
n_div: Numrulde divergene locale

Subrutina SUB este:
sub(f, f1, x)
f: Valoarea funciei pe x; Expresia funciei poate include un parametru p; dac
exist, valoarea lui p este dat de intrare.
f1: Valoarea derivatei pe x
x: Aproximaia curent

Observaie Teste:
Se definete diferena curent dif, prin:
0 x x dif = ,
unde x este valoarea iteratei curente, i x0 valoarea iteratei la pasul anterior.
- Testul pentru atingerea toleranei eps este:
eps dif s | |
- Testul pentru divergen este
| _ | | | ant dif dif > ,
unde dif_ant este diferena dif de la pasul anterior.
Pentru analiza tipului de divergen, satisfacerea testului de divergen nu oprete
iteraia, ci produce numai un mesaj n fiierul de ieire.
- Testul pentru derivat nul pe x este
10 1 | 1 | s E f
unde ) ( 1 x f f ' = .
- Se mai testeaz ntlnirea unui proces staionar.


31
Datele de intrare se introduc de la terminal.
Rezultatele se scriu n fiierul de ieire nume.rez, unde nume este introdus de
utilizator, i conin:
- expresia funciei f (scris de utilitarul Function_expression)
- [p, dac exist]
- datele de intrare x0, lnit, eps
- diferena curent dif, la ncheierea iteraiei
- [n_div, dac exist divergene locale]
- modul de ncheiere a iteraiei (mesaj, conform codului kod)
- rdcina calculat rad; valoarea f(rad)
- numrul efectiv de iteraii.

Datele de intrare pentru exemplul de test (3 rdcini), sunt:
x0: -0.5; 0.5; 3.5;
eps: 1E-6
lnit: 10; 10; 10
ktip: 0 sau 1
Rezultate:
* Toleranta EPS s-a atins:
Rdcini / Numr de iteraii
-0.4589623 4; 0.9100076 5; 3.733079 5;

Observaie
Ca aproximaii iniiale x0, s-au luat mijloacele intervalelor considerate n metodele
biseciei i secantei, i aceeai toleran eps. S-a procedat astfel, pentru a compara
rezultatele metodei Newton cu cele din metodele biseciei i secantei (valoarea
rdcinii i numrul de iteraii).
Aproximaii iniiale mai bune pot fi obinute de pe graficul funciei f. Cu o
aproximaie x0 mai apropiat de rdcin, numrul de iteraii necesar pentru
atingerea toleranei eps va fi mai mic

Folderul Newton conine un sub-folder Newton_r. Structura de fiiere este aceeai.
32
Subrutina Newton (fiier Newton_r.f90) tiprete, n plus, valorile
) 0 1 /( ) 1 2 ( x x x x lambda = , pentru identificarea rdcinilor multiple ale lui f
Observaie: Proces staionar n metoda Newton
Fie funcia:
x x x x x f sin 3 cos 5 7 ) ( + =
i iterm cu aproximaia iniial 5
0
= x . (n fapt, nu exist rdcini n vecintatea
lui
0
x ).
Iterarea n metoda Newton duce la divergen local (ntlnit la pasul 3). Dac nu
oprim procesul iterativ, atunci, la iteraia 19, apare rezultatul:
Iteratia 19: x(19) = x(17)
** Proces stationar de perioada = 2
17 6.427927
18 5.017017
19 6.427927
Rezultatul se verific n figura de mai jos, n care se reprezint graficul funciei f
i al tangentelor la graficul lui f, n punctele de abscis 5.017017 i 6.427927.
Procesul staionar apare dac iteraia nu este oprit cnd se ntlnete divergena
cum se face n mod obinuit.


33

Figura 2 - Proces staionar n metoda Newton


Exerciiu:
Iterai cu: x0 = 6.12; eps = 1E-7 i nlim = 1000. Rezultat: proces staionar de perioad
5

Observaie
Pentru acest exemplu, metoda secantei cu aproximaiile iniiale 4.9 i 5.1 d
divergen local n primii pai, convergnd apoi la rdcina x = 0
34

II-2 Ecuaii de forma x = g(x). Metoda punctului fix.
Ecuaia de test este ) (x g x = , echivalent cu 0 ) ( = x f , unde
2
3 ) ( x e x f
x
= .
) (x g se determin prin prima procedur explicit de punct fix, anume
) ( ) ( ) ( x f x x x g u = , unde p x = u ) ( = constant. Pentru valorile lui p v. mai jos.
Fix
Metoda punctului fix (o singur ecuaie).
Fiiere:
Fix2005.f90: subrutina metodei
Main_Fix2005.f90: programul principal
G.f90: subprogram de tip function care definete funcia g(x)
Period.f90: subrutin pentru perioada procesului staionar
Function_expression_g.f90; width.f90: utilitare

Metoda:
Funcie g, continu i derivabil pe o vecintate ] , [ b a a rdcinii .
Formula de iterare este
) (
1 n n
x g x =
+
; 0 > n ;
0
x = dat
Dac g' este continu, 1 ) ( max
] , [
< ' = x g
b a
, i ] , [
0
b a x e , irul o
n
x , liniar.

Subrutina metodei este:
Fix(g, x, xtol, nlim, kod)

Parametrii formali sunt:
g: Numele funciei g(x), declarat external n programul principal. Expresia
funciei poate include un parametru p.
x: Intrare: aproximaia iniial; Ieire: soluia calculat / ultima aproximaie.
xtol: Tolerana pentru diferena a dou valori succesive ale lui x.
nlim: Numrul limit de iteraii.
kod: Intrare: cod pentru tiprirea iteraiilor: 0 (Nu); = 0 (Da)
35
kod > 2: tiprete i valoarea ) 0 1 /( ) 1 2 ( x x x x lambda = ,
unde x0, x1 i x2 sunt trei iterate succesive.
Ieire: cod de ncheiere a iteraiei:
0: s-a obinut tolerana xtol.
1: depire a lui nlim.
2: proces staionar.
-1: divergen.

Testul pentru atingerea toleranei xtol este
xtol x x s | 0 1 | ,
unde x1 este iterata curent, i x0 iterata anterioar.

Datele de intrare se introduc de la terminal.
Rezultatele se scriu n fiierul de ieire nume.rez, unde nume este introdus de
utilizator,
i conin:
- expresia funciei g (scris de utilitarul Function_expression_g)
- [p, dac exist]
- datele de intrare x0, nlim, xtol
- modul de ncheiere a iteraiei (mesaj)
- indicele ultimei iteraii, rdcina calculat x, valoarea g(x)
- diferena curent = ) (x g x

Nota
Sub-folderul Fix_D conine fiierele pentru metoda n dubl precizie

Funcia g, pentru ecuaia de test, este
) 3 ( ) (
2
x e p x x g
x
= ,
unde p este o constant. Se iau valorile: 01 . 0 = p ; 05 . 0 = p ;
Datele de intrare pentru exemplul de test rdcina a treia, sunt:
x0: -0.5 0.5 3.7
xtol: 2.4E-7; nlim: 100;
36
Rezultate:
p = 0.01
Iteratia x g(x)
47 3.733078 3.733078
** Diferenta curenta = 2.3841858E-07

p = 0.05
5 3.733079 3.733079
** Diferenta curenta = 0.000000
Not
A doua valoare pentru p este apropiat de p_optim ~ 0.055; v. Exemplul din Cap.
3-II, 13.4.2

Exemplu de proces staionar de perioad 2:
Se consider funcia
) ( 1
) ( 2 . 0 78 . 1
) (
x tg
x tg
x g
+

= ,
i se itereaz cu x0 = 0.8, tol = 1E-7, nlim = 1000. Se obine rezultatul:
Iteratia 844: x(844) = x(842)
** Proces stationar de perioada = 2
Iteratia x
842 0.7877131
843 0.7877082
844 0.7877131
** Diferenta curenta = 4.8279762E-06

Explicaie:
Derivata ) (x g' , calculat n simpl precizie pe intervalul ] 7877140 . 0 , 7877080 . 0 [ , are
valoarea 0.9900053, care este foarte apropiat de valoarea 1 . Astfel, este realizat
condiia pentru procesul staionar de perioad 2: 1 ) ( ~ ' x g .

37
Exerciiu:
Iterai n dubl precizie, cu x0 = 0.8, tol = 1E-14, nlim = 3000.

Stationar
Metoda punctului fix, proces staionar: grafice.
Fiiere:
Stat2005.f90: programul principal
G.f90: funcia g
Function_expression_g.f90: utilitar

Programul are ca ieire fiierele pentru reprezentarea grafic a unui proces staionar,
anume:
Nume-iter.rez: iteratele;
Nume-g.rez, nume-bis.rez: funcia g i prima bisectoare.

Datele de intrare se introduc de la terminal. Acestea sunt:
- x0, n, n1: Aproximaia iniial; numr de iterate; numr de iterate omise;
- Nume: Nume pentru construirea numelor fiierelor de ieire.
Datele de ieire constau din dou linii-text, urmate de date numerice, i anume:
- Linie-text-1: Expresia funciei g
- Linie-text-2: Tipul de date din fiier, anume: iterate; funcia g; bisectoarea I-a.
- x, y: Perechi de date numerice, anume:
o Nume-iter.rez: ) , (
k
x k : Indice iterat iterat
o Nume-g.rez: )) ( , (
k k
x g x
o Nume-bis.rez: ) , (
k k
x x
k ia valorile: n n k , 1 1+ = .
Not
Dac programul de grafic nu are capabilitatea de a recunoate linii-text (i a le
ignora), se vor terge cele dou linii-text din fiier (primele dou linii), nainte de
ncrcarea fiierului n programul de grafic.
n particular, programul GRAPH are aceast capabilitate
38

Exemplu:
Pentru exemplul de proces staionar din metoda punctului fix, datele de intrare sunt:
0.8; 1000; 800;
Se omit 800 de iterate, pentru a reprezenta procesul staionar (care ncepe la iterata
842), prin iteratele 801-1000.
Graficele iteratelor i funciei g sunt date mai jos.



Figura 3 - Proces staionar Graficul iteratelor





39


Figura 4 - Proces staionar Graficul funciei i primei bisectoare


Aitken
Accelerarea Aitken.
Fiiere:
Aitken2005.f90: subrutina metodei
Main_Aitken2005.f90: programul principal
ga.f90: funcia g pentru Aitken
Period.f90: perioada procesului staionar
Function_expression_g.f90; width.f90: utilitare

Metoda:
40
Cu trei iterate succesive
2 1
, ,
+ + n n n
x x x , calculate ca n metoda punctului fix, se
calculeaz
) ( ) (
) (
1 1 2
2
1
2 ,
n n n n
n n
n n n
x x x x
x x
x a


=
+ + +
+
+
,
Valoarea o ~
+2 , n n
a este o aproximaie a rdcinii (mai bun dect iterata urmtoare,
) (
2 3 + +
=
n n
x g x ).
Procesul iterativ este urmtorul:
0
x = dat; ) (
0 1
x g x = ; ) (
1 2
x g x = ;
2 , 0 3
a x = ; ) (
3 4
x g x = ; ) (
4 5
x g x = ;
5 , 3 6
a x = ;
Etc.
Metoda Aitken are cel puin ordinul 2, ntr-o rdcin simpl.

Subrutina metodei este:
aitken(g, x0, eps, lnit, rad, kod)

Parametrii formali au, n general, aceeai semnificaie ca la metoda punctului fix.
Explicit:
g: Numele funciei g(x), declarat external n programul principal. Expresia
funciei poate include un parametru p.
x0: Intrare: aproximaia iniial; Ieire: soluia calculat / ultima aproximaie.
eps: Tolerana v. mai jos.
lnit: Numrul limit de iteraii.
kod: Intrare: cod pentru tiprirea iteraiilor: 0 (Nu); = 0 (Da)
kod > 2: tiprete i valoarea ) 0 1 /( ) 1 2 ( x x x x lambda = ,
unde x0, x1 i x2 sunt trei iterate succesive.
Ieire: cod de ncheiere a iteraiei:
0: s-a obinut tolerana eps
1: depire a lui lnit
2: proces staionar
41
-1: numitor nul n formula metodei

Formula metodei este codat astfel: iteratele curente sunt x0,x1,x2.
num =(x2-x1) -(x1-x0)
cor =(x1-x0)**2/num
a =x0 cor
unde num este numitorul, iar cor este corecia la x0.

Testele pentru atingerea toleranei eps sunt:
1) testul obinuit n metoda punctului fix:
eps x x s | 1 2 |
2) testul pentru corecie:
dif = a - x0; eps dif s | |
Testul de numitor nul este num = 0.

Datele de intrare se introduc de la terminal. n programul principal, parametrul efectiv
pentru toleran este numit xtol.
Rezultatele se scriu n fiierul de ieire nume.rez, unde nume este introdus de
utilizator,
i conin:
- expresia funciei g (scris de utilitarul Function_expression_g)
- [p, dac exist]
- datele de intrare x0, lnit, xtol
- modul de ncheiere a iteraiei (mesaj)
- indicele ultimei iteraii, rdcina calculat rad, valoarea g(rad)

Exemplu de test:
Se consider aceeai funcie g, ca la metoda punctului fix:
) 3 ( ) (
2
x e p x x g
x
= ,
unde p este o constant.
Se caut rdcina din intervalul [3, 4], cu: aproximaia iniial x0 = 3.7; xtol = 2.4E-7;
lnit = 10. Se itereaz pentru valori 09 . 0 , , 02 . 0 , 01 . 0 = p , i p = 0.001.
Rezultate exemplificare pentru p = 0.01; p = 0.001:
42
p = 9.9999998E-03
Radacina nr. 1
Iteratia 3: 3.733080
* x(3) -x(2) =-2.3841858E-07

* Toleranta intalnita
Radacina = 3.733080 ; Numar iteratii = 3
g(Rad) = 3.733080

p = 1.0000000E-03
Radacina nr. 2
x2-x1; x1-x0: 2.1457672E-06 2.1457672E-06

** Numitor nul
Radacina = 3.732974 ; Numar iteratii = 5
g(Rad) = 3.732976

Observaie
Pentru comparaia numrului de iteraii din metoda Aitken, cu cele din metoda
punctului fix:
ntr-un pas, Aitken calculeaz dou iterate (x1 i x2, cu x0 dat); astfel, numrul de
iterate calculate este 2 numrul iteraiilor afiat de Aitken.
Pentru p = 0.01: Aitken calculeaz 6 iterate, fa de 47 n metoda punctului fix

Aitken\Aitken-G
Sub-folder, pentru metoda Aitken cu funcia G(x).
Fiiere:
Aitken_G2005-2 .f90; Main-Aitken_G2005.f90; ga.f90 9; Period.f90;
Function_expression_g.f90; width.f90.
Semnificaia fiierelor este aceeai ca n Aitken.

Metoda este:
) (
1 n n
x G x =
+
,
43
unde
x x g x g g
x x g
x x G
+

=
) ( 2 )) ( (
) ) ( (
) (
2


Subrutina metodei este:
aitken_G(g, x0, eps, lnit, rad, kod)

Parametrii formali au aceeai semnificaie ca la Aitken.
Metodei este codat astfel: iteratele curente sunt a i a0.
num =g(g(a0)) -2*g(a0) +a0
cor =-(g(a0)-a0)**2/num
a =x0 +cor

Testele pentru toleran se pun astfel:
1) testul din metoda punctului fix:
eps a a g s | 0 ) 0 ( |
2) testul pentru corecie:
0 a a dif = ; eps dif s | | .

Datele de intrare se introduc de la terminal. Parametrul efectiv pentru toleran este
numit xtol (n programul principal).
Rezultatele se scriu n fiierul de ieire nume.rez, unde nume este introdus de
utilizator, i conin aceeai date ca rezultatele din Aitken.

Pentru exemplul de test din Aitken, se obin rezultatele:
p = 9.9999998E-03
* XTOL intalnit
Radacina = 3.733078 ; Numar iteratii = 4
g(Rad) = 3.733078

p = 1.0000000E-03
* XTOL intalnit
Radacina = 3.733090 ; Numar iteratii = 17
g(Rad) = 3.733090
44

II-3 Sisteme de ecuaii neliniare
Se consider sistemul de n ecuaii cu n necunoscute
0 ) , ... , , (
0 ) , ... , , (
2 1
2 1 1
=
=
n n
n
x x x f
x x x f


Vectorial, sistemul se scrie
0 x f = ) ( ,
unde
(
(
(

=
n
x
x

1
x ,
(
(
(

=
) (
) (
) (
1
x
x
x f
n
f
f
.
Se noteaz tot cu x, irul argumentelor lui
i
f , adic
n
x x , ,
1
.
Pentru metoda punctului fix, sistemul dat se pune sub forma sistemului echivalent
) (x g x = .
Aceasta se realizeaz prin procedura explicit de punct fix ) ( ) ( ) ( x f x A x x g = ,
unde A(x) este o matrice nesingular.

Exemplu de test:
0 5 ) , (
2 2
1
= + y x y x f , 0 1 ) , (
2
=
x
e y y x f .
Aproximaiile iniiale se iau:
) 1 , 2 (
) 0 (
= x , i ) 2 , 5 . 0 (
) 0 (
= x
Acestea se determin din intersecia graficelor celor dou curbe.
Not
Dificultatea major const n gsirea aproximaiilor iniiale, n cazul 3 > n



45


Figura 5 Determinarea aproximaiilor iniiale


Fix_Sys
Metoda punctului fix pentru sisteme de ecuaii neliniare.
Fiiere:
Fix_Sys2005.f90: subrutina metodei
Main-Fix_Sys2005.f90: programul principal
fcns.f90: subrutina care returneaz valorile funciilor ) (x
i
f
norm$.f90: norma- a unui vector v(n)
Elim.f90: subrutina pentru eliminarea Gauss
46
Function_expression_Sys.f90; width.f90: utilitare

Metoda:
Iterare cu matricea constant | |
1
) 0 (
) (

= x F A , cu actualizare dup 3 pai.
Iteraia este definit de
) (
) ( ) ( ) 1 ( n n n
x f A x x =
+

F(x) este jacobianul lui f. Derivatele pariale ale funciilor ) (x
i
f (elementele
jacobianului) se calculeaz numeric, cu variaia 001 . 0 = delta .
Schema de iterare este urmtoarea. Se definete
) ( ) 1 ( ) 1 ( n n n
x x =
+ +
,
i rezult:
) ( ) (
) ( ) 1 ( ) 0 ( n n
x f x F =
+
(a)
) 1 ( ) ( ) 1 ( + +
+ =
n n n
x x
Ecuaia (a) este un sistem liniar n necunoscuta
) 1 ( + n
, care se rezolv prin eliminare
Gauss.
Testele de oprire a iteraiei sunt:
eps
n
s
+
|| ||
) 1 (

lnit n s +1
Metoda are un ordin de convergen 2 1 < < p .

Subrutina metodei este
FIX_SYS(fcns, n, x, xtol, delta, lnit, f, kod),

Parametrii formali sunt:
n: ordinul sistemului (numrul de ecuaii)
fcns: numele subrutinei care calculeaz valorile funciilor ) (x
i
f
x: tablou x(n) pentru valorile
n
x x , ,
1

47
xtol: tolerana
delta: variaia pentru calculul derivatelor pariale
lnit: numrul limit de iteraii
f: tablou f(n), pentru valorile ) ( , ), (
1
x x
n
f f
kod: cod de ncheiere a iteraiei (intern):
0: tolerana atins
1: numrul limit de iteraii atins
-1: Pivot < prag in eliminarea Gauss

Exemplul de test:
Se obin rezultatele:
Radacina nr.1
Aproximatia initiala: -2.000000 1.000000
xtol: 1.000E-06; lnit: 10
XTOL atins
Solutia X: -1.919684 1.146653
F(X): -2.7614632E-07 -2.9958017E-08
Numar de iteratii = 5

Radacina nr.2
Aproximatia initiala: 0.5000000 2.000000
xtol: 1.000E-06; lnit: 20
XTOL atins
Solutia X: 0.2043374 2.226712
F(X): 7.2109735E-08 -4.6549125E-08
Numar de iteratii = 17

48

Newton_Sys
Metoda Newton pentru sisteme de ecuaii neliniare.
Fiiere:
Newton_Sys.f90: subrutina metodei
Main-Newton_Sys.f90: programul principal
fcn.f90: subrutina care returneaz valorile funciilor ) (x
i
f
jfcn.f90: subrutina care returneaz jacobianul lui ) (x f
norm$.f90: norma- a unui vector v(n)
Elim.f90: subrutina de eliminare Gauss
Period_Sys.f90: funcie care returneaz perioada procesului staionar
Function_expression_Sys.f90, width.f90: utilitare

Metoda:
Iteraia este definit de
| | ) ( ) (
) (
1
) ( ) ( ) 1 ( n n n n
x f x F x x =

+
,
unde F(x) este jacobianul lui f:
x
x
x F
(
(
(
(
(
(

c
c
c
c
c
c
c
c
c
c
c
c
=
(
(

c
c
=
n
n n n
n
j
i
x
f
x
f
x
f
x
f
x
f
x
f
x
f
...
. . . . . . . . . . . . . . . . . . . . .
...
) (
2 1
1
2
1
1
1

Elementele jacobianului se calculeaz analitic.
Schema practic de iterare este:
) ( ) (
) ( ) 1 ( ) ( n n n
x f x F =
+
(a)
) 1 ( ) ( ) 1 ( + +
+ =
n n n
x x
Corecia
) 1 ( + n
se calculeaz prin rezolvarea sistemului liniar (a).
Iteraia se oprete prin testele:
eps
n
s
+
|| ||
) 1 (
,
49
Numr de iteraii s lnit
unde eps i lnit sunt tolerana, i respectiv, numrul limit de iteraii.
Pe lng acestea, iteraia se mai oprete dac Jacobianul este singular, sau dac se
ntlnete un proces staionar.
Metoda are ordinul de convergen 2 = p .

Subrutina metodei este
Newton_Sys (fcn, jfcn, n, x, lnit, xtol, f, kod, n_div)

Parametrii formali sunt:
n: ordinul sistemului (numrul de ecuaii)
fcn: numele subrutinei care calculeaz valorile funciilor ) (x
i
f
jfcn: numele subrutinei care calculeaz jacobianul lui f; elementele jacobianului
sunt returnate n tabloul jf(n,n).
X: tablou x(n) pentru valorile
n
x x , ,
1

xtol: tolerana
lnit: numrul limit de iteraii
f: tablou f(n), pentru valorile ) ( , ), (
1
x x
n
f f
kod: cod de ncheiere a iteraiei (intern):
0: tolerana XTOL atins
1: numrul limit de iteraii atins
2: Proces staionar
-1: Divergent
-2: Pivot < prag in eliminarea Gauss (Jacobian singular)

Exemplul de test:
Se obin rezultatele:
50
Radacina nr.1
Aproximatia initiala: -2.000000 1.000000
xtol: 1.000E-06; lnit: 10

Norma corectiei: 5.9217999E-08
XTOL atins
Solutia X: -1.919684 1.146653
F(X): -2.7614632E-07 -2.9958017E-08
Numar de iteratii = 4

Radacina nr.2
Aproximatia initiala: 0.5000000 2.000000
xtol: 1.000E-06; lnit: 10

Norma corectiei: 1.1825179E-08
XTOL atins
Solutia X: 0.2043374 2.226712
F(X): 5.3840544E-08 8.2891738E-09
Numar de iteratii = 5


II-4 Rdcinile polinoamelor
C_pol
Calculul valorii polinomului, direct i imbricat (schema Horner), pe un interval ] , [ b a ,
cu pasul h.

Fiiere:
C_pol2005.f90; sub_pol.f90

Metoda:
Exemplificm pe un polinom de gradul 4. Generalizarea este imediat.
Forma dat:
4
4
3
3
2
2 1 0
) ( x a x a x a x a a x p + + + + =
51
Forma imbricat:
) ) ) ( ( ( ) (
4 3 2 1 0
x a a x a x a x a x p + + + + =

Calculul efectiv se face cum urmeaz:
1. Calculul prin ciclu:
a) Forma dat:
p =a(0)
zk =1.
do k =1,n
zk =zk*z
p =p +a(k) *zk
enddo
Observai c, pentru minimizarea numrului operaiilor, puterile lui x se
calculeaz succesiv prin x x x
k k
=
+1
.
b) Forma imbricat: Calculul pe forma imbricat face n urmtorul ciclu, care
calculeaz succesiv expresiile din paranteze:
pi =a(n)
pid =dble(a(n))
do k =n-1,0,-1
pi =a(k) +z*pi
pid =dble(a(k)) +dble(z)*pid
enddo
pi i pid sunt valorile n simpl, respectiv dubl precizie, n forma imbricat. (pid
este declarat n dubl precizie.)

2. Calculul prin funcia p(x), n simpl precizie:
Se calculeaz valoarea polinomului, n forma dat i cea imbricat. n acest calcul,
membrul drept se calculeaz n format dublu extins (64 bii, n coprocesor), i
rezultatul se rotunjete la precizia simpl.

sub_pol.f90: subrutin care calculeaz valoarea polinomului n modul 2 (simpl
precizie).
C_pol.f90: programul principal, care calculeaz n modurile 1a, 1b.

52
Datele de intrare sunt:
- n: gradul polinomului
-
0 1
, , , a a a
n n

: coeficienii polinomului (n aceast ordine);


- a, b, h: intervalul ] , [ b a i pasul h
Acestea se citesc dintr-un fiier de date. Fiierul de date este utilizat i ca fiier de
ieire pentru rezultatele p, pi, pid.

Exemplu de test:
3 2 3
) 1 ( 1 3 3 ) ( = + = x x x x x p

Fiierul de date i rezultate:
3
1 -3 3 -1
0.9 1.2 .1

Calcul prin ciclu:
x p-Dat p-Imbricat p-Imbricat in
Dubla precizie
0.900 -9.9998713E-04 -9.9990633E-04 -1.0000007E-03
1.000 0.000000 0.000000 0.000000
1.100 1.0001659E-03 9.9998503E-04 1.0000007E-03
1.200 8.0001354E-03 8.0000088E-03 8.0000057E-03

x Err(p_Dat) Err(p_Imbricat)
0.900 -1.359E-08 -9.438E-08
1.000 0.00 0.00
1.100 -1.652E-07 1.569E-08
1.200 -1.297E-07 -3.040E-09

Calcul prin functie:
x p-Dat p-Imbricat
0.900 -1.0000007E-03 1.0000007E-03
1.000 0.000000 0.000000
1.100 1.0000007E-03 -1.0000007E-03
1.200 8.0000060E-03 -8.0000060E-03
53

Se constat:
- La calculul prin ciclu: valoarea cea mai precis este pid (cu excepia valorii n
9 . 0 = x ).
- La calculul prin funcie: nu exist diferene ntre forma dat i imbricat, i
valorile coincid cu valorile pid.

Pol
Metoda Newton pentru polinoame Algoritmul cu reducerea gradului
Fiiere:
Polall.f90: subrutina metodei
Main-Pol.f90: programul principal

Metoda:
Se consider polinomul
n
n
x a x a x a a x p + + + + =
2
2 1 0
) (
Definim coeficienii
n n
a b = ;
1 +
+ =
k k k
b a b , 0 , ... , 2 , 1 = n n k
unde ) (
0
p b = . Definim polinomul ct, prin:
1
2 1
... ) ; (

+ + + =
n
n
x b x b b x q ,
adic ) ( ) ; ( ) ( ) ( p x q x x p + = .
Formula de iterare este
) ; (
) (
1
n n
n
n n
x x q
x p
x x =
+
,
n care:
n n
x x x
n n
x q x x q
= =
=

,
) ; ( ) ; ( .

Subrutina metodei:
Pol(n, a, x0, eps, itmax,rad, b, ier, n_div)
Calculeaz o rdcin a lui p(x).

54
Parametri formali:
n: gradul polinomului
a: vectorul coeficienilor: a0, a1,..., an
x0: aproximaia iniial
eps: tolerana pentru metoda Newton
itmax: Intrare: numrul maxim de iteraii. Ieire: numrul efectiv de iteraii
rad: rdcina / ultima aproximaie
b: coeficienii lui q(x) - returnai pentru o noua rdcin.
ier: cod de intrare/ieire:
- Intrare: tiprirea iteraiilor (0: da; =0: nu)
- Ieire: cod de ncheiere a iteraiei:
0: tolerana eps atins
1: numrul maxim de iteraii atins
2: Proces staionar
-1: Divergen
-2: Numitor nul
n_div: numrulde divergene locale

Formula de iterare este codat astfel:
dif x x = 0 1
Observaii
- Testul pentru toleran este:
eps dif s | |
- Testul pentru divergen local este:
| _ | | | ant dif dif >
unde ant dif _ este dif de la pasul anterior.

Programul principal:
Este scris astfel ca s determine un numr specificat de rdcini, prin reducerea
succesiv a gradului (deflaie), i anume: dup gsirea unei rdcini, rdcina
55
urmtoare se caut ca rdcin a lui q(x), care are gradul cu o unitate mai mic dect
precedentul polinom.
Rdcinile sunt apoi, purificate, prin iterare n polinomul original.

Algoritmul cu reducerea gradului este mai puin recomandat, ntruct: reducerea
gradului poate fi un proces instabil; se cer, n plus, iteraii de purificare a rdcinilor.
Alternativa este algoritmul fr reducerea gradului v. folderul Pol_Direct.

Fiierul de intrare conine urmtoarele date (scrise pe linii):
Linie_text: titlul problemei; max. 80 caractere;
n, nr, ktip: gradul polinomului, numr de rdcini de calculat, cod de tiprire a
iteraiilor;
0 1
, , , a a a
n n

: coeficienii polinomului: (n aceast ordine);


eps, itmax: tolerana, numrul maxim de iteraii;
x0(1:nr): aproximaiile iniiale, n numr de nr.

Datele de ieire se scriu n continuarea datelor de intrare, i conin:
rad: Rdcina calculat, sau ultima iterat dac nu s-a atins tolerana; Codul de
ncheiere a iteraiei; Numrul de iteraii; Valoarea p(rad).

Exemplu: Polinomul Laguerre de gradul 6.

Fiierul de intrare/ieire este:
Laguerre de ordinul 6
6 0 1
1 -36 450 -2400 5400 -4320 720
1e-6 40
0 1 3 6 9 15

** Radacinile prin deflatie:
Rad Cod Iteratii p(Rad)
0.2228466 0 5 5.4396223E-06
1.188932 0 4 -4.6508652E-04
2.992738 0 3 -1.1693367E-03
56
5.775141 0 4 -1.5692167E-02
9.837474 0 4 4.5174375E-02
15.98287 0 2 -1.6622657E-02

** Radacinile polinomului:
0.2228466 0 1 5.4396223E-06
1.188932 0 1 -4.6508652E-04
2.992737 0 1 -1.1693367E-03
5.775149 1 40 -2.9657342E-02
9.837465 0 4 -5.3842347E-03
15.98287 0 1 -1.6622657E-02


Pol_Direct
Metoda Newton pentru polinoame fr reducerea gradului.
Fiiere:
Pol_direct.f90: subrutina metodei
Main-Pol_direct.f90: programul principal
GetFile.f90, OpenFile.f90: subrutine pentru selectarea fiierului de intrare
Period.f90: funcie pentru calculul perioadei procesului staionar
width.f90: utilitar

Metoda:
Metoda este aceeai ca n POL. Deosebirea este c acum, programul principal
calculeaz rdcinile prin iterare n polinomul original (fr reducerea gradului).
Acest procedeu se recomand fa de cel descris n POL.

Subrutina metodei:
POL_direct(n, a, x0, eps, itmax, rad, b, ier, n_div)

Parametri formali sunt aceeai ca la subrutina metodei POL, cu diferena c b este
variabil scalar, care returneaz valoarea polinomului pe rdcina calculat.

Datele de intrare i de ieire, sunt aceleai ca pentru fiierul de intrare din POL.
57
n plus, programul principal tiprete i semnificaia codurilor de ncheiere a iteraiei.
Not: Fiierul de intrare se selecteaz din fereastra de dialog standard.

Exemplu: Polinomul Laguerre de gradul 6.
Fiierul de intrare/ieire este:
Laguerre de ordinul 6
6 0 0
1 -36 450 -2400 5400 -4320 720
1e-6 40
0 1 3 6 9 15

** Radacinile:
Radacina Cod Iteratii p(Radacina)
0.2228466 0 5 1.5187880E-05
1.188932 0 4 -4.1390103E-05
2.992736 0 3 -1.6699019E-05
5.775144 0 4 1.5937904E-04
9.837467 0 6 3.1938325E-03
15.98287 0 6 -1.2154851E-02

Cod Semnificatie
0 * Toleranta EPS atinsa

Pol_Direct-2011
Acest proiect implementeaz formula de iterare Newton, pentru polinoame, n forma:
) (
) (
1
n
n
n n
x p
x p
x x
'
=
+

Deosebirea fa de formula general Newton este c acum, valoarea polinomului i a
derivatei se calculeaz n form imbricat (v. funcia polval.f90).
Formula din POL este potrivit mai degrab, pentru versiunea cu reducerea gradului.
n rest, proiectul este similar cu cel din Pol_Direct. Fiierul de intrare este acelai cu
cel de la Pol_Direct.

58
Pol_Complex
Metoda Newton pentru polinoame: coeficieni reali i rdcini reale/complexe.
Fiiere:
Pol_complex.f90: subrutina metodei
Main-Pol_complex.f90: programul principal
GetFile.f90, OpenFile.f90: subrutine pentru selectarea fiierului de intrare
Period_Complex.f90: funcie pentru calculul perioadei procesului staionar
width.f90: utilitar

Metoda i formula de iterare sunt aceleai ca pentru POL, iar algoritmul este cel din
POL_Direct.
Coeficienii polinomului sunt reali, i se pot calcula rdcinile complexe. n plus,
programul principal ofer posibilitatea inversrii coeficienilor polinomului adic: se
introduc coeficienii
k
a , i se calculeaz rdcinile polinomului cu coeficienii
k
a / 1 .

Datele de intrare i ieire sunt aceleai ca pentru fiierul de intrare din POL, cu
excepia c, dup coeficienii polinomului se intriduce o dat logic pentru inversarea
coeficienilor; Valoare: T (da), sau F (nu) v. fiierul de mai jos.
Aproximaiile rdcinilor trebuie s fie complexe.
Dezavantajul este c trebuie cunoscute aproximaii complexe suficient de apropiate de
rdcini.

Exemplul de test:
Se consider polinomul
5040 13068 13132 6769 1960 322 28 ) (
2 3 4 5 6 7
+ + + = x x x x x x x x p ,
care este desvoltarea lui ) 7 ( ... ) 2 ( ) 1 ( x x x .
Coeficientul lui
6
x se modific, din 28, n -28.002. Se calculeaz rdcinile
polinomului perturbat:
+ + =
5 6 7
322 002 . 28 ) (
~
x x x x p

Fiierul de intrare/ieire este:
Polinomul: (x-1)* ... *(x-7) - perturbat: -28.003
59
7 0 0
1 -28.002 322 -1960 6769 -13132 13068 -5040
F
1e-6 100
(1,0) (2,0) (3,0) (4,0) (5.1, 0.51) (5.1,-0.51) (7,0)

Radacina 3.819486 0.000000
Iteratia 42: x(42) = x(5)
** Proces stationar de perioada = 37

Radacina Nr. de divergente locale
(1.998932,0.0000000E+00) 4
(3.819486,0.0000000E+00) 19
(5.458657,0.5402664) 9
(5.458657,-0.5402664) 9

** Radacinile:
Radacina Cod Iter p(Radacina)
( 1.000003 0.000000 ) 0 2 ( 1.0822721E-04
0.000000 )
( 1.998932 0.000000 ) 0 14 (-3.9895516E-05
0.000000 )
( 3.033130 0.000000 ) 0 3 (-4.4950219E-05
0.000000 )
( 3.819486 0.000000 ) 2 42 (-2.0952073E-03
0.000000 )
( 5.458657 0.5402664 ) 0 22 ( 1.0816487E-05 -
4.6607955E-05)
( 5.458657 -0.5402664 ) 0 22 ( 1.0816487E-05
4.6607955E-05)
( 7.233083 0.000000 ) 0 7 (-3.4990243E-04
0.000000 )

Cod Semnificatie
0 * Toleranta EPS atinsa
2 ** Proces stationar

60
Laguerre
Metoda Laguerre.
Metoda:
Formula de iterare este
) ( ) (
) (
1
i i
i
i i
z H z p
z np
z z
'
=
+
,
unde: n este gradul polinomului; )] ( ) ( ) ( ) 1 )[( 1 ( ) (
2
i i i i
z p z np z p n n z H ' ' ' = , iar
semnul din faa radicalului se ia astfel ca numitorul s fie cel mai mare n modul (dac
i
z este real, semnul este semnul lui ) (
i
z p' . Se arat c pentru o rdcin simpl,
ordinul de convergen este 3 (pentru o rdcin multipl, ordinul este 1).

Fiiere:
Main_Lag.f90: programul principal; polval.f90 (subrutina compute_polval) care
calculeaz valoarea polinomului (n simpl precizie)

Subrutina metodei este apelat din Biblioteca IMSL, anume:
ZPLRC (n, coef, rad)

Parametrii de apel sunt:
n: gradul polinomului
coef: tablou (real); coeficienii polinomului a(0:n)
rad: tablou (complex); rdcinile calculate rad(n).

Programul apelant trebuie s conin instruciunea:
use numerical_libraries

Metoda Laguerre pentru un polinom cu coeficieni reali este implementat n
IMSL prin subrutina ZPLRC, fiind combinat cu reducerea gradului, astfel c se
determin toate zero-urile polinomului. Apelul lui ZPLRC nu cere aproximaii iniiale
v. IMSL Math/Libraries (1999).
(Subrutina ZPLRC returneaz numai rdcinile.)


61
Datele de intrare se citesc dintr-un fiier de date. Acesta conine:
Titlul problemei: text de max. 80 caractere
n: gradul polinomului
0 1
, , , a a a
n n

: coeficienii polinomului (n aceast ordine).


Inverse: dat logic; inversarea sau nu a coeficienilor. Valori: T/F.
Distance: dat logic; calculul distanei rdcinilor la un punct. Valori: T/F.
[z: complex; punctul z la care se calculeaz distana.
Se introduce numai dac Distance are valoarea T; n una din formele:
complex: ) , ( y x ; doi reali: x, y sau x y]

Not:
Ultimele trei date servesc la a verifica dac rdcinile aparin sau nu discului unitate
cu centrul n punctul ) , ( y x z = ; aceasta intervine la aprecierea stabilitii metodelor
numerice n mai muli pai pentru ecuaii difereniale ordinare.
Codul este scris astfel c:
- Dac ambele date Inverse i Distance sunt false, ele se pot omite.
- Dac data Distance este fals, ea se poate omite.


Datele de ieire se scriu n continuarea datelor de intrare, i conin:
- Rdcinile calculate i valorile polinomului pe rdcini.
- Dac Distance are valoarea T, se tipresc i distanele rdcinilor la punctul z.

Exemplu:
Fiierul de intrare/ieire este:
Titlu: (x-1)* ... *(x-7) - perturbat:
7
1 -28.002 322 -1960 6769 -13132 13068 -5040

Radacini:
1 (7.233085,0.0000000E+00)
2 (5.458664,0.5402883)
3 (5.458664,-0.5402883)
4 (3.819508,0.0000000E+00)
62
5 (3.033140,0.0000000E+00)
6 (1.998938,0.0000000E+00)
7 (1.000003,0.0000000E+00)

Valori polinom:
1 (2.1089716E-03,0.0000000E+00)
2 (-9.5487665E-04,-7.6583266E-05)
3 (-9.5487665E-04,7.6583266E-05)
4 (9.9300256E-04,0.0000000E+00)
5 (9.7102771E-04,0.0000000E+00)
6 (-2.0569569E-04,0.0000000E+00)
7 (1.0822721E-04,0.0000000E+00)

Not
Laguerre_D
Metoda Laguerre n dubl precizie (implementare cu subrutina IMSL dZPLRC).
Laguerre-Direct
Metoda Laguerre, implementat (direct) dup formula de iterare.
Fiierul de intrare este descris in Main_Laguerre_1.f90 - i e similar cu fisierul de la
Pol_Direct.
Cere aproximaii iniiale ale rdcinilor.


Pol_Halley
Metoda Halley pentru polinoame.
Formula de iterare (introdus de astronomul Halley (1694)):
) (
1 n n n
x h x x =
+
, (1)
) ( ) ( )] ( [
) ( ) (
) (
2
1
2
x f x f x f
x f x f
x h
' ' '
'
= (1')
Metoda are ordinul 3 ntr-o rdcin simpl.
Aplicare pentru un polinom: ) ( ) ( x p x f = .
63
Derivatele se calculeaz direct pe polinomul p(x). Valorile polinomului i derivatelor
se calculeaz imbricat, prin funcia polval.
Pentru fiierul de intrare v. sursa Main-Pol_H.f90.

Muller
Metoda Muller.
Funcie f, continu i cu derivate continue pn la ordinul 3, pe o vecintate a
rdcinii.

Metoda:
Metoda cere trei aproximaii iniiale
2 1 0
, , x x x ale rdcinii. (Nu este necesar ca
acestea s fie ordonate dup mrime.)
Se construiete polinomul de interpolare (de gradul 2) care trece prin punctele
) , (
i i
f x , unde ) (
i i
x f f = ; aproximaia urmtore
3
x , este una din rdcinile lui p(x)
v. mai jos.
Aproximaii reale pot conduce la zero-uri complexe. n particular, aproximaiile reale
se pot lua forma: h x x
1 1
, .
Polinomul de interpolare Newton pe nodurile
0 1 2
, , x x x (v. INTERPOLARE), este:
) )( ( ) ( ) (
1 2 210 2 21 2
x x x x f x x f f x p + + = ,
Coeficienii sunt diferenele divizate ale funciei f pe nodurile
k j i
x x x , , , anume:
) (
i i
x f f = ;
i j
i j
j i ij
x x
f f
x x f f

= = ] , [ ;
i k
ij jk
k j i ijk
x x
f f
x x x f f

= = ] , , [ ,
Fie polinomul de interpolare desvoltat n ) (
2
x x :
c x x b x x a x p + + = ) ( ) ( ) (
2
2
2

Coeficienii a, b, c, se gsesc prin:
210
f a = ;
10 02 21
f f f b + = ;
2
f c =
Formula de iterare este
64
ac b b
c
x x
4
2
2
2 3

=
Ca aproximaie urmtoare, se ia valoarea
3
x care este cea mai apropiat de
2
x , adic
rdcina pentru care
2 3
x x este cel mai mic.
Pentru aceasta, semnul din faa radicalului se ia astfel ca numitorul s fie cel mai
mare, i anume:
- Pentru rdcini reale, se ia semnul lui b (dac b = 0, orice semn);
- Pentru rdcini complexe (inclusiv cazul n b este complex), semnul pentru
care numitorul este cel mai mare n modul. Explicit: punem
ac b b b 4
2
2 , 1
= . Dac | | | |
2 1
b b > , atunci formula de iterare este:
1 2 3
/ 2 b c x x = ; altfel,
2 2 3
/ 2 b c x x = .
Dup determinarea lui
3
x :
- Dintre punctele 2 , 0 , = i x
i
, se exclude punctul cel mai ndeprtat de
3
x (cel
pentru care
i
x x
3
este cel mai mare).
- Se atribuie
3
x lui
2
x . Celelalte dou puncte devin
0
x i
1
x .
- Se procedeaz la o nou iteraie (cu noua secvena
2 1 0
, , x x x ).
Testul de oprire a iteraiei este
EPS x x s
2 3
,
unde EPS este tolerana; remarcai c anterior x x _
3 2
= .
Convergena: metoda Muller are ordinul de convergen p = 1.84 pentru o rdcin
simpl; v. Atkinson (1978). Pentru o rdcin complex multipl, convergena poate
fi mai nceat.

Fiiere:
Muller2005.f90: subrutina metodei
select.f90: subrutina de selecie a valorilor
2 1 0
, , x x x (pentru iteraia urmtoare).
Main_Muller2005.f90: programul principal
65
f.f90: funcia f(x)
Function_expression.f90; width.f90: utilitare

Subrutina metodei:
muller(f, x0, x1, x2, eps, iter, rad, kod)

Parametrii formali:
f: Numele funciei f
x0, x1, x2: Aproximaiile iniiale
eps: Tolerana
iter: Numrul limit de iteraii (intrare); numrul efectiv de iteraii (ieire)
rad: Rdcina calculat
kod: Intrare: cod de tiprire a iteraiilor: 0 (nu); = 0 (da)
Ieire: cod de ncheiere a iteraiei (intern):
0: Tolerana eps atins
1: lnit depit
2: Rdcina n aproximaiile iniiale
-1: Radical din numr negativ
Subrutina muller apeleaz subrutina select (x0, x1, x2, x3).

Datele de intrare se introduc de la terminal, si constau din:
- nume: numele fiierului de ieire (acesta primete extensia .rez)
- Exist_p: dat logic. Valori: T (true) sau F (false)
- [p: dac Exist_p = T ]
- eps, lnit: tolerana, numrul limit de iteraii
- x1, h: aproximaia x1, pasul
- kod: cod de tiprire a iteraiilor

Programul principal pune (nainte apelul subrutinei muller):
h x x h x x + = = 1 2 ; 1 0

Datele de ieire se scriu n fiierul de ieire nume.rez, i sunt urmtoarele:
- expresia funciei f (scris de utilitarul Function_expression)
66
- [p, dac exist]
- aproximaiile x0, x1, x2
- lnit, eps
- modul de ncheiere a iteraiei (mesaj, conform codului kod)
- rdcina calculat rad; valoarea f(rad)
- numrul efectiv de iteraii.

Exemplu de test:
2
) ( px e x f
x
= ,
cu p = 3; se caut rdcina din vecintatea valorii 0.8.
Se iau: 2 . 0 , 8 . 0 0 = = h x (Rezult aproximaiile iniiale: 0.6; 0.8; 1.0)
eps = 1E-6, lnit 10; ktip = 0.

Fiier de ieire:
Metoda MULLER
f =exp(x) -p*x*x
p: 3.000000

Radacina nr.1
Aproximatii: 0.6000000 0.8000000 1.000000
EPS: 1.000E-06; LNIT: 10

Iter x0 x1 x2 * x3
1 0.6000000 0.8000000 1.000000 0.9104018
2 0.8000000 1.000000 0.9104018 0.9100071
3 1.000000 0.9104018 0.9100071 0.9100076

* Toleranta EPS atinsa
Radacina = 0.9100076 ; f(Radacina) = 2.1429681E-08
Numar de iteratii = 3


Graficul funciei i polinomului de interpolare se dau mai jos.


67



Figura 6 Metoda Muller: graficul funciei i polinomului de interpolare


Muller\Muller_Complex
Metoda Muller pentru rdcinile unei funcii complexe.
Fiiere:
Muller_Complex2005.f90; Main_Muller_Complex2005.f90; f_complex.f90;
select_complex.f90; Function_expression.f90;; width.f90;

Subrutina metodei:
Muller_complex(f, h, z0, z1, z2, eps, iter, rad, kod)

Semnificaiile parametrilor sunt aceleai ca la Muller, cu deosebirile:
68
- datele numerice i funcia f sunt declarate complexe
- programul este scris n dubl precizie

Datele de intrare se citesc dintr-un fiier de date (specificat de utilizator). Acesta are
structura:
- Titlul problemei: text de max. 80 caractere
- Exist_p: dat logic. Valori: T (true) sau F (false)
- [p: dac Exist_p = T ]
- nrad: numrul rdcinilor de calculat
- z1(1:nrad): nrad aproximaii reale sau complexe
- h: pasul. Valoare real.
- eps, lnit: tolerana, numrul limit de iteraii
- ktip: cod de tiprire a iteraiilor: 0 (da); =0 (nu)
Datele de ieire se scriu dup datele de intrare, i conin: rdcina, valoarea funciei pe
rdcin, i numrul de iteraii (pentru nrad rdcini).

Exemplu de test:
Pentru polinomul din exemplul de la Pol_Complex, se itereaz cu 10 1 = E eps ;
lnit = 20; aproximaia real 6
1
= x ; 1 . 0 = h . Fiierul de intrare/ieire este urmtorul:
Wilkinson_7
F
1
6
0.1
1E-10 20
0

Metoda MULLER (Complex)
f =(z-1)*(z-2)*(z-3)*(z-4)*(z-5)*(z-6)*(z-7) -0.002*z**6

EPS: 1.000E-10; LNIT: 20

# Radacina Iteratii

1 5.458675825432509 0.5401258000668572 9
69
f = (-1.421085471520200E-014,3.197442310920451E-014)
2 5.458675825432509 0.5401258000668571 7
f = (-2.842170943040401E-014,1.776356839400250E-014)

Rdcina este gsit n 7 iteraii. Cu aproximaia 5
1
= x se gsete aceeai rdcin n
9 iteraii.


70

CAPITOLUL III SISTEME DE ECUAII LINIARE
Sistemul de ecuaii liniare este
b Ax = ,
unde A est matrice nn, iar x i b vectori coloan cu n coordonate.
Rezolvarea se poate considera pentru mai muli termeni liberi b.

Folder tematic: $ Linear Systems
III-1 Metode directe
Gauss
Eliminarea Gauss cu pivotare parial.
Fiiere:
Elim.f90: subrutina metodei
Main-EIim.f90: programul principal
width.f90: utilitar
Fiier de date: Ex2.dat

Metoda:
Sistemul dat se transform n sistemul echivalent g Ux = , cu matricea U superior
triunghiular, cum urmeaz.
Sistemul dat se noteaz
) 1 ( ) 1 (
b x A = .
La pasul curent k ( 1 , , 2 , 1 = n k ):
Sistemul este
) ( ) ( k k
b x A = .
Se lucreaz cu liniile n k i , , = , din
) (k
A i
) (k
b . (Liniile 1 , , 1 k , procesate
anterior, rmn neschimbate). Concret, se opereaz cu sub-matricea ) : , : (
) (
n k n k
k
A
i sub-coloana ) : (
) (
n k
k
b a termenilor liberi.


71

.
+

(
(
(
(
(
(
(
(
(
(
(
(


) (
. . . 0 0 0
. . . . . . . .
. . . . .
. . . . . . . .
. . 0 . 0
. . . .
. . 0 .
. . 0
. .
) ( ) (
) ( ) ( ) (
) ( ) ( ) (
) 1 (
, 1
) 1 (
1 , 1
) 2 (
2
) 2 (
2
) 2 (
22
) 1 (
1
) 1 (
1
) 1 (
12
) 1 (
11
) (
ik
k
nn
k
nk
k
in
k
ij
k
ik
k
kn
k
kj
k
kk
k
n k
k
k k
n k
n k
k
m
a a
a a a
a a a
a a
a a a
a a a a

A ;
.
+

(
(
(
(
(
(
(
(
(
(
(
(

=


) (
.
.
) (
) (
) (
) 1 (
1 , 1
) 2 (
2
) 1 (
1
) (
ik
k
n
k
i
k
k
k
k k
k
m
b
b
b
b
b
b
b

Presupunem 0
) (
=
k
kk
a v. mai jos pivotare, i definim multiplicatorii de la pasul k:
) (
) (
k
kk
k
ik
ik
a
a
m = ; n k i , , 1 + =
Pentru n k i , , 1 + = : linia k se nmulete cu
ik
m , i se adun la linia i. Rezult
elemente nule n coloana k, sub elementul diagonal
) (k
kk
a . Linia k rmne neschimbat.
Noii coeficieni i termeni liberi vor fi:
n k i
b m b b
n k j a m a a
k
k ik
k
i
k
i
k
kj ik
k
ij
k
ij
, ... , 1
, ... , 1 ;
) ( ) ( ) 1 (
) ( ) ( ) 1 (
+ =
)
`

=
+ = =
+
+

La pasul n se noteaz, pentru convenien,
) ( ) (
,
n n
b g A U = = , i sistemul devine
g Ux = .
Explicit:
72
(
(
(
(
(
(
(
(

nn
kn kk
n
n
u
u u
u u
u u
0 0
. .
. 0 0
. . . .
. . . 0
. . . .
2 22
1 11
(
(
(
(
(
(
(
(

=
(
(
(
(
(
(
(
(

n
k
n
k
g
g
g
g
x
x
x
x
.
.
.
.
2
1
2
1


Acest sistem se rezolv prin substituie napoi:
nn n n
u g x / = ;
kk
n
k j
j kj k k
u x u g x / ) (
1

+ =
= ; 1 , ... , 2 , 1 = n n k

Pivotarea parial:
La fiecare pas k, se caut elementul de modul maxim din sub-coloana ) , : ( k n k a ,
numit pivot; fie acesta gsit n linia k I > .
Dac pivotul este mai mare dect un prag i k I > , atunci se schimb liniile k i I (n
) (k
A i n
) (k
b ).
Dac pivotul este mai mic dect pragul, eliminarea Gauss se oprete, ntruct:
- dac pivotul este nul, matricea este singular.
- dac pivotul este nenul dar mai mic dect pragul, matricea este aproape
singular.

Numr de operaii: Pentru n = mare, numrul de operaii n eliminarea Gauss este:
3
3
n
NOP
Guass
~

Subrutina metodei:
ELIM (n, nb, A, B, prag, kod, kodPrint)

Parametri formali:
n: numrul ecuaiilor
nb: numrul de termeni liberi
A(n, n): matricea coeficienilor
73
B(n, nb): matricea termenilor liberi
prag: prag pentru pivot ~ 0.
kod : cod pentru eliminarea Gauss:
kod = 0: o.k.; kod =0: pivot ~ 0 (pivot < prag)
kodPrint: cod de tiprire v. mai jos.

ELIM face pivotare parial. Dac pivotul este mai mic dect pragul, se produce un
mesaj de eroare. Valoarea prag este setat de programul principal la 1E-6 (aceasta se
poate modifica).
Matricea U se stocheaz n triunghiul superior din A.
Soluia este returnat n coloanele din B.

Datele de intrare se citesc dintr-un fiier de date, specificat de utilizator. Acesta are
structura:
- Titlu: text de max. 80 caractere
- n, nb: numrul de ecuaii; numrul de termeni liberi.
- Matricea coeficienilor A: n n. Se scrie aa cum e dat - pe linii i coloane.
- Termenii liberi b: Se scriu pe linii: nb linii a n termeni liberi.
- cod_ Inversare_Coeficieni, cod_ Tiprire:
cod_Inversare_Coeficieni: dac este = 0, atunci se rezolv sistemul cu
) , ( / . 1 ) , ( j i a j i a = .
cod_ Tiprire: dac este = 0: Se tipresc permutrile i pivoii.
- check_text: text de max. 20 caractere. Primul caracter este semnificativ,
anume:
C, c, P, p: se face proba b Ax = (concret, se tiprete
vectorul Ax b).
Observaie
Dac se cere proba, atunci programul principal salveaz A i B nainte de apelul
lui ELIM
Datele de ieire se scriu n continuarea datelor de intrare v. mai jos

Not
74
Pentru urmtoarele programe, v. modificrile fa de Gauss n comentariile din
programul principal.
Gauss_D
Gauss n dubl precizie.
Gauss +
Gauss, cu tipriri suplimentare (cf. valori kod_Print):
- matricile L,U; Determinatul;
- termenii liberi g;
- Proba LU = A sau A-permutat.

Exemplul-1: Matrice 33, 2 termeni liberi.
(
(
(

=
1 4 3
4 1 2
3 2 1
A ;
(
(
(

=
1 8
1 7
1 6
b .

Fiierul de intrare/ieire:
Test: solutia_1 =1, 1, 1
3 2
1 2 3
2 1 4
3 4 1

6 7 8
1 1 1
0 0
proba

* Solutia pentru termenii liberi nr. 1
x(1) = 1.000000
x(2) = 1.000000
x(3) = 1.000000

* Solutia pentru termenii liberi nr. 2
x(1) = 0.1490116E-07
75
x(2) = 0.2000000
x(3) = 0.2000000

* Proba Ax =b:

Solutia nr. 1: A*x -b
1 0.0000000E+00
2 0.0000000E+00
3 0.0000000E+00

Solutia nr. 2: A*x -b
1 0.0000000E+00
2 0.0000000E+00
3 0.0000000E+00


Exemplul-2: Matrice singular
Fiierul de intrare/ieire (Ex2.dat):
Matrice 4x4: singulara.
4 1
5 6 3 1
-1 0 -1 1
2 2 1 6
4 2 3 4

4*1
0 1 ! kodInv, kodPrint
Check

Permutare, Pivot:
1 5.000000
2<->4 -2.800000
3 -0.2857143
4 7.7486033E-07

Linia 4: Pivot = 7.7486033E-07

76
* Pivot <1.00E-06 !
* Sistemul nu se poate rezolva.

Not
Acest exemplu arat de ce s-a ales pragul egal cu 1E-6

Gauss_AB
Eliminarea Gauss lucrul cu matricea extins.
Fiiere:
Elim_AB.f90; Main-Elim_AB.f90; width.f90; GetFile.f90; Openfile.f90;

Subrutina metodei:
ELIM (AB, n, ncol, prag, kod, pivot)

Parametri formali:
AB(n, ncol): matricea coeficienilor extins cu termenii liberi.
n: numrul ecuaiilor.
ncol: ncol = n + nb, unde nb este numrul de termeni liberi (ncol este definit
n programul principal).
prag: prag pentru pivot ~ 0.
kod : cod pentru eliminarea Gauss:
kod = 0: o.k.; kod =0: pivot ~ 0 (pivot < prag).
pivot: valoare pivot, cnd pivot < prag.

Metoda este aceeai ca la Gauss, cu deosebirea c acum, subrutina metodei lucreaz
cu matricea extins AB(n, ncol). Soluiile sunt returnate in coloanele nb n : 1 + ale
matricii extinse.

Datele de intrare se citesc dintr-un fiier de date. Acesta are aceeai structur ca la
Gauss, cu deosebirea c nu mai conine codul de tiprire:
- Titlu: text de max. 80 caractere
- n, nb: nr. de ecuaii; nr. de termeni liberi.
- Matricea coeficienilor A: n n. Se scrie aa cum e dat - pe linii i coloane.
77
- Termenii liberi b: Se scriu pe linii: nb linii a n termeni liberi.
- cod_ Inversare_Coeficieni:
cod_Inversare_Coeficieni: dac este = 0, atunci se rezolv sistemul cu
) , ( / . 1 ) , ( j i a j i a = .
- check_text: text de max. 20 caractere. Primul caracter este semnificativ,
anume:
C, c, P, p: se face proba b Ax = .
Observaie
Dac se cere proba, atunci programul principal salveaz matricea AB nainte de
apelul lui ELIM
Datele de ieire se scriu n continuarea datelor de intrare i conin soluia i proba
(dac este comandat prin check_text).

LU
Rezolvarea prin descompunerea LU (calculul direct al factorilor L i U) metoda
Doolittle. Cu pivotare parial.

Fiiere:
Primele 5 fiiere constituie subrutinele metodei.
LUdecomp.f90: descompunerea LU
LUsolve.f90: substituie napoi
apvt-LU.f90: pivotare parial
compute_a_ii.f90: calculul pivotului (nainte de pivotare)
swap_row.f90: schimbare de linii

Main-LU.f90: programul principal
width.f90: utilitar

Metoda:
Metoda const n paii:
1. Factorizare LU A = , cu pivotare parial.

A =
L
U
78

2. Rezolvarea sistemului b Ly = , prin substituie
nainte; rezult y.

3. Rezolvarea sistemului y Ux = , prin substituie
napoi; rezult x.

Formulele pentru calculul elementelor lui L i U cu
ii
l ales arbitrar (nenul):
ii
l = ales arbitrar (nenul), i = 1, 2, .. , n
ii
i
k
kj ik ij
ij
l
u l a
u

=

=
1
1
, j = i, i+1, , n (a)
Dac 0 =
ii
u , 1 , 1 = n i , rezult:
ii
i
k
ki jk ji
ji
u
u l a
l

=

=
1
1
, j = i+1, , n (b)
Elementele lui L si U se determin n urmtoarea secven, conform schemei de mai
jos (se calculeaz elementele din linia i din U, i coloana i din L).
i n
i i
n i i i i i ii
l
l
u u u l
,
, 1
, 1 , ,

+
+
+


n particular, la n i = , se calculeaz numai
nn
u - din (a).
Metoda Doolittle pune 1 =
ii
l .
Numrul de operaii este acelai ca n eliminarea Gauss ( 3
3
n ~ ).

Pivotare:
Pivotarea trebuie fcut nainte de calculul elementelor lui U i L. Adic, pivotul
ii
u
trebuie calculat i testat nainte de aplicarea formulelor (a) i (b).
y b =
L
U
=
x y
79
Pentru metoda Doolittle, pivotul este dat de (cf. a):

=
=
1
1
i
k
ki ik ii ii
u l a u
Aa cum se art n Exemplu-2, trebuie pivotat i dac pivotul este foarte mic. Practic,
se testeaz dac pivotul este mai mic dect un prag.
Dou strategii de pivotare parial sunt disponibile, comandate printr-un cod: cutarea
pivotului maxim nenul, sau cutarea primului pivot nenul. Pragul este ales ca 6 1 E .
Prima strategie ofer, n general, o precizie mai bun, n satisfacerea verificrii
soluiei, ns consum mai mult timp de calcul.

Observaie
- Dac nu se pivoteaz, atunci avem LU = A.
- Dac se pivoteaz, atunci avem A LU ' = , unde PA A = ' , iar P este o matrice
de permutare de linii. Matricea A' se obine din A, permutnd liniile n
aceeai ordine n care se permut la pivotare. Sistemul care se rezolv este
b x A ' = ' , unde b' este b cu liniile permutate n ordinea de la pivotare

Calculul determinantului:
Determinantul matricii LU A = ' este
nn
u u u
22 11
) det( = ' A
Determinantul matricii A va fi
) det( ) 1 ( ) det(
_
A A ' =
l n
,
unde n_l este numrul de schimbri de linii n cursul pivotrii.

LU_D
LU n dubl precizie.

Subrutina de descompunere LU (Pasul 1) este:
80
LUdecomp(A, n, order, do_pvt, kodPivot, kod)
LUdecomp face:
- Stocare compact: L i U n A, n triunghiul inferior, respectiv superior.
(Elementele diagonale din L fiind 1 nu se mai stocheaz.)
- Pivotare parial - prin apel apvt-LU; aceasta apeleaz compute_a_ii.f90 i
swap_row.f90.
Ordinea liniilor (dup pivotare) e stocat n vectorul order; order se
utilizeaz pentru ordonarea membrilor doi - la rezolvare (n LUsolve).

Parametri formali:
A: matricea sistemului
n: numrul de ecuaii
order: vector ntreg
do_pvt: dat logic; valori: T/F: pivoteaz sau nu.
kodPivot: cod pentru strategia de pivotare:
kodPivot = 0: pivot maxim; kodPivot = 0: primul pivot nenul.
kod: cod de test pivot:
kod = 0: o.k.; kod <0: pivot <prag

Subrutina de rezolvare este:
LUsolve(LU, b, n, x, order)
Paii 2 i 3 de mai sus.
Elementele din b sunt re-aranjate conform schimbrilor de linii.
Soluia este returnat in x.

Parametri:
LU: echivalentul LU a lui A (stocare compact)
b: vectorul termenilor liberi
x: soluia
order: vector ntreg
Observaie
n LU i LUsolve, produsele scalare se calculeaz n dubl precizie

81
Subrutinele se apeleaz astfel (n programul principal):
call LUdecomp(A, n, order, do_pvt, kodPivot, kodLU)

! Solutia pentru "nb" termeni liberi:
do kb =1, nb
call LUsolve(A, b(1:n, kb), n, x1, order)
b(1:n, kb) =x1
enddo

Datele de intrare se citesc dintr-un fiier de date. Acesta conine urmtoarele date
(scrise pe linii):
- Titlu: text; max. 80 caractere
- n, nb: numr de ecuaii; numr de termeni liberi.
- Matricea coeficienilor A: n n (Se scrie pe linii si coloane).
- Termenii liberi b: Se scriu pe linii: nb linii a n termeni liberi.
- Cod_Tiprire, Cod_inversare_ coeficieni: 0 / =0; 0 / =0.
o Cod_Tiprire = 0: Soluia, n fiierul de date.
Pentru Cod_Tiprire = 0, se tipresc n plus datele de mai jos.
o Cod_Tiprire = 1: Soluia, la display; Matricile L si U, n fiierul
de date.
o Cod_Tiprire > 2: Vectorul order, la fiecare pivotare;
Determinantul lui A; Dac | u(i, i) | < prag: Se
tiprete i linia i a matricii A (la pasul
respectiv).
o Cod_inversare_ coeficieni = 0: ) , ( / . 1 ) , ( j i a j i a =
- Cod pivotare, kod_pivot:
o Cod_pivotare: logic, valori T/F: Da / Nu.
o kodPivot: = 0: pivot maxim; = 0: primul pivot nenul.
- Check_text: max. 20 caractere; primul caracter este semnificativ:
C, c, P, p / alt caracter: Verific / Nu verific - soluia.
F, f: Se verific soluia i LU = PA (PA este A permutat).

Observaie
82
Dac se cere verificarea, atunci programul principal salveaz A i b nainte de
apelul lui LUdecomp

Datele de ieire se scriu n fiierul de date, dup datele de intrare.

Exemplele 1 i 2 de mai jos, se refer la sistemul:
(
(
(
(

=
4 4 6 6
1 1 5 . 1 5 . 1
4 4 6 6
1 1 1 4
A ;
(
(
(
(

=
1
1
1
1
b .

Exemplu 1 (Fiier de date u3.dat):
Matrice 4x4 cu u22 =0; u33=0. Fara pivotare.
4 1
-4 1 1 1
-6 6 4 4
-1.5 -1.5 1 1
-6 6 4 -4
4*1
3 0
F 0
Check

Pas 1 - ORDER: 1 2 3 4
-4.000000

Pas 2 - ORDER: 2 3 4
4.500000

Pas 3 - ORDER: 3 4
1.666667

Pas 4 - ORDER: 4
-8.000000

Numar de schimbari de linii = 0
83

Matricea L
1.000000
1.500000 1.000000
0.3750000 -0.4166667 1.000000
1.500000 1.000000 0.000000 1.000000

Matricea U
-4.000000 1.000000 1.000000 1.000000
4.500000 2.500000 2.500000
1.666667 1.666667
-8.000000

Determinant(A) = 240.0000

* Solutia pentru termenii liberi nr. 1
x(1) = -0.2500000
x(2) = -0.2500000
x(3) = 0.2500000
x(4) = 0.000000

* Proba Ax =b:
A*x -b
1 0.0000000E+00
2 -5.9604645E-08
3 1.1920929E-07
4 -5.9604645E-08


Exemplu 2 (Fiier de date u3-p.dat):
Matrice 4x4 cu u22 =0; u33=0. Pivotare.
4 1
-4 1 1 1
-6 6 4 4
-1.5 -1.5 1 1
-6 6 4 -4
4*1
84
3 0
T 1
Check

Pas 1 - ORDER: 2 1 3 4
-6.000000
pas 2 (test) - order: 4 3 1
u(2,2) = 0.000000

Pas 2 - ORDER: 1 3 4
-3.000000
pas 3 (test) - order: 4 3
u(3,3) = 0.000000

Pas 3 - ORDER: 3 4
1.666667

Pas 4 - ORDER: 4
-8.000000

Numar de schimbari de linii = 1

Matricea L
1.000000
0.6666667 1.000000
0.2500000 1.000000 1.000000
1.000000 0.000000 0.000000 1.000000

Matricea U
-6.000000 6.000000 4.000000 4.000000
-3.000000 -1.666667 -1.666667
1.666667 1.666667
-8.000000

Determinant(A) = 240.0000

* Solutia pentru termenii liberi nr. 1
85
x(1) = -0.2500000
x(2) = -0.2500000
x(3) = 0.2500000
x(4) = 0.000000

* Proba Ax =b:
A*x -b
1 0.0000000E+00
2 0.0000000E+00
3 0.0000000E+00
4 0.0000000E+00


LU\Crout
Rezolvarea prin descompunerea LU metoda Crout.

Fiiere:
LUdecomp-Crout.f90; LUsolve-Crout.f90; apvt-Crout.f90; compute_a_ii_Crout.f90;
swap_row.f90; Main-Crout.f90; width.f90;
Semnificaiile sunt aceleai ca ale fiierelor din metoda Doolittle.

Metoda:
Metoda este analog cu Doolittle, cu deosebirea c acum se aleg arbitrari
ii
u , iar
pivotul este
ii
l .
Metoda Crout pune 1 =
ii
u .

LU_Complex
Descompunere LU matrice complex, metoda Doolittle
Fiiere:
LUdecomp_z.f90; LUsolve_z.f90; apvt-LU_z.f90; compute_a_ii_z.f90;
swap_row_z.f90; Main-LU_complex.f90; width.f90;
Semnificaiile sunt aceleai ca ale fiierelor din metoda Doolittle.

86
Fiierul de date are aceeai structur ca fiierul de date din LU, cu particularitile:
- Matricea A: elementele se introduc prin partea real i partea imaginar;
- Termenii liberi b: se introduc ca valori complexe, n forma (x, y). Parantezele
sunt obligatorii.

Exemplu:
(
(
(

+
+ +
+
=
i i
i i i
i i i
2 3 5 4
2 1 6 2 1
3 4 2 2 3
A ;
(
(
(

+

+
=
i i
i i
i i
2 1 2
7 6 3 4
5 10 5
b .

Fiierul de date este (test-p.dat):
Test: solutia_1 =(1,0) (1,0) (1,0); solutia_2 =(1,-1) (2,1)
(0,3)
3 2
3 -2 2 4 0 -3
1 1 2 -6 1 2
4 0 -5 1 3 -2

(5,-1) (4,-3) (2,-1)
(10,5) (6,-7) (-1,2)
2 0
T 1
FProba

Pas 1 - ORDER: 3 2 1
(4.000000,0.0000000E+00)

Pas 2 - ORDER: 2 1
(3.500000,-5.000000)

Pas 3 - ORDER: 1
(0.2046980,-0.4932886)

Numar de schimbari de linii = 1

Matricea L
87
1.000000 0.000000
0.2500000 0.2500000 1.000000 0.000000
0.7500000 -0.5000000 0.3926175 0.7751678
1.000000 0.000000

Matricea U
4.000000 0.000000 -5.000000 1.000000
3.000000 -2.000000
3.500000 -5.000000 -0.2500000 1.750000
0.2046980 -0.4932886

Determinant(A) = 7.000001 11.00000

* Solutia pentru termenii liberi nr. 1
x(1) = 1.000000 -0.1641187E-06
x(2) = 0.9999999 0.9099531E-07
x(3) = 0.9999998 0.2314062E-06

* Solutia pentru termenii liberi nr. 2
x(1) = 1.000000 -1.000000
x(2) = 2.000000 1.000000
x(3) = -0.6782657E-06 3.000000

* Proba Ax =b:

Solutia nr. 1: A*x -b
1 (-4.7683716E-07,2.3841858E-07)
2 (-2.3841858E-07,2.3841858E-07)
3 (-1.1920929E-07,0.0000000E+00)

Solutia nr. 2: A*x -b
1 (0.0000000E+00,9.5367432E-07)
2 (4.7683716E-07,-4.7683716E-07)
3 (-1.1920929E-07,4.7683716E-07)

* Proba LU =PA: L*U
(4.000000,0.0000000E+00) (-5.000000,1.000000) (3.000000,
88
-2.000000)
(1.000000,1.000000) (2.000000,-6.000000) (1.000000,2.000000)
(3.000000,-2.000000) (2.000000,4.000000) (0.0000000E+00,
-3.000000)


LU_Complex\Crout_Complex
Descompunere LU matrice complex, metoda Crout
Fiiere:
LU_Decomp_Crout_z.f90; LUsolve-Crout_z.f90; apvt-Crout_z.f90;
compute_a_ii_Crout_z.f90; swap_row_z.f90; Main-Crout_Complex.f90; width.f90;
Semnificaiile sunt aceleai ca n LU metoda Crout.

Cholesky
Metoda Cholesky cu matricea L.

Metoda:
Se aplic pentru un sistem cu matrice simetric i pozitiv definit. Pentru o astfel de
matrice exist o descompunere LU, n care U este transpusa lui L, adic
T
LL A = . Metoda Cholesky nu necesit pivotare.

Paii rezolvrii sunt aceeai ca paii LU, anume:
1) Factorizare:
T
LL A =
2) Calculul lui y, prin substituie nainte: b Ly =
3) Calculul soluiei x, prin substituie napoi: y x L =
T
.
Pentru n = mare, numrul de operaii n metoda Cholesky este
6
3
n
NOP
Cholesky
~
Adic,
Gauss Cholesk
NOP NOP
2
1
~ .
89
Fiiere:
Cholesky.f90; Forward.f90; Back.f90; Loca.f90; Main_Cholesky-2004.f90; width.f90

Subrutinele metodei sunt:
cholesky(a, kod): Descompunerea Cholesky (Pasul 1)
forward(l,b): Substituie nainte (Pasul 2)
back(l,b): Substituie napoi (Pasul 3)
Ele se apeleaz astfel (n programul principal):
call Cholesky(a, kod)

do k =1,nb
call forward(a,b(:,k))
call back(a,b(:,k))
enddo

Parametrii formali sunt:
a: vector de dimensiune 2 / ) 1 ( + n n . Acesta stocheaz:
La intrare: matricea A (triunghiul inferior, pe linii);
La ieire: matricea L (triunghiul inferior).
kod: cod de ieire din descompunerea Cholesky:
0: ok; -1: Matricea nu este pozitiv definit.
l: vector de dimensiune 2 / ) 1 ( + n n . Acesta stocheaz matricea L.
b: vector de dimensiune n, care stocheaz la intrare termenii liberi, i la ieire
soluia. Anume:
Forward: b, i y; Back: y, i x.
La acestea, se adaug o funcie care calculeaz adresa elementului A(i, j) n vectorul
de stocare a, anume Loca(i, j).

Main_Cholesky-2004.f90: programul principal
Observaie
Programul principal stocheaz matricea A n vectorul a de dimensiune 2 / ) 1 ( + n n

width.f90: utilitar

90
Datele de intrare se citesc dintr-un fiier de date, care conine:
Titlu: text, max. 80 caractere.
n, nb: n = numrul de ecuaii; nb = numrul de termeni liberi.
a: triunghiul inferior din A.
b: termenii liberi; se scriu pe linii: nb linii a n termeni liberi.
kod: Cod de tiprire
check_text: text, max. 20 caractere. Primul caracter e semnificativ:
C, c, P, p : se verifica soluia calculat.

Datele de ieire se scriu n continuarea datelor de intrare.

Exemplu (Matricea A, din Jennings (1980), p. 106):
(
(
(

=
22 4 8
4 5 4
8 4 16
A ;
(
(
(

=
26 2 1
5 2 1
28 2 1
b .

Fiier de date (2.dat):
Test pentru Cholesky
3 3
16
4 5
8 -4 22
1 1 1
2 2 2
28 5 26
1
Proba

Matricea L
4.000000
1.000000 2.000000
2.000000 -3.000000 3.000000

* Solutia pentru termenii liberi nr. 1 - 3:
1 2 3
91
x1: -0.1423611 -0.2847222 1.000000
x2: 0.4583333 0.9166667 1.000000
x3: 0.1805556 0.3611111 1.000000

* Proba Ax =b:

Solutia nr. 1: A*x -b
1 0.0000000E+00
2 -5.9604645E-08
3 1.1920929E-07

Solutia nr. 2: A*x -b
1 0.0000000E+00
2 -1.1920929E-07
3 2.3841858E-07

Solutia nr. 3: A*x -b
1 0.0000000E+00
2 0.0000000E+00
3 0.0000000E+00


Cholesky_S
Metoda Cholesky cu matricea S.
Metoda:
Metoda este aceeai cu cea expus la Cholesky. Cu deosebirea c acum, matricea de
referin este matricea
T
L S = . Astfel, paii sunt:
1. Factorizare: S S A
T
=
2. Calculul lui y, prin substituie nainte: b y S =
T

3. Calculul soluiei x, prin substituie napoi: y Sx= .
Programul principal stocheaz acum, n vectorul a, triunghiul superior al lui A (pe
coloane).
92
Datele de intrare i ieire sunt aceleai ca la Cholesky, cu deosebirea c matricea A se
introduce prin elementele triunghiului superior.

Fiiere:
Cholesky_S.f90; Forward.f90; Back.f90; Loca.f90; Main_Cholesky_S.f90; width.f90;
Semnificaiile sunt aceleai ca ale subrutinelor din Cholesky.

Exemplu:
Exemplul din Cholesky, pentru coloanele 1 i 3 de termeni liberi.
Fiier de date: 1.dat

Cholesky_Band
Cholesky pentru matrici band (simetrice i pozitiv definite).
Matrice band: elementele unei linii sunt alctuite din:
- Elementul diagonal, un numr de LIM-1 elemente la stnga acestuia, i LIM-1
elemente la dreapta.
- Celelalte elemente din linie sunt zero.
Numrul LIM se zice semi-limea de band. LIM reprezint numrul elementelor din
semi-band, inclusiv elementul diagonal.
Observaie
ntre elementele din band, pot fi i elemente nule, dar elementele situate n afara
benzii sunt toate nule. n acest sens, LIM este semi-limea de band maxim
De exemplu, o matrice 66, cu LIM = 3, are structura:
(
(
(
(
(
(
(
(

66
56 55
46 45 44
35 34 33
24 23 22
13 12 11
0
0 0
0 0 0
a
a a Simetric
a a a
a a a
a a a
a a a


Metoda:
Matricea band se presupune simetric i pozitiv definit.
93
Descompunerea
T
LL sau S S
T
poate fi fcut lucrnd exclusiv n band. n ceea ce
urmeaz se consider descompunerea S S A
T
= , lucrnd cu semi-banda superioar.
Paii sunt cei de la Cholesky_S.
1) Descompunerea Cholesky:
Elementele active la un pas al descompunerii, sunt coninute ntr-un triunghi cu
laturile LIM numit triunghiul activ. n cursul procesului, triunghiul activ coboar
cu cte o linie n band.
Metoda utilizeaz un vector de lucru Y, de dimensiune NY, unde se definesc:
2 / ) 1 ( 0 + - = LIM LIM NY ; LIM n NY NY - + = 0 .
Acest vector este constituit din dou pri:
- Sub-vectorul Y1( 0 : 1 NY ), de dimensiune 2 / ) 1 ( + - LIM LIM : servete ca
front de lucru, pentru descompunerea Cholesky; n acestea se genereaz
elementele triunghiului activ la un pas (triunghi cu laturile LIM).
- Sub-vectorul YA( NY NY : 1 0 + ), de dimensiune LIM n- : iniial, stocheaz
matricea A, pe linii. n cursul descompunerii Cholesky, stocheaz liniile
procesate ale matricii A.


Figura 7 - Tablourile Y1 i YA

2) Soluia:
Aceasta se calculeaz prin substituie nainte i napoi (paii 2 i 3).
Pentru alte consideraii privind metoda (stocare, algoritm), v. Cap. 4, 5.6.

Fiiere:
AA.f90: funcie care genereaz elementul (i, j) al matricii band A
LIM-(LIM+1)/2
Y1
LIM LIM LIM
YA
94
Cholesky_Band.f90: descompunerea Cholesky n band
Loca.f90: funcie care calculeaz adresa elementului A(i, j) n vectorul Y
Lof.f90: Locul n front: adresa unui element din triunghiul activ, n vectorul
Y1.
Main-Cholesky_Band_2005.f90: programul principal
Solve.f90: calculeaz soluia
width.f90: utilitar
Fiier de date: b6-3.dat

Datele de intrare se citesc dintr-un fiier de date, care conine:
Titlu: text, max. 80 caractere.
n, LIM, nb: n = numrul de ecuaii; LIM = semi-limea de band (inclusiv
elementul diagonal); nb = numrul de termeni liberi.
A: semi-banda superioar din A, anume: se scriu n linii de LIM elemente;
pentru ultimele linii se adaug elemente nule (la dreapta), pn la
mplinirea numrului de LIM elemente.
b: termenii liberi: Se scriu pe linii; nb linii a n termeni liberi.
kod: cod de tiprire:
kod = 0: se tiprete soluia;
kod =0: se tiprete i matricea S;
kod > 2: se tiprete i proba A S S =
T
.
check_text: text, max. 20 caractere. Primul caracter este semnificativ:
C, c, P, p: se verifica soluia.

Exemplu:
Se consider sistemul definit de:
(
(
(
(
(
(
(
(





=
4
1 4
1 1 4
0 1 1 4
0 0 1 1 4
0 0 0 1 1 4
Simetric
A ;
(
(
(
(
(
(
(
(

=
2 1
1 1
0 1
0 1
1 1
2 1
b

Fiier de date (b6-3.dat):
95
Test pentru Cholesky: matrice banda - semi-banda superioara
6 3 2
4 -1 -1
4 -1 -1
4 -1 -1
4 -1 -1
4 -1 0
4 0 0
6*1
2 1 0 0 1 2
1
Check

Matricea A:
4.000000 -1.000000 -1.000000
4.000000 -1.000000 -1.000000
4.000000 -1.000000 -1.000000
4.000000 -1.000000 -1.000000
4.000000 -1.000000
4.000000


Matricea S:
2.000000 -0.5000000 -0.5000000
1.936492 -0.6454972 -0.5163978
1.825742 -0.7302967 -0.5477226
1.788854 -0.7826238 -0.5590170
1.757128 -0.8180962
1.737302

* Solutia pentru termenii liberi nr. 1 - 2:
1 2
x1: 0.9047619 1.000000
x2: 1.190476 0.9999999
x3: 1.428571 0.9999999
x4: 1.428572 1.000000
x5: 1.190476 1.000000
96
x6: 0.9047620 1.000000

* Proba Ax =b:
Solutia nr. 1: A*x -b
1 0.0000000E+00
2 -2.3841858E-07
3 -1.1920929E-07
4 4.1723251E-07
5 1.7881393E-07
6 0.0000000E+00

Solutia nr. 2: A*x -b
1 1.1920929E-07
2 -1.7881393E-07
3 -1.7881393E-07
4 0.0000000E+00
5 -5.9604645E-08
6 4.7683716E-07


III-2 Analiza erorii i condiionare
Numar_Conditie
Calculul numrului de condiie al unei matrici, dup norma- i norma-1.

Metoda:
Se d sistemul Ax = b. Considerm o perturbaie r a termenilor liberi, adic noi
termeni liberi r b b + =
~
, unde || || / || || b r este mic. Sistemul devine b x A
~
~
= .
Notm perturbaia soluiei prin x x e =
~
, i avem
) (
|| || / || ||
|| || / || ||
) (
1
A
b r
x e
A
Cond
Cond
s s ,
n care:
Cond(A) = || A || || A
-1
||.
Numrul Cond(A) este numrul de condiie al matricii A. Avem 1 ) ( > A Cond .
97
- Dac Cond(A) ~ 1: A se zice bine-condiionat;
|| e || / || x || este mic, adic este de ordinul lui || || / || || b r .
- Dac Cond(A) >> 1: A se zice ru-condiionat;
|| e || / || x || poate fi mare, adic || || / || || || || / || || b r x e >> .
Numrul de condiie depinde de norma considerat. n particular, se definete
) ( ) ( ) (
1
-
= A A A Cond ,
n care: ) (A este raza spectral a matricii A, definit de | ) ( | max ) ( A A
i
i
= unde
n i
i
, 1 ), ( = A sunt valorile proprii ale matricii A. Avem, pentru orice norm,
-
> ) ( ) ( A A Cond Cond . Numrul
-
) (A Cond se calculeaz prin
| | min
| | max
) (
) (
) (

o
o
A
A
A
e
e
-
= Cond .

Programul calculeaz numrul de condiie pentru normele

|| . || i
1
|| . || , definite prin:

j
ij
i
a | | max || || A
Aceasta se zice norma liniilor, i este maximul sumelor modulelor elementelor, pe
linii.

=
i
ij
j
a | | max || ||
1
A
Aceasta se zice norma coloanelor, i este maximul sumelor modulelor elementelor, pe
coloane.

Fiiere:
Main-Numar_Conditie.f90;Normlnf.f90; Norm1.f90; Elim2004.f90; width.f90;

Main-Numar_Conditie.f90: programul principal
Normlnf.f90, Norm1.f90: norma- i norma-1, ale unei matrici
Elim2004.f90: eliminarea Gauss; aceasta servete pentru calculul matricii inverse.
width.f90: utilitar

98
Subrutina de eliminare Gauss este ELIM2 (n, nb, A, B, prag, kod). Parametrii au
aceleai semnificaii ca la ELIM din Gauss (cu deosebirea c, ntre parametri, nu mai
apare codul kodPrint).

Datele de intrare se citesc dintr-un fiier de date, cu structura de mai jos. Datele de
ieire se scriu n fiier, dup datele de intrare.

Fiier de date (intrare/ieire):
Titlu: text, max. 80 caractere
n: ordinul matricii A
Matricea A: n n; se scrie aa cum e dat - pe linii i coloane
Cod_Inversare_Coeficieni, Cod_Tiprire: 0 / 0.
- Cod_Inversare_Coeficieni 0: se face ) , ( / . 1 ) , ( j i a j i a =
- Cod_Tiprire 0: se tiprete i
1
A .
Cod_Norma: cod pentru norm. Valori:
0: norma-infinit (norma liniilor);
1: norma-1 (norma coloanelor)
2 (sau, alt numr dect 0 sau 1): norma-2: Nu este implementat; se ia
implicit, norma-infinit.
Numar_conditie 2013
Suport generarea matricii A.
Acelai fiier de intrare.

Exemplu:
Test:
3
1 2 3
2 1 4
3 4 1
0 1
3 ! Cod norma

Matricea inversa:
99
-0.7500000 0.5000000 0.2500000
0.5000000 -0.4000000 0.1000000
0.2500000 0.1000000 -0.1500000

Norma nedefinita: Se ia Norma-infinit (norma liniilor)

Norm(A) = 8.000000
Norm(A-invers) = 1.500000

Numarul de conditie = 12.00000

Hilbert
Calculul inversei matricii Hilbert.
Metoda:
Matricea Hilbert de ordinul n este:
(
(
(
(

=
+ +
+
1 2
1
2
1
1
1 1
1
1
4
1
3
1
2
1
1
3
1
2
1
...
...
... 1
n n n n
n
n
n

H
Matricea Hilbert este cunoscut ca fiind ru-condiionat, i anume, cu att mai ru-
condiionat cu ct ordinul n este mai mare.
Inversarea se face n modul obinuit, anume: Coloanele
) (i
x ale matricii inverse se
calculeaz rezolvnd sistemele liniare
) ( ) ( i i
n
e x H = , n i , 1 = , unde
) (i
e sunt coloanele
matricii unitate de ordinul n.

Fiiere:
Main-Hilbert2004.f90: programul principal
Elim2004.f90: eliminarea Gauss
width.f90: utilitar

n principiu, pentru aceast problem se pot utiliza oricare din metodele expuse
anterior, pentru sisteme liniare generale (Gauss, LU).
100
Avantajul este c, programul principal genereaz matricea Hilbert de ordinul n, i
termenii liberi pentru ordinul n (coloanele matricii unitate).
(n loc de, specificarea acestor date n fiierul de intrare, cum ar fi necesar n metodele
pentru o matrice general.)
Rezolvarea se face prin eliminare Gauss, prin apelul subrutinei ELIM2. Parametrii
formali sunt aceeai ca la subrutina ELIM din Gauss (cu deosebirea c ntre parametri
nu mai figureaz codul kodPrint).

Datele de intrare se introduc de la terminal i constau n: ordinul n; o dat logic
(T/F) pentru verificarea sau nu, a inversei calculate X.
Pentru verificare, se calculeaz produsul X H
n
; ar trebui s avem proba
n n
I X H = ,
unde
n
I este matricea unitate de ordinul n.

Faptul c matricea Hilbert este ru-condiionat, se poate constata din urmtoarele
rezultate:
- Elementele inversei calculate sunt afectate de erori cu att mai mari, cu ct
ordinul este mai mare. (Erorile se apreciaz n raport cu valorile exacte care
se cunosc analitic, sau n raport cu valorile calculate n dubl precizie);
- Inversa calculat verific tot mai ru proba, odat cu creterea lui n: adic,
erorile
n n
I X H sunt tot mai mari.

Exemplu:
Pentru n = 5, produsul X H
n
este:
0.9999927 1.5778195E-04 -1.0029844E-03 1.2790319E-04
1.3136200E-04
-4.5019597E-06 1.000019 6.0700515E-04 5.3869281E-04
-1.0658416E-04
7.5124717E-07 5.9086320E-05 1.000850 -2.8395746E-04
3.5124447E-04
0.000000 0.000000 0.000000 1.000000
0.000000
8.1506332E-06 -1.1893210E-04 2.6392794E-04 -7.2401995E-04
1.000145

101

III-3 Metode iterative
J acobi
Metoda Jacobi pentru sisteme liniare.
Exemplu numeric:
Fie sistemul:
8 8
3 2 1
= + x x x
12 9 2
3 2 1
= + + x x x
4 2 7
3 2 1
= + x x x
Rezolvm fiecare ecuaie i = 1, 2, 3, n raport cu necunoscuta
i
x , cutnd ca aceasta
s fie necunoscuta cu coeficientul cel mai mare din ecuaie, eventual rearanjnd
ecuaiile. Intervertind ecuaiile 2 i 3, avem:
3 2 1
) 8 / 1 ( ) 8 / 1 ( 1 x x x + =
3 1 2
) 7 / 2 ( ) 7 / 1 ( 7 / 4 x x x + + =
2 1 3
) 9 / 1 ( ) 9 / 2 ( 9 / 12 x x x =
Sau matriceal:
(
(
(

(
(
(

+
(
(
(

=
(
(
(

3
2
1
3
2
1
0 9 / 1 9 / 2
7 / 2 0 7 / 1
8 / 1 8 / 1 0
9 / 12
7 / 4
1
x
x
x
x
x
x
(1')
care este de forma
) ( ) 1 ( m m
Mx g x + =
+

Se itereaz, cu aproximaia iniial
T
] 9 / 12 7 / 4 1 [
) 0 (
= x ; testul de oprire a iteraiei
este 6 1 || ||
) ( ) 1 (
s

+
E
m m
x x . La iteraia 12 rezult soluia ) 0 . 1 , 0 . 1 , 0 . 1 ( .

Metoda:
102
Fie sistemul dat b Ax = . Se rezolv fiecare ecuaie i n raport cu necunoscuta
i
x .
Explicitnd x
i
se obine:
ii
n
i j j
j ij i i
a x a b x / ) (
, 1

= =
= , i = 1, 2, , n
S-a presupus 0 =
ii
a . Iteraia Jacobi va fi:

> = =
=

= =
+
0 ; ..., , 2 , 1 , / ) (
, 1
) ( ) 1 (
) 0 (
m n i a x a b x
arbitrar
ii
n
i j j
m
j ij i
m
i
x

Testul de oprire a iteraiei este eps
m m
s

+
|| ||
) ( ) 1 (
x x .
Metoda Jacobi se mai zice metoda iteraiilor simultane, pentru c, coordonatele
i
x
ale soluiei x se calculeaz independent unele de altele. (Pentru alt mod de calcul v.
metoda Gauss_Seidel, mai jos.)
Condiie suficient de convergen:
Matricea A este diagonal dominant, adic avem:
n i a a
n
i j j
ij ii
, 1 , | | | |
, 1
= >

= =

Pentru alte consideraii privind metoda, v. Cap. 4-IV.

Fiiere:
Jacobi.f90: programul principal care implementeaz metoda
Norm.f90: norma- a unui vector
width.f90: utilitar

Datele de intrare se citesc dintr-un fiier de date. Acesta are structura:
- Titlu: linie-text, max. 80 caractere.
- n: ordinul matricii
- Matricea A: n n; se scrie pe linii i coloane aa cum este dat.
- Termenul liber b: se scriu n linie, n valori
i
b .
- eps, lnit: tolerana, numrul limit de iteraii.
103
- kodPrint: cod de tiprire iteraii: 0 / = 0: Da / Nu.
- check_text: text de max. 20 caractere. Primul caracter este semnificativ:
C, c, P, p: se face proba se tiprete vectorul Ax b.

Datele de ieire se scriu n fiier, dup datele de intrare v. mai jos.

Exemplul numeric de mai sus:
Fiierul de intrare/ieire (Ex1.dat):
Exemplu pt. Jacobi
3
8 1 -1
1 -7 2
2 1 9
8 -4 12
1e-6 50
0
Proba

Toleranta atinsa.
Numar de iteratii: 12

Solutia:
1 1.000000
2 1.000000
3 1.000000

Proba "Ax-b":
1 9.5367432E-07
2 -4.7683716E-07
3 1.4305115E-06


Gauss_Seidel
Metoda Gauss-Seidel.
104
Se modific metoda Jacobi, astfel c, la calculul coordonatei
) (m
i
x se utilizeaz valorile
) (
1
m
x , ,
) (
1
m
i
x

deja calculate, care n general, sunt aproximaii mai bune ale soluiei.
Exemplu:
Considerm exemplul numeric din Jacobi. Ecuaiile se nlocuiesc cu cele de mai jos,
care ar trebui s ofere o convergen mai rapid:
) 0 (
3
) 0 (
2
) 1 (
1
) 8 / 1 ( ) 8 / 1 ( 1 x x x + =
) 0 (
3
) 1 (
1
) 1 (
2
) 7 / 2 ( ) 7 / 1 ( 7 / 4 x x x + + =
) 1 (
2
) 1 (
1
) 1 (
3
) 9 / 1 ( ) 9 / 2 ( 9 / 12 x x x =
ntr-adevr, cu
T
] 0 0 0 [
) 0 (
= x i aceeai toleran 6 1 E , soluia ) 0 . 1 , 0 . 1 , 0 . 1 ( se
obine la iteraia 9. Rezidualul maxim este 0.0.

Metoda:
Formulele generale ale metodei Gauss-Seidel sunt:

> = =
=

+ =

=
+ +
0 ; ..., , 2 , 1 , / ) (
1
) (
1
1
) 1 ( ) 1 (
) 0 (
m n i a x a x a b x
arbitrar
ii
n
i j
m
j ij
i
j
m
j ij i
m
i
x

Testul de oprire a iteraiei este eps
m m
s

+
|| ||
) ( ) 1 (
x x .
Metoda Gauss-Seidel se mai zice metoda iteraiilor succesive, pentru c la un pas
1 + m , m 0, de ndat ce o coordonat
) 1 ( + m
j
x a soluiei este calculat, ea se utilizeaz
n ecuaiile pentru coordonatele urmtoare
) 1 ( + m
i
x , i > j.
Condiii suficiente de convergen:
- matricea A este diagonal dominant.
- matricea A este simetric i pozitiv definit.
Cnd ambele metode Jacobi i Gauss-Seidel converg, metoda Gauss-Seidel converge
mai rapid.
Pentru alte consideraii privind convergena, v. Cap. 4-IV.

105
Fiiere:
Gauss_Seidel.f90: programul principal
norm.f90: norma- a unui vector
width.f90: utilitar

Datele de intrare se citesc dintr-un fiier de date. Acesta are aceeai structur ca i
fiierul de date din Jacobi.

Exemplu (Ex1.dat):
Exemplul de la Jacobi. Rezultatele sunt, acum:

Toleranta atinsa.
Numar iteratii: 9

Solutia:
x(1) = 1.000000
x(2) = 1.000000
x(3) = 1.000000

Proba "Ax-b":
1 0.000000
2 0.000000
3 0.000000


Sor
Metoda relaxrii (Succesive Over-Relaxation).
Metoda:
Relum formula metodei Gauss-Seidel:
0 ; ..., , 2 , 1 , / ) (
1
) (
1
1
) 1 ( ) 1 (
> = =

+ =

=
+ +
m n i a x a x a b x
ii
n
i j
m
j ij
i
j
m
j ij i
m
i

Formula se pune sub forma urmtoare, adunnd i scznd
) (m
i
x n membrul doi
(observai c acum, n a doua sum, indicele j ia valori de la i i nu de la 1 + i ):
106
n i a x a x a b x x
ii
n
i j
m
j ij
i
j
m
j ij i
m
i
m
i
, 1 , / ) (
) (
1
1
) 1 ( ) ( ) 1 (
= + =

=

=
+ +

Termenul care se adun la
) (m
i
x este diferena ) (
1 m
i
m
i
x x
+
. Metoda SOR const n
nmulirea acestei diferene cu un factor de accelerare (sau relaxare) e >1 . ntruct
e > 1, metoda se zice supra-relaxare. Alegerea lui e se discut mai jos. Formula
metodei SOR este deci
n i a x a x a b x x
ii
n
i j
m
j ij
i
j
m
j ij i
m
i
m
i
, 1 , / ) (
) (
1
1
) 1 ( ) ( ) 1 (
= + =

=

=
+ +
e
sau, explicitnd
) (m
i
x din a doua sum:
n i x a x a x a b x
m
i ii
n
i j
m
j ij
i
j
m
j ij i
m
i
, 1 , ) 1 ( / ) (
) (
1
) (
1
1
) 1 ( ) 1 (
= + =

+ =

=
+ +
e e
Se noteaz expresia din prima parantez cu
) 1 ( + m
i
z (aceasta este coordonata i a iteratei
) 1 ( + m din metoda Gauss-Seidel.) .
Formula de iterare este echivalent cu urmtoarele ecuaii considerate pentru n i , 1 = :
, / ) (
1
) (
1
1
) 1 ( ) 1 (
ii
n
i j
m
j ij
i
j
m
j ij i
m
i
a x a x a b z

+ =

=
+ +
=
) ( ) 1 ( ) 1 (
) 1 (
m
i
m
i
m
i
x z x e e + =
+ +

n cele mai multe cazuri, valoarea optim a lui e satisface relaia
1 < e < 2.
n practic, se poate alege e , astfel: se utilizeaz valori e de test, pe un numr
limitat de iteraii; se alege ca valoare optim acel e, pentru care convergena este cea
mai rapid.

Fiiere:
SOR.f90: programul principal
norm.f90: norma- a unui vector
width.f90: utilitar

107
Datele de intrare se citesc dintr-un fiier de date. Acesta are aceeai structur ca i
fiierul de date din Jacobi, cu deosebirea: dup datele eps, lnit, se introduce data:
- omega: factorul de accelerare e

Exemplu:
Considerm exemplul de mai jos. Pentru acesta, metoda Gauss-Seidel face 27 de
iteraii i d soluia
) 27 (
x = [0.9999999 0.9999999 0.9999999 0.9999999
0.9999999]
T
. Alegem 3 . 1 = e (valoarea optim). Se obin rezultatele de mai jos.
Fiierul de intrare/ieire:
Test pentru Gauss-Seidel & SOR. Solutia: 1,1,1,1,1.
5
4 -1 -1 0 0
-1 4 -1 -1 0
-1 -1 4 -1 -1
0 -1 -1 4 -1
0 0 -1 -1 4
2 1 0 1 2
1.E-7 50
1.3
0
P

Toleranta atinsa.
Numar iteratii: 16

Solutia:
x(1) = 1.000000
x(2) = 1.000000
x(3) = 1.000000
x(4) = 1.000000
x(5) = 1.000000

Proba "Ax-b":
1 0.000000
2 0.000000
108
3 0.000000
4 0.000000
5 0.000000

109
CAPITOLUL IV VALORI I VECTORI PROPRII
Folder tematic: $ Eigen
Foldere:
Power; Power_Complex; Inverse_Power_Shift; Inverse_Power_Complex;
Sim_Iter: metoda puterii i variante ale acesteia.
Jacobi; QR: metodele Jacobi i QR.

Problema de valori proprii (sumar)
Fie dat matricea A n n , real sau complex.
Dac vectorul 0 x = i scalarul satisfac relaia
x Ax = , (1)
atunci: se numete valoare proprie, iar x vectorul propriu asociat lui .
Dac x i y sunt asociai cu , atunci i y x | o + , | o, scalari, este asociat lui .

Dac P este o matrice n n nesingular, matricea
AP P A
1
= '
se zice similar cu A. P se zice matrice de transformare.
Matricile similare au aceleai valori proprii. Dac x' sunt vectorii proprii ai lui A' ,
vectorii proprii ai lui A se gsesc din relaia
x P x ' = .
Mai multe metode numerice transform matricea A ntr-o matrice similar A' , de o
form mai simpl, determinnd valorile proprii i vectorii proprii ai matricii A' ; apoi,
se determin vectorii proprii ai lui A, cu relaia de mai sus.

Polinomul caracteristic:
Relaia (1) este ecuaia din care se gsesc i x. Aceasta se mai scrie
0 x I A = ) ( (2)
unde I este matricea unitate. Explicit,
110
(
(
(
(

=
(
(
(
(

(
(
(
(

0
0
0
2
1
2 1
2 22 21
1 12 11

n nn n n
n
n
x
x
x
a a a
a a a
a a a

(2')
Condiia ca (2) s aib soluii netriviale x, este 0 ) det( = I A . Explicit,
0 ) (
2 1
2 22 21
1 12 11
=

nn n n
n
n
a a a
a a a
a a a
p

(3)
p() se zice polinomul caracteristic al matricii A, i p() = 0 ecuaia caracteristic.
Fie determinantul desvoltat:
n n
n n n
c c c p + + + + =


1
1
1
) 1 ( ) (
Proprieti ale coeficienilor i valorilor proprii:
) det(A =
n
c ; ) det(
2 1
A =
n
.

=
n
ii
n
a c
1
1
1
) 1 ( ;

= + + +
n
ii n
a
1
2 1
.
Not:

=
n
ii
a Tr
1
) (A se zice urma matricii A.
n general:
=
i n
i
c ) 1 ( Suma minorilor principali de ordin i ai matricii A.

Observaii
1. Ordonarea valorilor proprii:
Valorile proprii se ordoneaz n irul
n
, , ,
2 1
. n acest ir, o rdcin multipl
de ordinul r, se repet de r ori. Uzual, valorile proprii se indexeaz n ordinea
descresctoare a modulului, adic | | | | | |
2 1 n
> > > . Valoarea proprie
1
se
zice dominant. Mulimea valorilor proprii } , 1 , { n i
i
= se zice spectrul matricii
A.
111
2. Vectorii proprii asociai unei valori proprii:
Dup determinarea valorilor proprii, vectorii proprii asociai cu
i
se gsesc
punnd
i
= n (2'), i rezolvnd sistemul liniar i omogen (2').
- Dac A este real: n general,
i
poate fi complex, i atunci vectorul
propriu
i
x asociat cu
i
este complex. Dac A i
i
sunt reali, atunci
vectorul propriu
i
x este real.
- Dac A este complex: n general, valorile proprii i vectorii proprii sunt
mrimi complexe. n particular, unele dintre acestea pot fi i reale

Subspaiu propriu i dimensiunea acestuia:
Sistemul (2') este omogen, astfel c dac x, y sunt soluii, atunci y x | o + sunt
soluii. Adic, lui
i
i este asociat un subspaiu liniar
i
S de soluii x. Se arat c:
Dimensiunea subspaiului
i
S este mai mic dect sau egal cu ordinul de
multiplicitate a rdcinii
i

Notnd
i
r = ordinul de multiplicitate a rdcinii
i
, i
i
p = dimensiunea
subspaiului
i
S , avem:
i i
r p s . Cu alte cuvinte, exist cel mult
i
r vectori liniar
independeni n
i
S .
Dac
i i
r p < , valoarea
i
se zice defectiv; n acest caz, i matricea A se zice
defectiv.
(
i
r se mai zice multiplicitate algebric, iar
i
p multiplicitate geometric.)
3. Determinarea efectiv a sistemului propriu:
Pentru calculaia practic ( 3 > n ), nu se recomand:
- Rezolvarea direct a ecuaiei caracteristice. Aceasta, datorit faptului c
problema calculului rdcinilor unui polinom este foarte sensibil la mici
perturbaii n coeficieni; aceste perturbaii apar din erorile de rotunjire.
- Calculul direct al vectorilor proprii, din (2').
112
Metode numerice pentru gsirea valorilor proprii
i
, i a vectorilor proprii
asociai
) (i
x , sunt prezentate n continuare.


Matrici hermitiene i unitare
Operaia - aplicat unui vector sau unei matrici noteaz transpus-conjugata.
Dac x este un vector, respectiv A o matrice, atunci:
T
x x =
-
;
T
A A =
-
.
Explicit: ] [
ij
a = A , ] [
- -
=
ij
a A , avem:
ji ij
a a =
-
.
n expresiile anterioare, bara noteaz conjugata: ] [
i
x = x ; ] [
ij
a = A .
Pentru un vector real, sau o matrice real, operaia - revine la transpunere:
T
x x =
-
;
T
A A =
-
.
n particular, pentru un scalar, operaia revine la conjugare: s s =
-
.

Matricea A se zice hermitian, dac A A =
-
.
Exemplu de matrice hermitian:
(
(
(

+
+

=
2 3 10
3 10 5 7 1
7 1 1
i i
i i
i i
A
Remarcai c elementele diagonale sunt reale, iar elementele simetrice sunt conjugate.
O matrice real este hermitian, dac este simetric ( A A =
T
).
O matrice hermitian se zice pozitiv definit, dac 0 > =
-
Ax x 0 x ( Ax x
-
este
real).
n particular, o matrice real este pozitiv definit, dac: 0 0 > = Ax x x
T
.

Matrici unitare:
O matrice se zice unitar, dac I U U =
-
; echivalent,
-
= U U
1
.
O matrice real este unitar dac I U U =
T
, sau
T
U U =
1
.
Valorile proprii ale unei matrici unitare au modulul egal cu 1.
113

Proprieti ale matricilor hermitiene (n particular, reale i simetrice):
P1. Dac A este hermitian, i are valorile proprii } {
i
distincte sau nu, atunci:
(a) Exist o matrice unitar U, astfel c AU U
-
este diagonal (se zice c U
diagonalizeaz pe A), i avem:
) , , (
1 n
diag =
-
AU U .
(b) Exist n vectorii proprii liniar independeni care formeaz o baz
ortonormat n
n
C (acetia sunt coloanele lui U);
(c) Valorile proprii sunt reale

n particular, pentru A real i simetric:
(a-1) Exist U unitar i real, astfel c ) , , (
1 n
T
diag = AU U .
(b-1) Exist n vectorii proprii liniar independeni; acetia formeaz o baz
ortonormat n
n
R (coloanele lui U);
(c-1) Valorile proprii sunt reale, i vectorii proprii sunt reali
Avem i proprietatea:
P1'. Dac A este hermitian (real i simetric) i pozitiv definit, atunci valorile
proprii ale lui A sunt reale i pozitive

Produs scalar i proprieti de ortogonalitate:
1. Spaiu vectorial real
n
V
Fie x un vector din
n
V , i x matricea coloan a coordonatelor sale ntr-o baz a lui
n
V (
n
R xe ).
Dac matricea A real, este simetric i pozitiv definit, se definete produsul
scalar n raport cu matricea A, prin:
Ax y Ay x
T T
A
y x = = > < ,
n particular, pentru I A = , acesta devine produsul scalar standard:
114
x y y x
T T
y x = = > < ,
Avem:
A A
y x x y > =< > < , , ; > =< > < y x x y , , .
Vectorii x i y se zic ortogonali (relativ la produsul scalar), dac 0 , = > <
A
y x ,
sau 0 , = > < y x
Astfel:
- Vectorii x i y sunt ortogonali relativ la matricea A , dac
0 = Ay x
T
, sau 0 = Ax y
T
.
- Vectorii sunt ortogonali, dac 0 = y x
T
, sau 0 = x y
T
.

2. Spaiu vectorial complex
n
V
Fie x un vector din
n
V , i x matricea coloan a coordonatelor ntr-o baz a lui
n
V
(
n
C xe ).
Dac A este o matrice hermitian i pozitiv definit, se definete produsul scalar
n raport cu matricea A, prin:
x A y y A x
T T
A
y x
-
= = > < , .
(Ultima egalitate rezult din aceea c scalarul
A
y x s > =< , este egal cu transpusul
su).
Produsul scalar definit de I A = este:
x y y x
-
= = > <
T
y x,
Avem:
A A
y x x y > < = > < , , , i > < = > < y x x y , , .
Ortogonalitatea a doi vectori se definete ca nainte, prin condiia 0 , = > <
A
y x ,
sau 0 , = > < y x
Observaie: Dac avem 0 , = > <
A
y x , avem i 0 , = > <
A
x y
Astfel:
- Vectorii x, y sunt ortogonali n raport cu A, dac:
0 = y A x
T
, sau 0 =
-
x A y
T
.
115
- Vectorii x, y sunt ortogonali,dac:
0 = y x
T
, sau 0 =
-
x y .
P2. Dac A este hermitian, atunci:
- Vectorii proprii asociai la dou valori proprii distincte sunt ortogonali:
dac
2 1
= , atunci 0
1 2
=
-
x x i 0
2 1
=
-
x x .
- Avem i: 0
1 2
=
-
Ax x , 0
2 1
=
-
Ax x .
(Dac A hermitian este i pozitiv definit, vectorii
2 1
, x x sunt ortogonali
relativ la matricea
T
A .)

Dac A este real i simetric:
- Vectorii proprii asociai la dou valori proprii distincte sunt ortogonali:
0
1 2
= x x
T
, 0
2 1
= x x
T
.
- Avem i: 0
1 2
= Ax x
T
, 0
2 1
= Ax x
T
.
(Dac A real i simetric, este i pozitiv definit, vectorii
2 1
, x x sunt
ortogonali relativ la matricea A)

Ctul Rayleigh
Fie A o matrice n n complex (sau real). Fie
n
C v e un vector arbitrar, i definim
v v
Av v
v
-
-
= ) (
) (v se numete ctul Rayleigh.
Proprietate-1: Dac x este vector propriu asociat cu , atunci = ) (x
Astfel, ctul Rayleigh poate fi utilizat pentru a gsi o aproximare a valorii proprii ,
dac se cunoate o aproximare v a vectorului propriu x: ) (v x v ~ ~ .
Proprietate-2: Dac matricea este hermitian, ctul Rayleigh este mrginit de valorile
proprii extreme
116
Valorile proprii sunt reale; fie acestea
n
> > >
2 1
, atunci, avem:
1
) ( s s v
n
, pentru orice
n
C v e .


Power
Metoda puterii matrice real, cu valori proprii reale.

Metoda:
Metoda puterii determin valoarea proprie dominant i vectorul propriu asociat, ale
unei matrici A, reale sau complexe. Aplicat la inversa
1
A metoda determin
valoarea proprie cea mai mic (n modul), i vectorul propriu asociat cu aceasta. Se
presupune c:
1. Exist un set de n vectori proprii liniar independeni.
2. Exist o singur valoare proprie dominant
1
: | | | | | |
2 1 n
> > >
Metoda este urmtoarea:
Fie
) 0 (
w un vector iniial, ales arbitrar cu singura condiie ca s aib o component
n direcia lui
) 1 (
x . Pentru a mplini aceast cerin, unele coduri genereaz un vector
aleator. (n fapt,
) 0 (
w este o aproximaie a vectorului propriu
) 1 (
x ; dac o astfel de
aproximaie este cunoscut, atunci aceasta accelereaz iteraia de mai jos).
Desvoltm
) 0 (
w n baza vectorilor proprii:
) ( (2)
2
) 1 (
1
) 0 (

n
n
a a a x x x w + + + = (a)
Presupunem c 0
1
= a , i formm irul de vectori
) 0 ( 1 ) ( ) 1 (
w A Aw w
+ +
= =
k k k
, k 0
Avem:
(

|
|
.
|

\
|
+ +
|
|
.
|

\
|
+ =
+ + + = =
) (
1
(2)
2
1
2 ) 1 (
1 1
) ( (2)
2 2
) 1 (
1 1
) 0 ( ) 1 (


n
n
n
n
n n
a a a
a a a
x x x
x x x Aw w


117
n general,
(
(

|
|
.
|

\
|
+ +
|
|
.
|

\
|
+ = =
) (
1
(2)
2
1
2 ) 1 (
1 1
) 0 ( ) (
) (
n
n
k
n
k
k k k
a a a x x x w A w

(b)
Cum | | | |
1 i
> pentru 2 > i , urmeaz c rapoartele
k
i
) / (
1
tind la 0 pentru
k . Astfel, pentru k cresctor, vectorii
) (k
w se aliniaz din ce n ce mai mult la
direcia vectorului propriu
) 1 (
x . n consecin, pentru un k suficient de mare, avem
) 1 (
1 1
) (
) ( x w a
k k
~ . S considerm de asemenea relaia
) 1 (
1
1
1
) 1 (
) ( x w a
k k + +
~ . Lund
orice coordonat non-zero a lui
) ( ) 1 (
,
k k
w w
+
, s zicem cea de-a m-a coordonat,
obinem
) (
) 1 (
1 k
m
k
m
w
w
+
~
Dezavantajul formulei precedente este c, coordonatele nenule ale lui
) (k
w devin fie
foarte mici ( 1 | |
1
< ), fie foarte mari ( 1 | |
1
> ), odat cu creterea lui k. Aceasta se
evit prin normalizarea (sau scalarea) lui
) (k
w , la fiecare pas k. Normele utilizate sunt
norma- i norma-2.
Astfel, algoritmul metodei este:
) 0 (
w = Vector iniial
|| ||
) (
) (
) (
k
k
k
w
w
z = , pentru 0 > k Normalizare
) ( ) 1 ( k k
Az w =
+
, pentru 0 > k Iteraie

Teste de oprire a iteraiei:
1. Test de coliniaritate a doi vectori succesivi:
Vectorii
) (k
z i
) 1 ( + k
z sunt coliniari, dac rapoartele 0 , /
) ( ) ( ) 1 (
= =
+ k
i
k
i
k
i i
z z z
sunt egale (coordonatele nenule sunt proporionale), sau 0
) ( ) 1 (
= =
+ k
i
k
i
z z . n
calculaia practic, punem condiia TOL i i s | ) ( ) ( |
0
, dac TOL z
k
i
> | |
) (
; sau,
s avem simultan, TOL z
k
i
s | |
) (
i TOL z
k
i
s
+
| |
) 1 (
. TOL este o toleran
118
specificat;
0
i este indicele unei coordonate fixate: este convenabil s lum
= = imax i
0
indicele coordonatei de modul maxim din
) 1 ( + k
z .
Se introduc atunci, factorii de coliniaritate prin vectorul ) : 1 ( n colin , definit astfel:
n i
i z i z
TOL i z TOL i z imax z imax z
i colin
k k
k k k k
, 1
altfel )) ( / ) (
| ) ( | si | ) ( | daca )) ( / ) (
) (
) ( ) 1 (
) ( ) 1 ( ) ( ) 1 (
=

s s
=
+
+ +


Testul este:
TOL imax s || ) ( || colin colin
Observaie
Test pentru norma-2 (euclidian):
Dac, pentru normalizarea lui
) (k
w , se utilizeaz norma-2, vectorii
) (k
z au
norma-2 egal cu 1, i testul de coliniaritate poate lua forma
TOL
k k
s
+
2
) ( ) 1 (
|| || z z .
O problem special apare pentru A real, dac valoarea proprie dominant
este real i negativ, 0
1
< , i anume: din
] [ ) (
) ( ) 1 (
1 1
) 0 ( ) ( ) ( k k k k
a r x z A w + = = i || || /
) ( ) ( ) ( k k k
w w z = , rezult c
vectorul
) (k
z schimb de semn de la pasul k la pasul 1 + k . (Valoarea proprie,
dat de
) ( ) 1 ( ) 1 (
1
/
k
m
k
m
k
z w
+ +
= , nu este afectat.). Testul de coliniaritate trebuie s
in cont de aceasta. Astfel, definim,
) ., 1 (
) 1 (
1
+
=
k
sign is ,
) ( ) 1 ( k k
is z z dz - =
+

Testul corect este
TOL s
2
|| || dz .

2. Test asupra lui :
Iteraia se oprete prin condiia
TOL
k k
s
+
| |
) (
1
) 1 (
1

119
unde TOL este o toleran.
3. Test de satisfacere a relaiei de definiie:
TOL s || || z Az
Practic,
) (k
z z = ,
) 1 ( ) ( +
=
k k
w Az , i
) 1 ( +
=
k
. Definind
) ( ) 1 ( ) 1 ( k k k
z w dif
+ +
= ,
se pune testul
TOL s || || dif
Observaii:
- n cod, dac valorile anterioare (k) sunt stocate n z0 i lambda0, iar
valorile curente (k+1) n z i lambda, definiia lui dif devine
dif = z lambda-z0,
lund z nainte de normalizare.
- Vectorul z Az r = se zice vectorul rezidual. Astfel, testul se mai scrie
TOL s || || r .
Not
Testul propriu pentru metod este Testul 1, ntruct, n esen, metoda determin
vectorul propriu nr. 1, i apoi determin
1
din acesta. Cu Testul 1, se obin
vectori proprii mai precii dect cu Testul 2 (la aceeai toleran) .
Testul 3 nu este specific metodei puterii, ci poate fi aplicat oricrei metode
iterative pentru valori i vectori proprii. Codurile din Lapack (Bai et al.(2000)),
utilizeaz Testul 3, cu | | c
M
TOL = , unde
M
c este -main.
n metodele urmtoare, Testul 3 va fi utilizat numai la verificarea sistemului
propriu. Excepie face metoda puterii, unde, pentru studiu, se poate alege unul din
Testele 1-3. (Alegerea testului se face printr-un cod.)

Convergena:
Convergena
1
) (
1

k
este liniar, iar rata convergenei este aproximativ | / |
1 2
.
120
(Acest rezultat are loc n ipoteza metodei | | | |
2 1
> , cu ipoteza suplimentar: pentru
1
k k > , cantitile
k
i
) / (
2
, 3 > i , sunt neglijabile n raport cu
k
) / (
1 2
.)

Fiiere:
Power-2.f90: subrutina metodei
Main-Power.f90: programul principal
Agen.f90: subrutina de generare a matricii A(n,n).
Maxindex.f90: funcie; indicele coordonatei de modul maxim din vectorul v(n).
vNorm.f90: norma- i norma-2 a unui vector.
w0gen.f90: subrutina de generare a lui w0
work.f90: modul
width.f90: utilitar

Subrutina metodei este
Power(iter, kodTest, ikod, kodNorm, iter_flag, test_val)
Parametrii:
iter: Numrul maxim de iteraii (intrare) / Numrul efectiv de iteraii (ieire)
kodTest: cod pentru testul de oprire a iteraiei
ikod: cod de tiprire a iteraiilor
kodNorm: codul normei
iter_flag: cod de ncheiere a iteraiei (intern).
test_val: valoarea de test.
Not:
TOL, lnit i lambda se transmit prin modulul work

Agen.f90: se scrie cod pentru generarea matricii A(n,n).
w0gen.f90: se scrie cod pentru generarea vectorului de start w0.
121
Pentru a mplini cerina ca
) 0 (
w s aib o component n direcia lui
) 1 (
x , unele coduri genereaz
) 0 (
w ca vector aleator.

Datele de intrare se citesc dintr-un fiier de date (specificat). Datele de ieire se scriu
n continuarea datelor de intrare.
Datele de intrare sunt:
- Titlu: text de max. 80 caractere
- n, kodA, kodw0
- [Matricea A: dac kodA = 0. Se scrie aa cum e dat - pe linii.]
- [Vectorul w0: dac kodw0 = 0. ]
- TOL, lnit: tolerana, numrul limit d iteraii.
- kodTest, ikod: cod test, cod tiprire iteraii
- kodNorm: cod norm
- Check_text: cod de verificare.

Semnificaia codurilor:
n: ordinul matricii
kodA: 0 / = 0: citete A / genereaz A (cu subrutina Agen)
kodw0: 0 / = 0: citete w0 / genereaz w0 (cu subrutina w0gen)
kodTest: 0: Test asupra lui (Testul 2);
1: Test de coliniaritate (Testul 1);
> 2: Test asupra lui || || z Az (Testul 3).
ikod: 0 / =0: Tiprete iteraiile: Da / Nu.
kodNorm: s 1: Norma-infinit; > 2: Norma-2 (euclidian)
Check_text: text de max. 10 caractere. Primul caracter este semnificativ, anume:
C, c, P, p: se face proba, adic se tiprete vectorul z Az .

Exemplu:
Exemplu n = 3
122
3 0 0
1 2 3
2 3 4
3 4 5
3*1
1E-7 7
1 1
2
check

Guess vector:
1.000000 1.000000 1.000000

Iteration Current_vector
Current_lambda
1 0.3713907 0.5570860 0.7427813 12.00000
2 0.3859738 0.5596620 0.7333503 9.500000
3 0.3850325 0.5595003 0.7339682 9.631579
4 0.3850935 0.5595108 0.7339282 9.622951
5 0.3850895 0.5595102 0.7339308 9.623509
6 0.3850898 0.5595102 0.7339306 9.623473
7 0.3850898 0.5595102 0.7339306 9.623475

Iteration No. 7: Tolerance on "z" met.
Last test_value is: 0.000000

Lambda-1 (dominant eigenvalue): 9.623475

Eigenvector #1:
(1) 0.3850898
(2) 0.5595102
(3) 0.7339306

Check: A*y -lambda*y
-1.4137129E-08
1.4959278E-07
3.1332269E-07
123

Maximum difference (in modulus) = 3.133E-07
Coordinate # 3


Power_Complex
Metoda puterii pentru o matrice complex.
Metoda:
Este cea descris la Power.
Convergena:
Ipotezele sunt aceleai ca la Power. n particular, nu se obine convergen, pentru o
matrice real la care | | | |
2 1
= de exemplu, cnd
2 1
, sunt complex conjugate.

Fiiere:
Agen_complex.f90; Main-Power_complex.f90; Maxindex_z.f90;
Power_Complex&Eps.f90; vNorm.f90; width.f90; work_complex.f90;

Semnificaia fiierelor i rutinelor aceleai ca la Power.
Subrutina metodei:
Power_Complex(iter, kodTest, ikod, kodNorm, iter_flag, test_val, test_val_min)

Semnificaia parametrilor ca la Power. Parametrul test_val_min returneaz valoarea
minim de test, n cazul cnd nu este atins tolerana TOL.

Datele de intrare sunt datele la Power, cu deosebirile:
- A i w0: sunt date complexe; pentru A i w0 reale, se introduc date reale.
- ikod: Pentru ikod = 2: se tipresc i valorile | | / 1 = eps , i 0 1 z eps - ,
unde z0 este z_anterior. (Aceste valori servesc la studiul convergenei:
avem
) 1 ( ) (
1

~
k k
eps z z ).

Exemplu:
Exemplu n = 3. Val. proprii: 15.38; -10.63; -0.75
3 0 0
124
(1,0) (1,-7) (0,-1)
(1,7) (5,0) (10,-3)
(0,1) (10,3) (-2,0)
(1,0) (1,0) (1,0)
1.E-7 50
1 0
1
ch

Iteration No. 44: Tolerance on "z" met.
Current Test_value is: 1.4587842E-08

Lambda-1 (dominant eigenvalue): 15.37663 -0.1718582E-06

Eigenvector #1:
(1) 0.1880912 -0.5012191
(2) 0.9789736 0.2039873
(3) 0.5570123 0.2972317

Check: A*z -lambda*z
(3.3876418E-08,-4.6645388E-07)
(-6.6803612E-09,1.2591090E-07)
(-8.2114104E-07,-1.4940717E-08)

Maximum difference (in modulus) =-8.211E-07 -1.494E-08
Coordinate # 3


Inverse_Power_Shift
Metoda puterii inverse cu translaie (shift) matrice real, cu valori proprii reale.

Metoda:
Fie matricea A, cu valorile proprii n j
j
, 1 , = . Metoda gsete valoarea proprie
i
a
lui A, cea mai apropiat de un numr dat s. Se consider matricea
I A B s =
125
i presupunem c B este nesingular. Se verific imediat c valorile proprii ale lui B
sunt s
j j
= . Cantitatea s zice deplasare (shift).
Fie s
i i
= , valoarea proprie de modul minim a lui B, adic:
| | | | 0
j i
c < < < , pentru j i.
Atunci, metoda puterii aplicat lui
1
B produce valoarea proprie de modul maxim,
adic
i i
v / 1 = . Avem
i i
v / 1 = , i
s
i
i
+ =
v

1
.
Principala aplicaie a metodei este de a gsi vectorul propriu, dac este cunoscut o
aproximaie bun a valorii proprii, s zicem
i

. (Aceasta poate fi furnizat de o


metod n care se determin numai valorile proprii nu i vectorii proprii.)
Se aplic metoda puterii inverse, cu deplasarea
i
s

= . Chiar dac
i

este apropiat
de
i
, matricea I A B
i

= este nc nesingular, i se obine o bun aproximaie a


vectorului propriu
) (i
x .
Metoda iteraiei inverse cu deplasare, este una dintre cele mai precise metode pentru
calculul vectorilor proprii.
Algoritmul practic, este urmtorul:
Iteraia din metoda puterii, aplicat la matricea
1
B , este
) ( 1 ) 1 ( k k
z B w
+
= . n loc de a
inversa B, calculm
) 1 ( + k
w din sistemul liniar
) ( ) 1 ( k k
z Bw =
+
, prin descompunere LU.
Factorizarea se face o singur dat, i sistemul se rezolv succesiv cu membrii drepi
) (k
z , k 0.
Not: Pentru testare, Inverse_Power_Shift ofer i varianta iterrii directe cu
1
B

Fiiere:
LU_Shift.f90: subrutina metodei algoritmul precedent.
lnverse_Shift.f90: subrutina metodei iterare direct cu matricea
1
B .
Main-InversePower_Shift.f90: programul principal

126
apvt-LU.f90; compute_a_ii.f90;; LUdecomp.f90; LUsolve.f90; swap_row.f90:
semnificaiile de la descompunerea LU.

Agen.f90; Maxindex.f90; w0gen.f90; width.f90; work.f90: aceleai semnificaii ca la
metoda puterii.
vNorm2.f90: norma euclidian a unui vector v(n).

Subrutinele metodei:
LU_Shift(iter, kodTest, kodPrint)
Inverse_Shift(iter, kodTest, kodPrint)
Parametrul iter: Numrul limit de iteraii (intrare) / Numrul efectiv de iteraii
(ieire). Pentru ceilali parametri, v. codurile de mai jos.

Datele de intrare se citesc dintr-un fiier de date (specificat). n acesta se scriu i
datele de ieire.
Datele de intrare sunt:
- Titlu: text de max. 80 caractere
- n, kodA, kodw0
- [Matricea A: dac kodA = 0. Se scrie aa cum e dat - pe linii.]
- [Vectorul w0: dac kodw0 = 0 ]
- ns: Numr de aproximaii s, ale valorilor proprii
- Aproximaiile s: ns valori.
- kod_met: codul metodei
- TOL, lnit: tolerana, numrul limit de iteraii.
- kodTest, kodPrint: cod test, cod tiprire iteraii i vectori reziduali.
- Check_text: cod de verificare.

Semnificaia codurilor:
n: ordinul matricii
kodA: 0 / =0: citete A / genereaz A (cu subrutina Agen)
127
kodw0: 0 / =0: citete w0 / genereaz w0 (cu subrutina w0gen)
kod_met: 0 / =0: iterare cu
1
B / descompunere LU.
kodTest: 0 / =0: Test asupra lui / Test de coliniaritate.
kodPrint: 0 / 1 / 2: Tiprete: Nimic / Vectorii reziduali z Az / Iteraiile i
vectorii reziduali. Vectorii reziduali se tipresc numai dac este cerut
proba v. codul Check_text.
Check_text: text de max. 10 caractere. Primul caracter este semnificativ, anume:
C, c, P, p: Se face proba, adic se verific 0 z Az ~ . Se scriu:
- coordonata de modul maxim din z Az (maximul pe toi vectorii
z);
- indicele vectorului, i indicele coordonatei.
Exemplu:
Se consider exemplul de la Power. Acesta este un caz special: matricea este
singular, i deci exist o valoare proprie egal cu 0. Lum ca aproximaii s valorile 9,
-1, i 0.01. Fiierul de intrare / ieire este:
Exemplu n = 3
3 0 0
1 2 3
2 3 4
3 4 5

3*1.
1E-7 50
3
9 -1 0.1
1
1 0
ch

Shift #1: test_val: 0.0000000E+00
Iteration No. 7

Eigenvalue: 9.623475

128
Eigenvector:
(1) 0.3850898
(2) 0.5595102
(3) 0.7339306


Shift #2: test_val: 0.0000000E+00
Iteration No. 8

Eigenvalue: -0.6234753

Eigenvector:
(1) 0.8276709
(2) 0.1424137
(3) -0.5428436


Shift #3: test_val: 0.0000000E+00
Iteration No. 18

Eigenvalue: 0.5871054E-07

Eigenvector:
(1) -0.4082482
(2) 0.8164966
(3) -0.4082483


Check: A*z -lambda*z
Maximum difference (in modulus) = 2.429E-07
Eigenvector # 1; Coordinate # 1.

Inverse_Power_Complex
Metoda puterii inverse cu translaie (shift), pentru o matrice complex.
n particular, o matrice real care are (i) valori complexe.
Metoda: cea de la Inverse_Power_Shift.
129

Fiiere:
LU_Shift_Complex.f90: subrutina metodei algoritmul cu descompunerea LU.
lnverse_Shift_Complex.f90: subrutina metodei iterare direct cu matricea
1
B .
Main-lnversePower_Complex.f90.f90: programul principal

Hermitian.f90: funcie logic; adevrat matrice hermitian; fals n caz contrar.

apvt-LU_z.f90; compute_a_ii_z.f90; LUdecomp_z.f90; LUsolve_z.f90;;
swap_row_z.f90: semnificaiile de la descompunerea LU_Complex.

Agen.f90; Maxindex_z.f90; w0gen.f90; width.f90; work.f90: aceleai semnificaii ca la
metoda puterii.
vNorm2.f90: norma euclidian a unui vector real, i a unui vector complex, v(n).

Subrutinele metodei:
LU_Shift_Complex(iter, kodTest, kodPrint, kodLU, test_val)
Inverse_Shift_Complex(iter, kodTest, kodPrint, kodLU, test_val)
Semnificaiile parametrilor:
iter, kodTest, kodPrint: aceleai semnificaii ca la Inverse_Power_Shift.
kodLU: cod descompunere LU; 0: o.k.; < 0: pivot < prag.
test_val: valoarea de test (comparat cu tolerana); aceasta depinde de kodTest.

Fiierul de date:
Are aceeai structur ca fiierul de date de la Inverse_Power_Shift, cu particularitatea
c: matricea A, vectorul w0, i aproximaiile s sunt acum, valori complexe. Dac A
este real, se pot introduce valori reale; pentru vectorul w0 trebuie ns introduse
valori complexe.
Not: Aproximaiile s trebuie s fie suficient de apropiate de valorile proprii.

Exemplu:
Exemplul de la Power_Complex. Matricea este hermitian i are valori proprii reale.
n rezultate, partea complex a valorilor proprii este de ordinul
8 7
10 10

.
130
Fiierul de intrare / ieire este:
Exemplu-2
3 0 0
(1,0) (1,-7) (0,-1)
(1,7) (5,0) (10,-3)
(0,1) (10,3) (-2,0)
3*(1,0)
3
(15.,0.) (-10.,0.) (-0.7,0.)
1e-7 10
1
1 0
ch

Matrice hermitiana.

Shift #1:
Iteration No. 6

Eigenvalue: 15.37663 -0.2939753E-07

Eigenvector:
(1) 0.1448912 -0.3861009
(2) 0.7541264 0.1571365
(3) 0.4290796 0.2289648

Shift #2:
Iteration No. 9

Eigenvalue: -10.63025 0.5430218E-07

Eigenvector:
(1) -0.2537639 0.1906199
(2) 0.4263011 0.4526095
(3) -0.3145403 -0.6432296

Shift #3:
131
Iteration No. 6

Eigenvalue: -0.7463716 0.9294398E-08

Eigenvector:
(1) 0.6996646 0.4895611
(2) 0.5348870E-01 -0.1309672
(3) 0.3495674 -0.3585925

Check: A*z -lambda*z
Maximum difference (in modulus) =-2.951E-07 -7.384E-07
Eigenvector # 2; Coordinate # 2.


Sim_Iter
Metoda iteraiilor simultane matrice hermitian.

Metoda:
Aceasta este o extindere a metodei puterii pentru o matrice A hermitian (n
particular, real i simetric). O astfel de matrice, are valori proprii reale.
Presupunem, mai mult, c valorile proprii sunt de module distincte:
| | | | | |
2 1 n
> > > .
n loc de un vector de start
) 0 (
w , se utilizeaz o matrice de start , ale crei coloane
sunt vectorii de start: ] [
) , 0 ( ) 2 , 0 ( ) 1 , 0 ( ) 0 ( m
w w w W = .
Dac matricea A este n n ,
) 0 (
W este m n , unde n m s . Vectorii de start
) , 0 ( j
w
trebuie s fie liniar independeni. Metoda de baz rmne nmulirea la stnga a lui
) 0 (
W cu matricea A, adic, 0 ,
) ( ) 1 (
> =
+
k
k k
AW W . nainte de fiecare etap a iteraiei,
matricea curent W este ortogonalizat prin procedeul Gram-Schmidt, astfel nct
coloanele ei
) ( j
w devin vectori ortonormai (ortogonali, i avnd norma euclidian
unitar). Astfel, vectorii
) ( j
w formeaz o baz ortonormat a sub-spaiului m-
dimensional al lui
n
R , sub-ntins de vectorii iniiali
) , 0 ( j
w . n cursul iteraiei, aceast
baz se aliniaz din ce n ce mai mult la baza vectorilor proprii ai lui A, direcia

) ( j
w direcia
) ( j
x , 1 > j . Valorile proprii se evalueaz prin ctul Rayleigh. Iteraia
132
se ncheie cnd se atinge o toleran convenabil, privitor la direciile a dou baze
succesive } {
) ( j
w . Dac matricea de start
) 0 (
W are m < n coloane, se obin primii m
vectori proprii. Pentru m = n, adic
) 0 (
W este nn, se gsesc toi vectorii proprii.

Algoritmul:
Se cere un numr ne n de vectori proprii.
) 0 (
W i W sunt matrici nne.
1. Se definete matricea
) 0 (
W : dac o aproximare iniial a vectorilor proprii nu
este cunoscut, se ia ] [
) ( ) 2 ( ) 1 ( ) 0 ( ne
e e e W = , adic,
) 0 (
W este format
din primele ne coloane ale matricii unitate I. Pentru ne = n, I W =
) 0 (
.
2. Se aplic Gram-Schmidt la
) 0 (
W (cu excepia cazului n care aceasta este deja
ortonormat). Se atribuie
) 0 (
W W = .
3. Iniializare contor: iter = 0
4. Iteraii: iter = iter +1;
Atribuire: W W =
) 0 (
(W = matricea curent;
) 0 (
W = matricea anterioar.)
5. Se calculeaz
) 0 (
AW W = .
6. Se calculeaz ne j
j
, 1 , = , prin ctul Rayleigh:
Fie
) ( j
w i
) , 0 ( j
w a j-a coloan a lui W i
) 0 (
W , respectiv; avem
> =<
) ( ) , 0 (
,
j j
j
w w
(
) , 0 ( ) ( j j
Aw w = Pasul 5; i 1 ,
) , 0 ( ) , 0 (
= > <
j j
w w Paii 2 i 4.)
7. Se aplic Gram-Schmidt la W , astfel c W devine ortonormat.
8. Se verific atingerea toleranei TOL:
Prin testul de coliniaritate 1.3, 1: se definete colin(n) pentru fiecare vector
) (:, je W z = , i || ) ( || max _
, 1
imax val test
ne je
colin colin =
=
.
(ntruct z sunt normalizai, testul se poate pune i sub forma din 1,
Observaie.)
- Dac TOL val test s || _ || , ieire din iteraie.
133
- Altfel, GOTO 4.
Observaii
- Se poate prescrie un numr limit de iteraii lnit: atunci, se adaug la Pasul
8 un test iter lnit.
- Pasul 6 se poate realiza numai o singur dat, dup ce s-a ieit din iteraie.

Observaii
1. Valori proprii de acelai modul
ntruct metoda iteraiilor simultane este n esen metoda puterii, nu se obine
convergen pentru vectorii proprii, dac exist valori proprii de modul egal.
2. Matrici non-hermitiene
Dac aplicm algoritmul de mai sus unei matrici non-hermitiene, nu vom obine
convergen pentru vectorii proprii, cu excepia vectorului propriu corespunznd
valorii dominante
1
(pentru care, metoda revine la metoda puterii). Aceasta se
ntmpl deoarece ipoteza esenial a metodei este c vectorii proprii formeaz o
baz ortogonal i procedeul Gram-Schmidt foreaz ca, la fiecare pas k, vectorii
) , ( j k
w s fie ortogonali.
Totui, dac valorile proprii sunt de module distincte, atunci vectorii proprii sunt
liniar independeni, i se obin aproximaii foarte bune pentru valorile proprii.
Vezi Exemplu-2. Explicaia este c, procedeul Gram-Schmidt furnizeaz un set
de vectori } {
) ( j
w liniar independeni (ortonormai), iar valorile proprii sunt
calculate cu ctul Rayleigh care d aproximaii bune ale valorilor proprii chiar
cu aproximaii grosiere pentru vectorii proprii.
Valorile proprii gsite pot fi utilizate ulterior, n metoda puterii inverse cu
translaie, pentru a obine vectorii proprii pentru valorile 2 , > i
i
.

Fiiere:
Sim_lter.f90: subrutina metodei
Main-Sim_lter.f90: programul principal
Gram_Schmidt_Complex.f90: ortogonalizare Gram-Schmidt
134
Herm&Sim.f90: 2 funcii logice pentru a recunoate o matrice hermitian, respectiv
complex i simetric.
Maxindex_z.f90: funcie; indicele coordonatei de modul maxim n vectorul complex
v(n).
Agen.f90: subrutina de generare a matricii A(n,n).
W0gen.f90: subrutina de generare a matricii W0(ne,n). Codul actual genereaz
primele
ne coloane ale matricii unitate.
vNorm.f90: norma unui vector complex v(n)
work.f90: modul
width.f90: utilitar

Subrutina metodei:
Sim_Iter(iter, kodTest, kodPrint, iter_flag, test_val)
Semnificaiile parametrilor sunt aceleai ca la metoda puterii (kodPrint: ca i ikod).

Datele de intrare se citesc dintr-un fiier de date (specificat). n acesta se scriu i
datele de ieire. Datele de intrare sunt:
- Titlu: text de max. 80 caractere
- n, ne, kodA, kodw0
- [Matricea A: dac kodA = 0. Se scrie aa cum e dat - pe linii.]
- [Vectorul w0: dac kodw0 = 0 ]
- TOL, lnit: tolerana, numrul limit de iteraii.
- kodTest, kodPrint: cod test, cod tiprire iteraii i vectori reziduali.
- Check_text: cod de verificare.

Semnificaia codurilor:
n: ordinul matricii A
ne: numrul de coloane ale matricii W0 (numrul de vectori i valori
proprii de calculat)
kodA: 0 / =0: citete A / genereaz A (cu subrutina Agen)
135
kodA < 0: matrice hermitian se introduce triunghiul superior
(programul completeaz triunghiul inferior).
kodA = 0: matrice general se introduce ntreaga matrice.
kodw0: 0 / =0: citete w0 / genereaz w0 (cu subrutina w0gen)
kodTest: 0 / > 1: Test asupra lui / Test de coliniaritate.
kodPrint: 0 / 1 / 2: Tiprete: Nimic / Vectorii reziduali z Az / Iteraiile i
vectorii reziduali. Vectorii reziduali se tipresc numai dac este cerut
proba v. codul Check_text.
Check_text: text de max. 10 caractere. Primul caracter este semnificativ, anume:
C, c, P, p: Se face proba, adic se verific 0 z Az ~ . Se scriu:
- coordonata de modul maxim din z Az (maximul pe toi vectorii
z);
- indicele vectorului, i indicele coordonatei.

Exemplu-1:
Matricea este hermitian (se poate pune kodA < 0, i introduce numai triunghiul
superior). Ca variant, s-a introdus ntreaga matrice lund kodA = 0.
Exemplu-1. Matrice hermitiana.
3 3 0 1
(1,0) (1,-7) (0,-1)
(1,7) (5,0) (10,-3)
(0,1) (10,3) (-2,0)

1e-7 50
1 0
ch

Matrice hermitiana

Iteration No. 46: Tolerance on "W" met.
Test Value is: 3.542E-08

Eigenvalues:
136
1 15.37663 -0.2587173E-07
2 -10.63025 0.2952792E-07
3 -0.7463716 -0.9538131E-08

Eigenvectors:
1 2
0.4123923 -0.6783551E-08 -0.4174030E-01 0.3146264
0.1178387 0.7612572 0.6216292 0.1285194E-01
-0.6361333E-01 0.4821696 -0.6793670 -0.2261424

3
0.1378377 0.8427345
0.1311176 -0.5311906E-01
0.5007854 -0.5747215E-07


Check: A*z -lambda*z
Maximum difference (in modulus) =-7.843E-07 1.134E-08
Eigenvector #1; Coordinate # 1.


Exemplu-2:
Matrice non-hermitian ilustrarea Observaiei 2, de mai sus.
Reproducem numai rezultatele pentru valorile proprii, i verificarea pentru vectorul
propriu nr. 1. Vectorii proprii 2-4 nu sunt determinai corect. Pentru a-i calcula, se va
utiliza metoda iteraiei inverse cu translaie, lund ca aproximaii valorile proprii
calculate 2-4.

Exemplu (Westlake). Val. proprii: (1,5); (2,6); (3,7); (4,8)
4 0 0 1
(5.0,9.0), (5.0,5.0), (-6.0,-6.0), (-7.0,-7.0)
(3.0,3.0), (6.0,10.0), (-5.0,-5.0), (-6.0,-6.0)
(2.0,2.0), (3.0,3.0), (-1.0,3.0), (-5.0,-5.0)
(1.0,1.0), (2.0,2.0), (-3.0,-3.0), (0.0,4.0)

1e-6 200
137
1 1
ch

Matrice generala

Iteration No. 169: Tolerance on "W" met.
Test Value is: 6.482E-07

Eigenvalues:
1 4.000000 8.000000
2 2.999998 6.999999
3 2.000001 6.000000
4 0.9999999 5.000003

Check: A*z -lambda*z

Eigenvectors:
1
(3.9152843E-07,-6.0862516E-07)
(2.4125961E-07,-9.3978620E-08)
(3.2940940E-07,-2.9458778E-07)
(1.3913922E-07,-1.3633637E-07)


J acobi
Metoda Jacobi matrice real simetric.

Metoda:
Metoda Jacobi este o metod convenabil pentru a gsi toate valorile proprii i
vectorii proprii ai unei matrici reale i simetrice, de ordin moderat. Determinarea
vectorilor proprii este opional.
Fie A o matrice real i simetric. Dac N este o matrice nesingular, atunci matricea
AN N A
1
= este similar cu A, i are aceleai valori proprii (bara nu noteaz acum
conjugata). Vectorii proprii x ai lui A, sunt legai de vectorii proprii x ai lui A, prin:
138
x N x = . (Vezi Problema de valori proprii sumar, mai sus).
S presupunem acum, c N este unitar, adic
T
N N =
1
. Matricea A devine
AN N A
T
=
Notai c A este de asemenea simetric.
Diagonalizarea lui A:
S presupunem c N este aleas astfel nct A s devin diagonal:
) (
ii
T
a diag = = AN N A
Pentru matricea A, avem proprietile:
1) Valorile proprii ale lui A sunt elementele diagonale:
ii i
a =
2) Vectorii proprii ai lui A sunt coloanele matricii unitate I:
) ( ) ( i i
e x = (unde
ij
i
j
e o =
) (
).
n consecin, rezult pentru A:
- Valorile proprii ale lui A se gsesc pe diagonala matricii A.
- Vectorii proprii ai lui A sunt coloanele matricii N.

Diagonalizarea Jacobi:
Metoda Jacobi const n transformri unitare (sau, ortogonale) aplicate succesiv lui A,
pn la obinerea unei forme aproape diagonale. Anume, dac
i
N sunt matrici unitare,
matricea A se transform cum urmeaz:
1 1 1
AN N A
T
=
) ( ) (
2 1 1 2 2 1 2 2
N N A N N N A N A
T T T
= =

) ( ) (
2 1 1 1 1 k
T T
k
T
k k k
T
k k
N N N A N N N N A N A

= =
Dac matricea
k
A este aproape diagonal, adic, elementele non-diagonale sunt
aproximativ zero, lum
AN N A A
T
k
= ~
139
unde
k
N N N N
2 1
=
Fiecare transformare
i
N se alege astfel ca s elimine o pereche de elemente non-
diagonale (s zicem
pq
a i
qp
a la pasul i). O astfel de matrice are structura:
) ( ) (
) ( ...
) ( ...
1
cos sin
1
sin cos
1
1
q p
q
p
i
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(

o o
o o
N

Elementele nescrise sunt zero (cu excepia diagonalei principale unde acestea sunt
unu).
Transformrile
i
N se aplic succesiv, fiecare dintre ele eliminnd elementul non-
diagonal
pq
a , de modul maxim. Principala proprietate a unei astfel de transformri
este c produsul
i
T
i
AN N modific numai elementele lui A din liniile i coloanele p i
q.
Unghiul o se alege astfel nct
0 =
pq
a
Noile elemente diagonale, sunt date de formulele:
2 2
) ( 4
qq pp pq
a a a r + = ;
r
a a
qq pp
2 2
1
sin

+ = o ;
o
o
sin
cos
r
a
pq
= ;
) (
) (
2
1
2
1
r a a a
r a a a
qq pp qq
qq pp pp
+ =
+ + =

Pentru detalii, v. Cap. 5-II, 2.
140

Consideraii de programare
Stocajul matricii:
Se lucreaz cu triunghiul superior al lui A, astfel nct, dup diagonalizarea lui A,
elementul (1,1) conine
1
, etc. Triunghiul superior este stocat n vectorul
a(n-(n+1)/2), n ordinea coloanelor, adic:
] [ a
2 1 33 23 13 22 12 11 nn n n
a a a a a a a a a =
Adresa elementului (i, j) este dat de urmtoarea funcie:
i j j j i Loca + = 2 / * ) 1 ( ) , (
n particular, elementul diagonal (i, i) are adresa 2 / * ) 1 ( ) , ( i i i i Loca + = . Dup ce s-a
efectuat o transformare, matricea curent A este stocat n acelai vector a.
Strategia de eliminare:
Aceasta este cutarea complet, adic: se caut n toat matricea A (concret, n
vectorul a), elementul non-diagonal de modul maxim. (Pentru alte strategii, v. Cap. 5-
II, 2.)
Elementele non-diagonale se consider zero, dac sunt mai mici (n modul) dect o
toleran TOL.


Fiiere:
Jacobi.f90: subrutina metodei
Main-Jacobi.f90: programul principal
Agen.f90: subrutina de generare a triunghiului superior al matricii A(n,n); stocat
pe coloane, n vectorul ag(n-(n+1)/2).
Loca.f90: funcie; adresa elementului a(i,j) n vectorul ag.
work.f90: modul
width.f90: utilitar

Subrutina metodei:
Jacobi(kodVP, kodI, iter, amax)
Parametri:
141
kodVP: v. mai jos
kodI: v. mai jos, kodPrintJ.
iter: Numrul limita de iteraii (intrare) / Numrul efectiv de iteraii (ieire).
amax: Elementul non-diagonal de modul maxim, din A.

Fiier de date (intrare/ieire):
- Titlu: text de max. 80 caractere
- n, kodA, kodPrintA
- [Matricea A: dac kodA = 0. Se introduce triunghiul superior, pe linii.]
- TOL, kodPrintJ: tolerana pentru elementele non-diagonale; cod de
tiprire
a iteraiilor.
- kodVP: cod pentru calculul vectorilor proprii
- Check_text: cod de verificare.

Semnificaia codurilor:
n: ordinul matricii A
kodA: 0 / = 0: citete A / genereaz A (cu subrutina Agen).
kodA = 0: Se introduce triunghiul superior al matricii, scris pe linii.
(Programul completeaz triunghiul inferior, pentru o matrice
hermitian.)
kodPrinA: 0 / = 0: Nu / Da Tiprete matricea A (triunghiul superior).
kodPrinA = 0 se utilizeaz pentru a tipri o matrice generat.
kodPrinJ: 0 / = 0: Nu / Da Tiprete transformrile succesive ale matricii A.
Check_text: Text de max. 10 caractere. Primul caracter este semnificativ, anume:
C,c, P,p, F,f: Se face proba, adic se verific 0 z Az ~ . Se
scriu:
- coordonata de modul maxim din z Az (maximul pe toi vectorii
z);
- indicele vectorului, i indicele coordonatei.
142
Pentru F sau f: se scrie i fiecare vector rezidual z Az .
Not:
Proba se face numai dac se cere calculul vectorilor proprii (kodVP =
0).

Exemplu:
Ex. Jennings - p. 260
4 0 0
1 -3 -2 1
10 -3 6
3 -2
1
1e-7 0
1
ch

Iteration #18:
Maximum off-diagonal: 0.000000

Eigenvalues
1) 14.32951
2) 4.456960
3) -0.3713751
4) -3.415091

Eigenvectors' Matrix
0.1219755 0.5795794 -0.4442457 0.5563881
-0.8748031 -0.2025671 0.2595736E-02 0.4706312
0.2856186 -0.6127338 -0.5624290 0.1803400
-0.4274252 0.1705392 -0.5079207 -0.6839256


Check: A*y -lambda*y

Maximum difference (in modulus) =-7.133E-04
Eigenvector #1; Coordinate # 4.
143

Observaie
Utiliznd InversePower_Shift cu aproximaiile iniiale 14.3, 4.46, -0.371, -3.42
(valorile Jacobi cu 3 cifre semnificative corecte), ) 1 , 1 , 1 , 1 (
) 0 (
= w , i tolerana
1E-7, se gsesc rezultatele:
- Aceleai valori proprii nr. 1 i 3; valorile nr. 2 i 4 difer cu o unitate, n a
7-a cifr semnificativ.
- Verificarea este: Maximum difference (in modulus) = 5.895E-
07
Se poate conchide c metoda Jacobi d rezultate foarte bune pentru valorile
proprii, i rezultate mai puin precise pentru vectorii proprii.


QR
Algoritmul QR matrice real.
Metoda (sumar)
QR este unul din cei mai utilizai algoritmi pentru a determina toate valorile proprii
ale unei matrici.. n numele metodei, Q desemneaz o matrice ortogonal, iar R o
matrice superior-triunghiular (R vine de la right-triangular).
Considerm o matrice real nesingular A, simetric sau nu.
Esena algoritmului QR rezid n urmtoarea proprietate:
Dac A este factorizat n produsul QR A = unde Q este nesingular, atunci
considernd produsul n ordine invers, fie RQ A = ' , aceast matrice are
aceleai valori proprii ca i A, fiind similar cu A
ntr-adevr, avem A Q R
1
= , i AQ Q A
1
= ' .
Algoritmul QR realizeaz factorizri succesive ale irului de matrici {
k
A }, unde
A A =
1
, definite de:
1 1 1
R Q A = ;
1 1 2
Q R A = ;
144
2 2 2
R Q A = ;
2 2 3
Q R A = ;

k k k
R Q A = ;
k k k
Q R A =
+1
;

Matricile
k
A , i
k k
R Q , , au urmtoarele proprieti:
1) Toate
k
A au aceleai valori proprii ca i A.
2) Dac A este simetric, sau tridiagonal, sau A are forma Hessenberg
superioar, matricile
k
A vor pstra aceste forme.
3) Fie
k k
Q Q Q Q
2 1
= , atunci (prin inducie):
k k k
Q A Q A
1
1
1

+
= .
4) Fie
1
R R R
k k
= , atunci:
k
k k
) (
1
A R Q =
Algoritm:
Algoritmul parcurge urmtoarele etape:
I. Reducerea lui A la forma tridiagonal dac A este simetric, sau la forma
Hessenberg dac A este nesimetric.
II. Reducerea lui A la forma triunghiular, sau bloc- triunghiular (v. mai
jos).
III. Descompunerea QR.
Algoritmul QR propriu-zis, const n Etapele II i III.
a) Etapa I se realizeaz nainte de algoritmul QR pentru a aduce matricea A la o
forma mai simpl, i a reduce astfel efortul de calcul.
b) Etapa II se realizeaz prin premultiplicare cu matricea Householder
k
P , cum
urmeaz:
A P A
1 1
=
A P P A P A
1 2 1 2 2
= =

A P P P A
1 2 1 1


=
n n

145
Matricea
1 n
A are forma triunghiular i este matricea R.
ntr-adevr: S notm
1 2 1 =
=
n
P P P Q , avem A Q A
T
n
=
1
. Q este o matrice
ortogonal, deci avem A QA =
1 n
. Cum Q este ortogonal i
1 n
A este
superior triunghiular, urmeaz c
1
=
n
A R .

Atunci, Etapele II i III se realizeaz prin urmtorii pai de iterare:
1) Pune A A =
) 1 (

- Triangularizeaz
) 1 (
A :
A P A
) 1 (
1
) 1 (
1
= ;
) 1 (
1
) 1 (
2
) 1 (
2
A P A = ; ;
) 1 (
2
) 1 (
1
) 1 (
1
=
n n n
A P A
- La sfritul pasului, avem:
) 1 (
1
) 1 (

=
n
A R ;
) 1 (
1
) 1 (
2
) 1 (
1
) 1 (

=
n
P P P Q .
2) Calculeaz
) 1 ( ) 1 ( ) 2 (
Q R A =
- Triangularizeaz
) 2 (
A :
) 2 ( ) 2 (
1
) 2 (
1
A P A = ;
) 2 (
1
) 2 (
2
) 2 (
2
A P A = ; ;
) 2 (
2
) 2 (
1
) 2 (
1
=
n n n
A P A
- Pune:
) 2 (
1
) 2 (

=
n
A R ;
) 2 (
1
) 2 (
2
) 2 (
1
) 2 (

=
n
P P P Q .
...
k) Calculeaz
) 1 ( ) 1 ( ) (
=
k k k
Q R A ) 2 ( > k
- Triangularizeaz
) (k
A :
) ( ) (
1
) (
1
k k k
A P A = ;
) (
1
) (
2
) (
2
k k k
A P A = ; ;
) (
2
) (
1
) (
1
k
n
k
n
k
n
= A P A
- Pune:
) (
1
) ( k
n
k

= A R ;
) (
1
) (
2
) (
1
) ( k
n
k k k

= P P P Q
...

146
Calculaia continu pn cnd elementele triunghiului sub-diagonal n
) (
1
k
n
A sunt
aproximativ zero. Atunci, valorile proprii sunt pe diagonala lui
) (
1
k
n
A . Mai precis:
Dac A are valori proprii de module distincte, avem:
a) Dac A este simetric, atunci toate elementele non-diagonale vor fi
aproximativ zero. Reamintim c o matrice simetric are numai valori proprii
reale.
b) Dac A este nesimetric i are numai valori proprii reale, calculaia se termin
cnd toate elementele sub-diagonale sunt aproximativ zero.
Dac A (nesimetric) are o pereche de valori proprii complexe (conjugate), pe
diagonal rmn submatrici blocuri 22, ale cror valori proprii sunt perechea de
valori proprii conjugate ale lui A.

Convergena:
- Dac A este o matrice real (simetric sau nu) i are valori proprii de module
distincte, atunci matricile
) (k
A produse de algoritmul QR converg spre o
matrice superior triunghiular, pe diagonala creia se gsesc valorile proprii
ale lui A.
- Dac A are o valoare proprie de multiplicitate m, atunci
) (k
A nc converg la
matrice superior triunghiular, cu excepia unui bloc diagonal de ordinul m, ale
crui valori proprii au modulul egal cu |,.

Algoritmul QR cu deplasare:
Presupunem c A are valori proprii de module distincte 0 | | | | | |
2 1
> > > >
n
.
Se art c viteza de convergen la zero a elementelor sub-diagonale, i cea de
convergen la valorile proprii a elementelor diagonale, depind de rapoartele
k
i i
) / (
1

+
, 1 1 s s n i .
Dac dou valori proprii
i
i
1 + i
sunt apropiate una de alta, convergena va fi
nceat. Atunci, se utilizeaz urmtoarea tehnic pentru a accelera convergena. Se
147
aplic o deplasare
k
s la valorile proprii (acestea devin
k i
s ), la fiecare etap k.
Adic, punem
A A =
1
, i
) ( ) ( ) ( k k
k
k
s R Q I A = ,
I Q R A
k
k k k
s + =
+ ) ( ) ( ) 1 (

Exist dou strategii pentru a alege deplasarea
k
s (
k
s est o aproximaie a lui
n
):
1)
) (k
nn k
a s =
Pentru o matrice simetric (real), aceast strategie asigur o convergen
cubic, chiar n prezena unor valori proprii multiple (Wilkinson, (1965)).
2) Se calculeaz valorile proprii ale submatricii 22 cea mai de jos din
) (k
A :
(


) ( ) (
1 ,
) (
, 1
) (
1 , 1
k
nn
k
n n
k
n n
k
n n
a a
a a

Dac valorile proprii sunt reale, se alege:
k
s = valoarea proprie care este cea mai apropiat de
) (k
nn
a .
Dac valorile proprii sunt complexe, se ia:
k
s = partea real a valorii proprii.
3) Experimentele numerice au condus la o a treia strategie, i anume:
n i a s
k
ii k
, 1 ), min(
) (
= =
Pentru unele matrici simetrice, aceast strategie se dovedete cea mai bun,
conducnd la un numr mai mic de iteraii, i o eroare mai mic n Ay y.
Algoritm i cod
Programul calculeaz sistemul propriu (valori i vectori proprii), n succesiunea
urmtoare:
I. Transformarea preliminar a matricii A (Opional).
II. Valorile proprii, prin reducerea matricii la forma bloc-triunghiular.
148
III. Vectorii proprii (Opional).
Se calculeaz, mai nti, vectorii proprii ai matricii bloc-triunghiulare. Acetia se
aduc, prin transformarea de similaritate, la vectorii proprii ai lui A.
IV. Rafinarea sistemului propriu prin iteraie invers (Opional; numai n cazul cnd s-
a ales opiunea de calcul a vectorilor proprii).
V. Verificarea sistemului propriu (Opional):
Precizia sistemului propriu se verific prin listarea erorii maxime (n modul), n
y Ay (unde este valoarea proprie, iar y vectorul propriu asociat cu ).

Datele se citesc dintr-un fiier de date. Rezultatele sunt scrise n acest fiier, n
continuarea datelor de intrare.
Codul este scris n dubl precizie.
Detalii de implementare
1. Introducerea matricii
Matricea A se definete n unul din urmtoarele moduri:
- Citit din fiier
- Generat (de subrutina Agen)
Citirea se poate face, conform unui cod, astfel:
- Matrice simetric: triunghiul superior
- Matrice general: complet, pe linii i coloane
- Matrice general: elementele nenule (indice linie, indice coloan, element).
Nu este implementat citirea sau stocarea de matrici band.
2. Etapa I Transformri preliminare
Conform unui cod, matricea dat se poate aduce la una din formele:
- Tridiagonal (superioar): numai pentru o matrice simetric
- Hessenberg (superioar): matrice general
- Forma dat: nu se face nici o transformare preliminar
149
Codul auto comand forma tridiagonal pentru o matrice simetric, i forma
Hessenberg pentru o matrice general.
3. Etapele II, III Iteraia QR
Iteraia QR se face cu deplasare, i este implementat n conformitate cu
algoritmul de mai sus. Sunt implementate cele trei strategii, pentru alegerea
deplasrii
k
s ; strategia se alege printr-un cod.
Se prescriu:
- Un numr limit de iteraii, lnit
- Tolerana eps pentru forma bloc-triunghiular
- Tolerana eps_lambda pentru valorile proprii (v. mai jos)
Iteraia QR este oprit dac una din condiiile 1-4 de mai jos este ndeplinit:
1. S-a atins lnit.
2. S-a obinut forma bloc-triunghiular.
3. S-a atins tolerana eps_lambda pentru doua seturi succesive de valori proprii.
Forma bloc-triunghiular se consider obinut, dac urmtoarele dou teste sunt
satisfcute:
sub eps Sub Sub Max _ | _ _ | s (a)
left eps Diag Left Max _ | _ _ | s , (b)
unde:
Sub Sub Max _ _ este elementul sub-sub-diagonal de modul maxim, iar jmax este
linia pe care se atinge maximul (elementele sub-sub-diagonale din coloana j sunt
n j l j l a , 2 ), , ( + = ; maximul se caut pentru 2 , 1 = n j );
| ) , ( | _ jmax jmax a eps sub eps =
Diag Left Max _ _ este elementul stng-diagonal de modul maxim, iar lmax este
linia pe care se atinge acest maxim (elementul stng-diagonal de pe linia l este
) , 1 ( l l a );
) | ) , ( | ) 1 , 1 ( | ( _ lmax lmax a lmax lmax a eps left eps + = .
150
Not: Factorii lui eps sunt tiprii de program.
Observaii:
- Testul (a) este ndeplinit (dup cel puin o iteraie) dac, iniial, matricea este
redus la una din formele preliminarii (tridiagonal sau Hessenberg).
- Testul (b) se pune pentru elementul stng-diagonal a primei linii a blocului
22. (n cazul unui un bloc de dimensiune 1 pentru linia respectiv.)
- Codurile pentru metoda QR v. Bai et al. (2000), Golub & Van Loan (1996)
pun testul
) | | | | ( | |
1 , 1 1 ,
+ s
i i ii i i
a a tol a ,
unde tol este o toleran mai mare dect eroarea de rotunjire a unitii.
Elementele sub-diagonale
1 , i i
a care satisfac acest test sunt setate la zero.
4. Iteraia se mai oprete dac elementul stng-diagonal de modul maxim este
staionar (nu se mai reduce).
Testul pus este Max_Left_Diag = Prev_ Max_Left_Diag, unde membrul doi este
Max_Left_Diag de la iteraia precedent. Testul se pune dup ce Max_Left_Diag
s-a redus deja n proporia | Max_Left_Diag | eps_left-10.

Balansare
Eroarea n calculul valorilor proprii ale matricii A, rezultat prin aplicarea metodei
QR, este de ordinul
F M
|| || A c , unde
M
c este -main (Cap. 1, 3.8.2), iar
F
|| || A este
norma Frobenius (Cap. 4, 3) v. Chen & Demmel, Balancing Matrices n Bai et al.
(2000), Parlett & Reinsch (1969). Balansarea este o transformare preliminar a
matricii A, prin similaritate cu matricea diagonal real D, matricea de lucru devenind
AD D A
1
=
b
. Scopul este reducerea normei Frobenius a matricii date.
O matrice n n se zice balansat n norma-p dac, pentru fiecare n i , 1 = , norma-p a
liniei i este egal cu norma-p a coloanei i:
n i i n n i
p p
, 1 , || ) , : 1 ( || || ) : 1 , ( || = = A A
151
Algoritmii reduc norma-1 sau norma-2 a matricii A. innd cont de echivalena
normelor, rezult c va fi redus i norma Frobenius a matricii A.
Balansarea se poate face fr a introduce erori de rotunjire suplimentare, prin aceea c
elementele matricii D se aleg ca puteri ntregi ale bazei utilizate n reprezentarea
numerelor n calculator (baza 2).
Principalul algoritm este descris n lucrarea de referin Parlett & Reinsch (1969).
nainte de balansare, prin permutri de linii i coloane, matricea se aduce la forma:
(
(
(

2
1
T 0 0
W Z 0
Y X T
,
unde
i
T desemneaz o matrice superior triunghiular, iar 0 o matrice cu elemente
nule. Algoritmul se aplic, n esen, matricii Z (dar transformarea de similaritate se
aplic ntregii matrici, astfel c se modific i matricile X, Y, W).
Algoritmul balanseaz matricea n norma-1, dup un numr finit de pai. Acest
algoritm st la baza subrutinei sgbal din LAPACK (2000). Ali algoritmi sunt descrii
n Bai et al. (2000).

Exemple
Considerm urmtoarea matrice (Chen & Demmel, Balancing Matrices n Bai et al.
(2000)):
(
(
(

1 10 10
10 1 1
10 0 1
2 4
2
4
A
1. Balansarea direct, cu ) 100 1 01 . 0 ( diag = D , produce matricea balansat
(
(
(

= =

1 1 1
1 1 10
1 0 1
2 1
AD D A
b
.
152
Normele sunt:
4
10 00005 . 1 || || =
F
A i 65 . 2 || || =
F b
A . Pe de alt parte, normele
liniilor i coloanelor n
b
A sunt aproximativ egale.
Metoda QR aplicat lui A, fr rafinare (cu EPS = 1E-8), cu i fr balansare, d
urmtoarele rezultate:
- Valorile i vectorii proprii coincid, cu cel puin 10, i respectiv 9 cifre
semnificative.
- Erorile maxime (n modul) n y Ay sunt: 3.229E-11 i 2.887E-14,
respectiv. Se observ precizia mult mai mare a sistemului propriu calculat cu
balansarea matricii A.

2. Balansarea cu subrutina sgbal (n simpl precizie), d urmtoarele rezultate:
) 1.000000 02 - 1.5625000E 04 - 2.4414062E ( diag = D
(
(
(

=

000000 . 1 1.562500 2.441406
0.6400000 000000 . 1 10 1.5625000
40960 . 0 000000 . 0 000000 . 1
2
b
A
Este de remarcat c, prin acest procedeu, matricea este balansat aproximativ n
norma-1. Normele liniilor i coloanelor sunt de acelai ordin de mrime (ns,
diferite):
1 1.409600 3.457031
2 1.655625 2.562500
3 5.003906 2.049600
Eroarea maxim n y Ay este 4.960E-13.

3. Subrutina Balance din programul QR, balanseaz matricea n norma-1 (fr a face
permutri), cum urmeaz. Notm: norm_r norma liniei i, i norm1_r norma liniei i
fr elementul diagonal, adic:

=
=
=
i j
n j
j i a r norm
, 1
| ) , ( | _ 1 ; analog, pentru coloana i,
norm_c i norm1_c. Algoritmul este urmtorul:
- Iniializm I D= , i iterm paii K = 1, 2,
153
- La fiecare pas K, procesm liniile (i coloanele) n ordinea natural, anume:
Pentru n i , , 2 , 1 = :
- Calculm elementele matricei
1
D , prin c norm r norm d _ 1 / _ 1 1=
- Se scaleaz linia i coloana i, prin
1
1
1
AD D A

=
- Punem
1
D D D - =
La n i = rezult matricea D, la pasul curent K, i s-a calculat AD D A
1
= .
- Calculm (pentru matricea curent A):
r norm c norm r norm Ratio
n i
_ / | _ _ | max
, 1
=
=

- Se pun urmtoarele condiii de oprire a iteraiei:
EPS Ratio s ; lnit Iteratii Numar s _ ;
(Se iau: 4 1 = E EPS i 100 = lnit ).
Pentru matricea din Exemplu, la pasul 2, se obine: 05 - 1.2064E = Ratio ;
) 1.002465 02 - 1.0074407E 05 - 9.9750279E ( diag = D .
Normele liniilor i coloanelor sunt:
1 2.004975 2.004951
2 2.004963 2.004963
3 3.000013 3.000037
Eroarea maxim (n modul) n y Ay este 4.291E-14.

Fiiere
- Fiiere surs:
Agen.f90: subrutina de generare a matricii A
Main-QR-2005.f90: programul principal
work-2005.90: modul

- Biblioteca static:
154
QR_Lib.lib
Aceasta conine fiiere modul obiect (pentru aceste fiiere nu se d codul surs).

n proiect se vor include cele trei fiiere surs i biblioteca static.

- Fiiere de date:
Acestea se gsesc n sub-folderul QR\Dat. La lansarea n execuie, programul
deschide fereastra standard de selecie a fiierului din acest folder. Un fiier nou
de date, este preferabil s fie plasat n acest folder.

Programul QR este scris n dubl precizie.
Programul principal apeleaz urmtoarele subrutine (i o funcie):

GetFile(fname, status)
Selectarea fiierului de intrare. Bazat pe API-ul GetOpenFileName.
fname: nume fiier
status: ntreg

unit2(n, Q)
Iniializeaz matricea real Q(n, n) cu matricea unitate.
n: ordinul matricii Q
Q: matrice (n, n)

Agen(Ag, job)
Generarea matricii A
Ag: tablou (n,n), pentru matricea A generat.
Job: character(20); v. Semnificaia codurilor.

symm(n, a)
Funcie logic; matrice A simetric.
n: ordinul matricii A
a: tablou (n, n) pentru A.

PrintA(n, A)
155
Tiprirea matricii A(n, n)

Balance(n, a, diag_bal, 0), Direct_Balance(n, a, diag_bal)
Balansarea matricii A, i balansarea direct a matricii A.
n: ordinul matricii A
a: tablou (n, n) pentru A.
diag_bal: elementele diagonale ale matricii de balansare D (Balance: ieire;
Direct_Balance: intrare).

Tridiagonal(kod), Hessenberg(ikod)
Reducerea al forma tridiagonal, respectiv Hessenberg.
ikod: cod de tiprire a transformrilor. Se ia 0.

QR_Z(iter, do_shift, kodShift, kodIter, BlockReduced, real_val)
Iteraia QR.
iter: contor de iteraii
do_shift: logic; cu sau fr shift.
kodShift: codul shift-ului. V. Semnificaia codurilor.
kodIter: cod de tiprire a iteraiilor.
BlockReduced: logic. Matrice redus la forma bloc-triunghiular (ieire).
real_val: logic. Toate valorile proprii sunt reale (ieire).

Vec_BlocTri(VEC, kodNorm), Vec_BlocTri_Z(VEC_Z, kodNorm).
Calculeaz vectorii proprii ai unei matrici bloc-triughiulare valoare proprie
real, respectiv complex.
VEC, VEC_Z: tablou (n, n) pentru vectorii proprii; real, respectiv complex.

Power_Refine(ivp), Power_Refine_Z(ivp)
Rafinarea vectorului i valorii proprii nr. ivp valoare proprie real, respectiv
complex.

Normalize_r(VEC, kodNorm), Normalize_Z(VEC_Z, kodNorm)
Normalizarea vectorilor proprii cazul real, respectiv complex.
VEC, VEC_Z: ca mai sus.
156
kodNorm: codul normei. V. mai jos: Semnificaia codurilor
Check(real_val, full_print_check)
Subrutin pentru verificarea sistemului propriu.
real_val: logic; valori proprii reale.
full_print_check: logic; tiprirea la verificare, i a vectorilor z Az .

Structura fiierului de date
- Titlu: text, max. 80 caractere (titlul problemei).
- n, kodA, kodPrintA
Datele urmtoare definesc matricea A. Se introduce una din variante, n
funcie de codul kodA:
- Matricea A ... kodA = 0, 1 (matrice citit din fiierul de date)
- Job ... kodA < 0 (matrice generat).
- Fname_2: ... kodA > 2 (matricea se citete din fiierul Fname_2).
- Balance, kod_Balance: cod pentru balansarea matricii; cod pentru modul de
balansare.
- [diags(i), i =1,n ... Dac kod_Balance = 0.]
- Form: cod pentru transformri preliminare ale matricii.
- Eps, Eps_lambda, Lnit, kodIter: tolerane; numr limit de iteraii, cod tiprire
iteraii.
- Shift, kodShift: cod pentru shift ; cod strategie de alegere a shift-ului.
- kodVP: cod pentru calculul vectorilor proprii.
- [Refine: rafinarea sistemului propriu prin iteraie invers (dat logic)...Dac
kodVP = 0]
- [is (ntreg): cod pentru mod rafinare .... Dac Refine are valoarea adevrat:]
- [kodNorm: cod norm pentru vectorii proprii ... dac kodVP = 0]
- Check_text: cod pentru verificarea sistemului propriu.

Semnificaia codurilor:
n: ordinul matricii
kodA: kodA > 0: matrice citit; kodA < 0: matrice generat (de Agen).
Valori kodA i datele pentru definirea matricii A:
157
kodA = 0: triunghiul superior, pe linii (matrice simetric) n fiierul de
intrare;
kodA = 1: ntreaga matrice, pe linii n fiierul de intrare;
kodA > 2: Fname_2: specificatorul fiierului care conine elementele matricii.
Structura fiierului Fname_2:
Prima linie: text arbitrar (titlul problemei)
Liniile urmtoare, conform codului:
kodA = 2: triunghiul superior (matrice simetric) pe linii;
kodA = 3: ntreaga matrice pe linii;
kodA 4: elementele nenule ale matricii, anume:
i, j, ) , ( j i a .
Sfritul de fiier este o dat nenumeric. Exemplu: End

kodA < 0: job: Dat text (1-20 caractere). Numele jobului definit n Agen.
Parametru pentru apel Agen.
kodPrintA: > 0: tiprete A (dat, i redus la forma bloc-triunghiular);
0: tiprete A redus la forma bloc-triunghiular;
< 0: nu ipari.
Balance: Dat text (1-20 caractere). Primul caracter este semnificativ, anume:
B, b / Alt caracter: Balanseaz / Nu balansa.
kod_Balance: 0: Balansare cu subrutina Balance;
= 0: Balansare direct, cu diags (subrutina
Direct_Balance).
Dac nu se balanseaz: se introduce orice ntreg:
) : 1 ( n diags : Elementele diagonale pentru balansare direct ( AD D A
1
)
Form: Dat text (1-20 caractere). Primul caracter este semnificativ:
- A, a: Auto, rezultnd n:
Matrice simetric: forma Tridiagonal;
Matrice nesimetric: forma Hessenberg (superioar).
- T, t: forma Tridiagonal;
- H, h: forma Hessenberg;
- Alte caractere: matricea dat (Fr transformri preliminare).
Eps: Tolerana la elementele non-diagonale
158
Eps_lambda: Tolerana la dou valori succesive
Lnit: Numrul limit de iteraii
kodIter: 0 / =0: Da / Nu tiprete iteraiile.
Shift: text (1-20 caractere). Primul caracter este semnificativ:
S, s / alt caracter: Cu / Fr shift;
kodShift: 0:
) (k
nn k
a s = (
k
s este shiftul de la pasul k)
> 0: =
k
s Valoarea proprie a sub-matricii ) : 1 , : 1 (
) (
n n n n
k
A , cea
mai apropiat de
) (k
nn
a .
< 0: =
k
s Elementul diagonal
) (k
ii
a minim. (optim pentru unele matrici
simetrice).
kodVP: 0 / =0: Da / Nu calculeaz vectorii proprii.
kodVP > 0: Scrie vectorii proprii;
kodVP < 0: Nu scrie vectorii proprii.
Refine: Dat logic. Valori:
T / F: Rafineaz / Nu rafina sistemul propriu prin iteraie invers
(cu translaie).
Not: Dac se rafineaz: vectorii poprii sunt deja normalizai cu
norma-2.
is: Definete shift-ul pentru iteraia invers. Se introduce numai pentru
Refine = T.
Shiftul este definit prin ds i s = ) ( , unde:
is > 0: ds = o unitate n cea de-a "is-a" cifr semnificativ a lui
lambda. Recomandare: is = 4; 5, 6.
is < 0: ds = 1D-4
kodNorm: < 0: Nu normaliza.
0: Norma-infinit
1: Norma-1
2: Norma euclidian (Norma-2)
3: Norma "inginereasc": prima coordonat = 1.
Check_text: dat text (1-20 caractere). Primul caracter este semnificativ:
C,c, P,p, F,f / Alt caracter: Da / Nu - Verificarea
sistemului propriu.
159
F,f: se tipresc i vectorii reziduali z Az .

(do_balance, do_Shift, do_check, full_print_check: date logice; utilizare intern)

Semnificaia unor date de ieire:
Row: Indicele liniei matricii reduse.
Bloc Flag = 1 / 2 : Indicele liniei Row n bloc (Prima linie / A Doua linie).
Bloc Flag = 0: Linia nu aparine unui bloc.
(Intern, se utilizeaz tabloul ibloc(1:n): Indicele liniei blocului; la ieire, data
Bloc Flag este variabila i_flag. V. programul principal.).

Dac se balanseaz (do_Balance = .true.):
Norm Row
Norm Column Norm Row
Ratio
n i
_
| _ _ |
max
, 1

=
=


Dac ordinul matricii 50 > n , programul afieaz i timpul de calcul.

Exemple
Exemplu-1: Fr rafinare.
Ex Rau Cond.
3 1 0
3.02 -1.05 2.53
4.33 0.56 -1.78
-0.83 -0.54 1.47
NoBal 0
Hess
1E-8 1E-7 50 0
shift 0
1
F
2
Proba

Matrix A - Hessenberg form
160
3.020000 1.507519 2.287091
-4.408832 1.021202 1.866028
-2.2204460E-16 0.6260283 1.008798

* Reached block-triangular form (Iteration 4).
Maximum Left-Diagonal (in modulus) is: 7.6697928E-12 (Row:
lmax = 3).
|a(lmax-1,lmax-1)| +|a(lmax,lmax)|: 1.25924
Maximum sub_Sub-Diagonal (in modulus) is: 1.4049635E-21
(Column 1).

Processing block-triangular form:
Iterating to reach tolerance on lambdas.

* Met tolerance EPS_lambda on lambdas (Iteration 5).
Actual test value is: 0.000

Real Eigenvalues: F

Iteration 5:
Reduced Matrix - Block-Triangular Form
2.670576 -4.177637 -1.992024
1.505434 2.381351 -2.346518

4.0960151E-12 6.4844721E-12 -1.9272281E-03

Row Block Flag
1 1
2 2
3 0


Eigenvalues
1 2.525963614058517 2.503646148445962
2 2.525963614058517 -2.503646148445962
3 -1.9272281170354718E-03

161
Eigenvectors
1
0.3676642025709480 0.4354636756397324
0.7512290651054949 -0.1817280223639355
-0.1909470078347702 0.2033801346581520

2
-0.4135378963777110 -0.3921632146355579
0.2247448848453599 -0.7394997762727376
-0.2140525790598959 0.1789014599505183

3
0.2557213286279253E-01
0.9337601708377145
0.3569846066400766

Check: A*y - lambda*y
Maximum absolute difference (A*y -lambda*y) = 3.695E-12
Vector # Coordinate(s) #
3 3


Exemplu-2: cu rafinare.
Relum Exemplu-1, cu rafinare, cu is = 5.
Ex. Rau Cond. cu rafinare.
3 1 0
3.02 -1.05 2.53
4.33 0.56 -1.78
-0.83 -0.54 1.47
NoBal 0
Hess
1E-8 1E-7 50 0
Shift 0
1
T
5
2
162
Proba

Matrix A - Hessenberg form
3.020000 1.507519 2.287091
-4.408832 1.021202 1.866028
-2.2204460E-16 0.6260283 1.008798

* Reached block-triangular form (Iteration 4).
Maximum Left-Diagonal (in modulus) is: 7.6697928E-12 (Row:
lmax = 3).
|a(lmax-1,lmax-1)| +|a(lmax,lmax)|: 1.25924
Maximum sub_Sub-Diagonal (in modulus) is: 1.4049635E-21
(Column 1).

Processing block-triangular form:
Iterating to reach tolerance on lambdas.

* Met tolerance EPS_lambda on lambdas (Iteration 5).
Actual test value is: 0.000

Real Eigenvalues: F

Iteration 5:
Reduced Matrix - Block-Triangular Form
2.670576 -4.177637 -1.992024
1.505434 2.381351 -2.346518

4.0960151E-12 6.4844721E-12 -1.9272281E-03

Row Block Flag
1 1
2 2
3 0


* Refinement:
Iterations Test Value Tolerance
163
1 2 2.9288392389E-16 4.441E-16
2 2 2.0378132692E-16 4.441E-16
3 5 0.000000000 2.168E-19

Eigenvalues
1 2.525963614055325 2.503646148447407
2 2.525963614055325 -2.503646148447407
3 -1.9272281106504925E-03

Eigenvectors
1
-0.3676642303666432 -0.4354636521714133
-0.7512290535059487 0.1817280703162026
0.1909469948529727 -0.2033801468451698

2
0.4135378713456177 0.3921632410317126
-0.2247449320489531 0.7394997619273490
0.2140525904780458 -0.1789014462875638

3
-0.2557213286362887E-01
-0.9337601708378584
-0.3569846066396395

Check: A*y - lambda*y
Maximum absolute difference (A*y -lambda*y) = 4.441E-16
Vector # Coordinate(s) #
1 2
2 2


Exemplu-3: cu balansare (i fr rafinare).
Considerm din nou, Exemplu-1, cu balansarea matricii cu kod_Balance = 0. Se
observ c, verificarea sistemului propriu este mai bun dect n Exemplu-1.
Ex Rau Cond. cu balansare
3 1 0
164
3.02 -1.05 2.53
4.33 0.56 -1.78
-0.83 -0.54 1.47
Bal 0
Hess
1E-8 1E-7 50 0
shift 0
1
F
2
Proba

Balance: No. of steps = 5; Ratio = 4.0314E-05

A-balanced
3.020000 -1.844351 1.792431
2.465094 0.5600000 -0.7179390
-1.171537 -1.338832 1.470000

Matrix A - Hessenberg form
3.020000 2.435185 0.8272331
-2.729320 1.525048 0.6917772
2.2204460E-16 1.312671 0.5049516

* Reached block-triangular form (Iteration 4).
Maximum Left-Diagonal (in modulus) is: 1.2783143E-13 (Row:
lmax = 3).
|a(lmax-1,lmax-1)| +|a(lmax,lmax)|: 2.08140
Maximum sub_Sub-Diagonal (in modulus) is: -2.4004666E-22
(Column 1).

Processing block-triangular form:
Iterating to reach tolerance on lambdas.

* Met tolerance EPS_lambda on lambdas (Iteration 5).
Actual test value is: 2.4973E-16

165
Real Eigenvalues: F

Iteration 5:
Reduced Matrix - Block-Triangular Form
2.409872 -3.042890 -1.287376
2.064393 2.642056 1.6150857E-02

7.8669816E-14 1.0075681E-13 -1.9272281E-03

Row Block Flag
1 1
2 2
3 0


Eigenvalues
1 2.525963614055325 2.503646148447388
2 2.525963614055325 -2.503646148447388
3 -1.9272281106496357E-03

Eigenvectors
1
0.4517818761876123 0.3474172059670668
0.6954752629118252 -0.3371710857265424
-0.1433823750645967 0.2393025981785100

2
-0.3679706023954490 -0.4352047959596641
0.3045951628967318 -0.7103463726325355
-0.2324043571570585 0.1543128437576227

3
0.2557213286362881E-01
0.9337601708378584
0.3569846066396397

Check: A*y - lambda*y
166
Maximum absolute difference (A*y -lambda*y) = 6.362E-14
Vector # Coordinate(s) #
1 2

Exemplu-4:
Considerm matricea Eberlein de ordinul 16 (Westlake (1968)). Aceasta se definete
prin:
(
(
(
(

=
5 0 0 1
2 4 0 2
2 2 3 3
2 2 2 2
C ;
(


=
C C
C C
B
5
5
;

(

=
B B
B B
A
3 4
2
.
Matricea A are urmtoarele valori proprii:
. 3 , 2 6 , 3 9 , 4 12 , 5 15 , 10 30 , 15 45 , 20 60 i i i i i i i i

Codul n Agen pentru generarea matricii A n tabloul Ag(n,n), este dat mai jos. (n
datele de intrare, se pune n = 16).
...
ELSEIF(job =='ebe16') THEN
allocate(c(4,4), b(8,8))
c(1,1) =-2; c(1,2:4) =2;
c(2,1) =-3; c(2,2) =3; c(2,3:4) =2;
c(3,1) =-2; c(3,2) =0; c(3,3) =4; c(3,4) =2;
c(4,1) =-1; c(4,2:3) =0; c(4,4) =5

b(1:4,1:4) =5*c; b(1:4,5:8) =-c;
b(5:8,1:4) =5*c; b(5:8,5:8) =c;

ag(1:8,1:8) =b; ag(1:8,9:16) =2*b;
ag(9:16,1:8) =4*b; ag(9:16,9:16) =3*b;

deallocate(c, b)
ENDIF
167

Pentru programul fr rafinare, se introduc datele
Eberlein - ord. 16
16 -1 1
ebe16
NoBal 0
auto
0.01 0.01 100 0
Shift 0
1
F
2
ch

Forma bloc-triunghiular este atins la iteraia 21 (i tolerana la , la iteraia 22).
Rezultatul verificrii sistemului propriu este:
Maximum absolute difference (A*y -lambda*y) = 5.572E-03
Vector # Coordinate(s) #
5 15

Programul cu rafinare, cu is = 5, produce urmtoarele rezultate (pentru economie de
spaiu, vectorii proprii nu sunt listai):
Eigenvalues
1 30.00000000000003 10.00000000000001
2 30.00000000000003 -10.00000000000001
3 15.00000000000001 4.999999999999977
4 15.00000000000001 -4.999999999999977
5 60.00000000000001 20.00000000000001
6 60.00000000000001 -20.00000000000001
7 44.99999999999998 15.00000000000002
8 44.99999999999998 -15.00000000000002
9 -2.999999999999998 1.000000000000001
10 -2.999999999999998 -1.000000000000001
11 -6.000000000000003 2.000000000000008
12 -6.000000000000003 -2.000000000000008
13 -12.00000000000000 4.000000000000002
168
14 -12.00000000000000 -4.000000000000002
15 -9.000000000000000 3.000000000000027
16 -9.000000000000000 -3.000000000000027

Check result:
Maximum absolute difference (A*y -lambda*y) =9.769963E-15
Vector # Coordinate(s) #
8 1

Observaii:
Toleranele Eps i Eps_lambda s-au luat relativ mici (0.01), producnd rezultate
destul de imprecise n cazul fr rafinare: eroarea n verificarea sistemului propriu,
este de ordinul E-3.
Acestea sunt ns, mbuntite foarte mult, prin rafinare (eroare de ordinul E-15).
Tolerane mai mici, nu mbuntesc verificarea sistemului propriu. Exemplu:
Tolerane de 0.001 duc la o eroare de ordinul E-14 n verificare.
Acest exemplu d o idee, despre dificultile care apar n calculul sistemului propriu
al unei matrici de ordin relativ mare; aceste dificulti cresc odat cu ordinul matricii.
Pentru o matrice de ordin mare, nu se vor alege tolerane Eps i Eps_lambda foarte
mici.

Exemplu-5:
Considerm matricea Wilkinson de ordinul 20 (Wilkinson (1963), Westlake (1968)):
(
(
(
(
(
(
(
(

=
20
20 19
20 3
20 2
20 1
c

A
Analitic, matricea n n , este definit prin 0 ) , ( = j i a , cu excepia elementelor:
; ) , ( i i i a = n i , 1 =
n i i a = + ) 1 , ( ; 1 , 1 = n i ;
c = ) 1 , (n a .
169
Exemplul Wilkinson ia 20 = n .
Dac perturbaia 0 = c , matricea este superior triunghiular, i valorile proprii sunt
i i = ) ( .
Pentru 10 1 = E c , cu metoda QR fr rafinare (cu EPS = 1E-6), se obin
urmtoarele rezultate:
a) Fr balansare: Valorile proprii rezult toate reale. Ele reprezint perturbaii
ale valorilor i, 1 , 20 = i , anume (ordonate descresctor):
19.99999998462896, 19.00001298980951, 17.99999341364806,
..., 3.000002187998112, 1.999999854534825, 1.000000000000000
Eroarea n verificarea sistemului propriu este 1.232E-07.

b) Cu balansare: Valorile proprii calculate conin 14 valori complexe, i anume
(ordonate dup i descresctor):
20 20.00424815126970
19 18.89075561522547
18 18.42511929989719
17 17.03466897322695 1.087736309816453
16 17.03466897322695 -1.087736309816453
15 15.10602239289448 1.948529250030004
14 15.10602239289448 -1.948529250030004
13 12.88192664561770 2.529181675892914
12 12.88192664561770 -2.529181675892914
11 10.49999998763635 2.733397362516592
10 10.49999998763635 -2.733397362516592
9 8.118073427255256 2.529181726294424
8 8.118073427255256 -2.529181726294424
7 5.893977535006919 1.948529282139898
6 5.893977535006919 -1.948529282139898
170
5 3.965330675018651 1.087735665091806
4 3.965330675018651 -1.087735665091806
3 2.574881415008950
2 2.109241835064037
1 0.9957544102238627
Eroarea n verificarea sistemului propriu este 4.211E-06.
(Cu balansare i rafinare, eroarea devine 1.776E-15.)

Explicaia rezultatelor foarte diferite n cazurile (a) i (b), este urmtoarea: polinomul
caracteristic al matricii este c
19
20 ) 20 ( ) 2 )( 1 ( ) ( = p , i acesta este
foarte ru condiionat; numerele de condiie pentru rdcini sunt cuprinse ntre
7
10 31 . 4 i
12
10 98 . 3 . Odat cu polinomul, i valorile proprii sunt ru condiionate.
(Problema condiionrii valorilor proprii depete cadrul acestui manual. V. de
exemplu, Golub & Van Loan (1996)).

Din acest exemplu, se poate conchide c simpla verificare a sistemului propriu (prin
proba c || || z Az = mic), nu asigur corectitudinea sistemului propriu calculat
v. cazul (a).
Pe de alt parte, rezult c balansarea matricii este necesar n acest caz.

n general:
Balansarea se recomand pentru metoda QR aplicat la matrici nesimetrice, la care
valorile proprii pot fi ru-condiionate. Matricile simetrice au valori proprii bine-
condiionate.


General_R, General_R1
Problema generalizat reducerea la problema standard.
171
Problema generalizat de valori proprii
Problema determinrii valorilor i vectorilor proprii ai unei matrici A, definit de
x Ax = , sau de ecuaia
0 x I A = ) ( (1)
se va numi problema standard.
n Dinamica Structurilor apare urmtoarea problem:
0 x M K = ) ( , (2)
unde:
2
e = , iar K i M sunt matrici simetrice i pozitiv definite (K i M sunt
respectiv, matricile de rigiditate i de mas; e este pulsaia proprie).
Problema (2) se zice problema generalizat de valori proprii. Mai general considernd
dou matrici n n A i B, problema generalizat are forma 0 x B A = ) ( .
n continuare, considerm problema (2).
Reducerea la problema standard
Problema (2) poate fi adus la problema standard (1) pentru o matrice simetric i
pozitiv definit, cum urmeaz.
1) Se face descompunerea Cholesky a lui M:
S S M
T
= , (3)
unde S este superior triunghiular.. Atunci, (2) scris n forma Mx Kx = ,
devine Sx S Kx
T
= , i se scrie din nou ca i
) ( ) (
1
Sx S Sx KS
T
=

. (4)
2) Se noteaz
Sx y = (5)
i ecuaia (4) devine
y S y KS
T
=
1
.
Premultiplicnd cu
T T T
= = S S S ) ( ) (
1 1
, se obine
Iy y KS S =
1 T

172
3) Acum, definim
1
= KS S R
T
(5)
R este matrice simetric i pozitiv definit.
4) Problema (2) este pus n forma standard pentru matricea R, i anume,
0 y I R = ) ( (6)
Problemele (6) i (2) au aceleai valori proprii.
5) Dup rezolvarea lui (6) pentru i y, vectorii proprii ai problemei originale (2)
sunt dai, cf. (4), de
y S x
1
= (7)

innd cont de faptul c M i K sunt simetrice i pozitiv definite, se verific imediat
c matricea R este simetric i pozitiv definit. Urmeaz c valorile proprii ale lui R
sunt reale i pozitive, aa cum trebuie s avem conform cu
2
i i
e = .
Astfel, pentru a rezolva (6), orice metod pentru problema de valori proprii ale unei
matrici simetrice i pozitiv definite poate fi aplicat lui R.
Observaie
Cel mai simplu caz este acela n care matricea M este diagonal (model de mase
concentrate), ) (
i
m diag = M . Atunci, avem ) (
i
T
m diag = = S S , i
) / 1 (
1
i
T
m diag = =

S S . Astfel, elementele lui R i x sunt date de:
n j i
m m
k
r
j i
ij
ij
, 1 , , = = ,
i
n i
m
y
x
i
i
i
, 1 , = = .

Observaie
Matricea R poate fi scalat, adic se pune factor - ' = R R . Ecuaia (6) devine
173
0 y I R = ' ' ) ( , unde
factor

= '
Astfel, dup determinarea valorilor proprii ' avem factor - ' = , iar pulsaiile
proprii se gsesc din:
factor - ' = e


Foldere:
General_R, General_R1
Ambele proiecte reduc problema generalizat (2) la problema standard. Deosebirea
este c primul stocheaz i proceseaz triunghiul superior al matricilor M i K, iar al
doilea, matricile complete M(ngl,ngl), K(ngl,ngl).
Ambele proiecte lucreaz n dubl precizie.

Fiiere (General_R):
Back.f90: substituie napoi, pentru Cholesky.
Cholesky_S.f90: subrutina Cholesky.
loca.f90: funcia de adres din Cholesky.
Gen_M.f90, Gen_K.f90: subrutinele de generare a matricii M, respectiv K.
Gen_R.f90: subrutina de calcul a matricii R.
Main-General_R.f90: programul principal.
Write_R.f90: subrutin pentru scrierea matricii R.
work.f90: modul
GetFile.f90, Openfile.f90, width.f90: utilitare
Compact_mul: subrutin de nmulire S-A, unde: S este simetric i stocat n
triunghiul superior, iar A este ) , ( n n .
174
[Aceasta este numai n folderul General_R.]

Subrutina metodei este
Gen_R(kodPrint)
Parametru:
kodPrint: cod pentru tiparire
Datele de intrare se citesc dintr-un fiier de date (acesta se selecteaz din fereastra
standard). Datele de ieire se scriu n continuarea datelor de intrare.
Matricile M i K se introduc conform codurilor kod_genM i kod_genK (coduri de
citire sau generare a matricilor):
- kod_gen 0: matrici generate (de subrutinele Gen_M.f90, Gen_K.f90);
- kod_gen 1: matrici citite din fiier, anume:
- kod_gen = 1: fiierul de intrare;
- kod_gen 2: fiier specificat (selectat).
Daca matricea este citit: se introduce i "factor"; dac este generat, nu.
n cazul matricilor citite dintr-un fiier specificat (kod_gen 2), fiierul va avea
urmtoarea structur:
- Prima linie din fiier este o linie-text (ignorat la citire);
- Urmtoarele linii conin elementele triunghului superior al matricii.

Datele de intrare (aceleai pentru General_R i General_R1), sunt:
- Titlu: text de max. 80 caractere
- ngl, kod_genM, kod_genK
Pentru kod_genM = 1, se introduce:
- [Matricea M triunghiul superior, pe linii.]
Pentru kod_genM 1, se introduce:
- [m_factor: factor de multiplicare pentru M; (M m_factor - M)
Pentru kod_genK = 1, se introduc:
- [Matricea K triunghiul superior, pe linii.]
Pentru kod_genK 1, se introduce:
175
- [k_factor: factor de multiplicare pentru K; (K k_factor - K)
- kodPrint: cod tiprire

Semnificaia codurilor:
ngl: ordinul matricii (numrul gradelor de libertate)
kod_gen: v. mai sus
kodPrint: 0 / =0: Nu se tipresc / Se tipresc: matricile M, K, i S.
Observaie
Matricea R este scalat: adic, n fiierul de ieire, se tiprete matricea scalat
R' i factorul de scalare scal: avem scal - ' = R R .
Factorul de scalare se calculeaz astfel:
norm1 = maxval(dabs(R))
scal = 2_8**(exponent(norm1)-1)
unde norm1 este norma-1.

Exemplu:
(
(
(

=
2 1 0
1 3 1
0 1 2
M ;
(
(
(



=
1 1 0
1 2 1
0 1 3
K .
Fiierul de date:
Exemplu cu M non-diagonala; ngl =3
3 1 1
2 1 0
3 1
2
1. ! m_factor

3 -1 0
2 -1
1
176
1. ! k_factor
0

Rezultate:
Matricea R = S^(-T)*K*S^(-1)
1.500000000000000 -1.118033988749895 0.5590169943749473
-1.118033988749895 1.500000000000000 -1.250000000000000
0.5590169943749473 -1.250000000000000 1.500000000000000


Matricea S^(-1):
0.707106781186547 -0.316227766016838 0.158113883008419
0.632455532033676 -0.316227766016838
0.790569415042095


Retrieve_Eigen_from_R
Regsete valorile i vectorii proprii ai problemei generalizate, dup gsirea valorilor
i vectorilor propriiai matricii R.

Fiiere surs:
Main-Retrieve_Eigen_from_R.f90: programul principal
work-2005.90: modul
GetFile.90, OpenFile.90: fiiere pentru fereastra de selecie standard
width.90: utilitar
Fiiere de date (intrare):
Programul cere ca in folderul de lucru s existe urmatoarele 4 fiiere:
nume-S^-1.dat: fiierul care conine matricea
1
S (triunghiul superior);
nume-Scal_R.dat: fiierul care conine factorul de scalare.
nume-VAL.dat: fiierul care conine valorile proprii ale lui R;
nume-VEC.dat: fiierul care conine vectorii proprii y ai lui R;

177
Specificatorul de fiier trebuie s aib forma de mai sus, n care, nume este ales de
utilizator (de regul, numele exemplului).
n fiecare fiier, datele numerice sunt precedate de o line-text.

- Primele dou fiiere sunt furnizate (ca fiiere de ieire) de programul
General_R.
- Ultimele dou fiiere sunt furnizate (ca fiiere de ieire) de programul de
valori proprii QR sau Jacobi.

Date introduse de la terminal:
- Numrul gradelor de libertate (ordinul matricii R)
- Pulsaii sau Frecvene: se introduce T, respectiv F.
Relaia ntre pulsaia e i frecvena f este: ) 2 /( t e = f .

Fiiere de ieire (rezultate):
nume-OMEGA.dat (pulsaii), sau nume-FRECV.dat (frecvene);
nume-VEC_X.dat: vectorii proprii x, ai problemei generalizate.

Exemplu (v. exemplul de la General_R)
Fiiere de intrare:
Ex3-S^-1.dat:
Matricea S^(-1):
0.707106781186547 -0.316227766016838 0.158113883008419
0.632455532033676 -0.316227766016838
0.790569415042095

Ex3-Scal_R.dat:
Factor de scalare pentru R:
1.00000000000000

Urmtoarele fiiere sunt generate de Jacobi_D:
Ex3-VAL.dat:
Eigenvalues:
178
1 3.478563691072702
2 0.9454183848254143
3 7.6017924101882794E-02

Ex3-VEC.dat:
Eigenvectors
1
-0.5223878791313503
0.6464566721245862
-0.5560066361130130

2
-0.7548454734848392
-0.4735615410061037E-01
0.6541440345456881

3
0.3965697446473088
0.7614626757958836
0.5127445986996710

179

Folder tematic: Interpolation
INTERPOLARE
Newton
Polinomul de interpolare Newton.
Metoda:
Problema
Fie funcia f, cunoscut prin valorile ei pe 1 + n puncte distincte
i
x , ca n tabelul
urmtor:
x
0
x
1
x
2
x
n
x
f(x)
0
f
1
f
2
f
n
f

Punctele
i
x se numesc noduri i s-a notat n i x f f
i i
, 0 ), ( = = . Se cere s se gseasc
un polinom
n
p de grad cel mult n, care s coincid cu funcia f pe nodurile
i
x (sau, al
crui grafic s treac prin punctele ) , (
i i
f x ), adic:
n i f x p
i i n
, 0 , ) ( = =
Se zice c
n
p este polinomul de interpolare al funciei f, pe nodurile date.
Se arat c:
Polinomul de interpolare (al funciei f, pe 1 + n noduri) exist i este unic

Forma Newton a polinomului de interpolare
) ( ) ( ) ( ) (
1 0 0 1 0
+ + + =
n n n
x x x x c x x c c x p
Definim polinoamele
1 ) (
0
= x q ,
0 1
) ( x x x q = , ) )( ( ) (
1 0 2
x x x x x q = , ,
sau, n general,
180
n k x x x q x q
k
i
i k
, 1 , ) ( ) ( ; 1 ) (
1
0
0
= = =
[

=

Polinomul de interpolare sub forma Newton se scrie atunci:

=
=
n
k
k k n
x q c x p
0
) ( ) (
Coeficientul
k
c se numete diferena divizat de ordinul k (a funciei f, pe nodul
k
x )
i se noteaz cu
] [
0 0
x f c = ; ] , , , [
1 0 k k
x x x f c = , k 1.
Cu aceasta, expresia polinomului de interpolare se scrie

=
=
n
k
k k n
x q x x x f x p
0
1 0
) ( ] , , , [ ) ( (1)
sau explicit:
) ( ) ]( , , [
) )( ]( , , [ ) ]( , [ ) ( ) (
1 0 0
1 0 2 1 0 0 1 0 0

+
+ + + =
n n
n
x x x x x x f
x x x x x x x f x x x x f x f x p

(1')

Proprieti ale diferenelor divizate
P1. Diferena divizat este o funcie simetric de argumentele sale
Adic, considernd o permutare (
n
i i , ,
0
) a numerelor (1, , n), avem:
] , , [ ] , , [
0
0
n i i
x x f x x f
n
=
P2. Formula de recuren a diferenelor divizate:
0
1 0 1
0
] , , [ ] , , [
] , , [
x x
x x f x x f
x x f
n
n n
n

=


(2)

Calculul practic al diferenelor divizate
Notnd nodurile cu
n j j j
x x x
+ +
, , ,
1
, (2) devine:
j n j
n j j n j j
n j j
x x
x x f x x f
x x f

=
+
+ + +
+
] , , [ ] , , [
] , , [
1 1


i
j j
f x f = ] [ . Utiliznd notaia simplificat
181
] , , , [
1 1 n j j j n j j j
x x x f f
+ + + +
=

,
formula de recuren (2) se scrie:
j n j
n j j n j j
n j j j
x x
f f
f

=
+
+ + +
+ +
1 1
1

(3)
Astfel, obinem diferenele de ordinul 1, 2, 3, etc.:
1:
0 1
0 1
01
x x
f f
f

= ;
1 2
1 2
12
x x
f f
f

= ;
2 3
2 3
23
x x
f f
f

= ;
2:
0 2
01 12
012
x x
f f
f

= ;
1 3
12 23
123
x x
f f
f

= ;
3:
0 3
012 123
0123
x x
f f
f

= ;
Etc.
Diferenele divizate se pot aeza n urmtorul tabel exemplu pentru 4 noduri:
3 3
23 2 2
123 12 1 1
0123 012 01 0 0
f x
f f x
f f f x
f f f f x

Primele dou coloane sunt datele problemei (Coloana a doua reprezint i diferenele
de ordinul 0). Diferenele de ordinul 1, 2, 3 sunt n coloanele 3, 4, 5. Tabloul are
structura triunghiular: datele nu permit calculul diferenelor
n j j
f
+
cu 4 = + n j
(care implic nodul
4
x ).
Polinomul de interpolare Newton, pentru exemplul din tabel, este:
) )( )( ( ) )( ( ) ( ) (
2 1 0 0123 1 0 012 0 01 0 4
x x x x x x f x x x x f x x f f x p + + + = (4)
Coeficienii polinomului se gsesc n prima linie din tabel (ncepnd cu coloana 2).
Pentru calculul practic al coeficienilor polinomului Newton, notm coeficienii ca n
tabloul de mai jos, anume
jk
c (unde j este indicele nodului, iar k indicele ordinului
diferenei):
182
30 3
21 20 2
12 11 10 1
03 02 01 00 0
c x
c c x
c c c x
c c c c x

Corespondena este:
01 01
f c = ;
012 02
f c = ;
0123 03
f c =
12 11
f c = ;
123 12
f c = ;
21 21
f c = ;
Sau, n general,
k j j j jk
f c
+ +
=
1
(5)
Cu aceasta, (4) se scrie:
) )( )( ( ) )( ( ) ( ) (
2 1 0 03 1 0 02 0 01 00 4
x x x x x x c x x x x c x x c c x p + + + =
Coeficienii
jk
c se calculeaz prin recuren, cu formula care deriv din (2) i (5):
j k j
k j k j
jk
x x
c c
c

=
+
+ 1 , 1 , 1
(6)

Fiiere:
Pol-newton.f90: programul principal
Fun.f90: funcia f

Programul principal implementeaz calculul coeficienilor
jk
c conform (6), pentru
funcia definit n fun.90. n afar de aceasta, programul calculeaz erorile relative ale
polinomului de interpolare pe nite valori date
i
z , adic ) ( / )) ( ) ( (
i i i
z f z p z f ; dac
6 1 | ) ( | s E z f
i
, se listeaz eroarea (n loc de eroarea relativ).
Subprogramul fun(x) returneaz valorile funciei f pe x. (Funcia este numit fun, i
valorile ei sunt stocate, n programul principal, n tabloul f(0:n).)

Datele de intrare se citesc dintr-un fiier de date, care conine datele:
- Titlu: text, max. 80 caractere
183
- n1: numrul de noduri. ( 1 1 + = n n )
- ) : 0 ( n x : nodurile
i
x : n1 valori
- nz: numrul de valori
i
z
- z(1:nz): valorile
i
z : nz valori
.
Datele de ieire constau n: valorile funciei f pe noduri; coeficienii
jk
c ; valorile
polinomului p(z); erorile ) ( ) (
i i
z p z f . (Dac 2 . 0 | ) ( | s
i
z f , n loc de eroarea
relativ se listeaz eroarea.)
Not
Programul are scopul de a lista valorile i erorile polinomului de interpolare (n
general, pe alte puncte dect nodurile).
Programul se poate modifica uor, astfel ca s aib ca intrare valorile funciei pe
noduri, adic valorile f(0:n).(n loc ca acestea s fie calculate de funcia
definit n fun.f90.)

Exemplu:
Considerm funcia
2
3 ) ( x e x f
x
= , i nodurile 4 , 3 , 2 , 1 , 0 , 1 . Listm
valoarea i eroarea polinomului, pe mijloacele intervalelor definite de noduri:
5 . 3 ; 5 . 2 ; 5 . 1 ; 5 . 0 ; 5 . 0 .
Fiierul de intrare/ieire este:
Functia f = exp(x)-3*x*x; 6 noduri.
6
-1 0 1 2 3 4
5
-0.5 0.5 1.5 2.5 3.5

f(x): -2.632121 1.000000 -0.2817182 -4.610944
-6.914463 6.598150

184
Coeficienti c_ij:
-2.632121 3.632121 -2.456919 0.3110553
0.1336201
4.5919430E-02
1.000000 -1.281718 -1.523754 0.8455356
0.3632172
-0.2817182 -4.329226 1.012853 2.298404
-4.610944 -2.303519 7.908066
-6.914463 13.51261
6.598150

z p(z) Eroare relativa
-0.500000 -8.368891E-02 -5.978E-02 (* eroarea)
0.500000 0.8673121 3.495E-02
1.50000 -2.242733 1.128E-02
2.50000 -6.608934 -6.308E-03
3.50000 -3.488262 4.025E-02

Graficele funciei i polinomului de interpolare sunt date mai jos.









185




Figura 8 Interpolare: graficul funciei i polinomului de interpolare

186

UTILITARE
Folder tematic: $ Utilities
Function_expression i width
Function_expression.f90; Function_expression_g.f90;
Function_expression-2.f90; Function_expression_Sys.f90
Aceste fiiere conin subrutine apelate de programul principal. Ele citesc i returneaz
expresia funciei/funciilor cu care se lucreaz; expresiile sunt citite (n cod Fortran)
din fiierul surs n care sunt definite funciile. Specificatorul fiierului surs este
definit n programul principal.
Programului principal scrie expresiile funciilor, n fiierul de ieire i la display.

Subrutinele sunt descrise mai jos.
Parametrii de apel sunt variabile caracter de lungime 132, sau, sau tablouri de astfel
de variabile. (Lungimea 132 se poate modifica).

F_Expr(f_source, f_text)
La metode pentru ecuaii de forma 0 ) ( = x f (Bis, Secant).
Parametri:
f_source: specificator de fiier surs pentru funcia f
f_text: expresia funciei f

F_Expr_g(g_source, g_text)
La metode pentru ecuaii de forma 0 ) ( = x g (Fix, Aitken)
Parametri:
g_source: specificator de fiier surs pentru funcia g
g_text: expresia funciei g

F_Expr(f_source, f_text)
La metode pentru ecuaii de forma 0 ) ( = x f , care lucreaz i cu derivata f '
(Newton).
187
Parametri:
f_source: specificator de fiier surs pentru funcia f i f '
f_text: tablou de dimensiune 2. Expresiile funciilor f i f '

F_Expr_Sys(f_source, n, f_text)
La metode pentru sisteme de ecuaii neliniare (Fix_Sys, Newton_Sys).
Parametri:
f_source: specificator de fiier surs
n: ordinul sistemului de ecuaii neliniare
f_text: tablou de dimensiune n. Expresiile funciilor
i
f sau
i
g , n i , 1 =

Not
Instruciunea de definire a unei funcii are forma f = expresie (respectiv,
f1 = expresie pentru derivata lui f). Caracterul f (sau f1) poate fi precedat sau
succedat, n linia instruciune, de spaii sau tab-uri; acestea se omit la afiare.
Dac utilitarul nu gsete, n fiierul surs specificat, o astfel de expresie a funciei, se
afieaz f = ? (respectiv, f1 = ?).

width.f90
Acest utilitar returneaz numrul de cifre iw dintr-o variabil ntreag. Servete la
tiprirea valorilor ntregi cu format n execuie de tip I<iw>.

integer function width(n)
Parametri:
n: variabil intreag
Not
n programul apelant, trebuie inclus declaraia integer width

Grafic
Calculul valorilor unei funcii f(x), pe un interval [a, b], cu pasul h.
Programul are ca fiier de ieire valorile x, y, unde jh a x + = , ) (x f y =
188
Fiierul de ieire se va utiliza ntr-un program de grafic pentru reprezentarea
graficului lui f. V. de exemplu, programul GRAPH.
n pofida simplitii lui, flexibilitatea oferit de program, l face foarte util pentru
scopul propus.

Fiiere:
grafic.f90: Subrutina de calcul a valorilor f(x)
Mgrafic.f90: Programul principal: singura lui funciune este de declara cu atributul
external numele funciilor (definite n functie.f90), i de a apela
subrutina grafic pentru una (sau mai multe) dintre aceste funcii.
functie.f90: definete funciile de lucru; expresia unei funcii poate include un
parametru p;
par.f90: modul pentru parametrul funciei.

Datele de intrare se introduc de la terminal i constau n:
- Exist p = dat caracter: Y sau y, dac funcia include un parametru p; orice alt
caracter, n caz contrar.
- [p, dac exist parametru]
- valorile a, b, h
- nume fiier de ieire (fr extensie: programul pune extensia .dat)

Observaii
- Graficul unei curbe, definit prin ecuaia implicit 0 ) , ( = y x F : se rezolv n
raport cu y, gsind ) (x f y = . Dac exist dou soluii ) (
1
x f y = i ) (
2
x f y = ,
se vor construi fiierele pentru fiecare din funciile
1
f i
2
f . Se reprezint
apoi, ambele funcii pe acelai grafic.
Exemplu: 1
2 2
= + y x ; se obine:
2
1
1 ) ( x x f = i
2
2
1 ) ( x x f = .
- Se pot construi, n aceeai rulare, fiierele de ieire pentru mai multe funcii:
Pentru aceasta, n Mgrafic, se pun mai multe apeluri call grafic(f1), ...,
call grafic(fn), pentru funciile f1, ..., fn.
Datele se introduc succesiv, pentru fiecare funcie (n ordinea apelurilor)
189

Bibliografie
1. Chisli A., Numerical Analysis, UTC-N, 2002.
2. Atkinson K. E., An Introduction to Numerical Analysis, John Wiley & Sons,
N.Y., 1978. 2
nd
edition, 1989.
3. Bai Z., Demmel J., Dongarra J., Ruhe A., and van der Vorst H., Templates
for the Solution of Algebraic Eigenvalue Problems: A Practical Guide,
SIAM, Philadelphia, 2000.
http://www.cs.utk.edu/~dongarra/etemplates/book.html
4. Golub G. H. and Van Loan C. F., Matrix Computations, John Hopkins Univ.
Press, Baltimore & London, 1996.
5. Goldberg D., What Every Computer Scientist Should Know About
Floating-Point Arithmetic, ACM Computing Surveys, Vol 23, No 1, March
1991, http://www4.ncsu.edu/~gremaud/MA402/goldberg.pdf
6. Jennings, A., Matrix Computation for Engineers and Scientists, J.Wiley &
Sons, 1980.
7. Kahan W., "How Futile are Mindless Assessments of Roundoff in Floating-
Point Computation ?", 2006,
http://www.cs.berkeley.edu/~wkahan/Mindless.pdf
8. LAPACK, Version 3.0, 2000, http://www.netlib.org/lapack/ .
9. Loh E. and Walster G.W., Rumps Example Revisited, Reliable Computing
8, 245248, 2002, Kluwer Academic Publishers.
10. Ogita T., Rump S.M., and Oishi S., Accurate Sum and Dot Product,
Technical report, Wased University, 2003.
11. Parlett B. N., and Reinsch C., Balancing a Matrix for Calculation of
Eigenvalues and Eigenvectors, Numer. Math. 13, 293-304, 1969.
12. Rump S. M., Verification methods: rigorous results using floating-point
arithmetic, Acta Numerica 2010, Vol.19, Cambridge Univ. Press.
13. Wilkinson J. H., Convergence of LR, QR, and Related Algorithms, Comput.
J., 8, 1965, 77-84.
14. Westlake J. R., A Handbook of Numerical Matrix Inversion and Solution of
Linear Equations, J. Wiley&Sons, N.Y., 1968.
190

15. Fortran PowerStation Reference, Microsoft Corporation, 1995.
16. Fortran PowerStation Programmers Guide, Microsoft Corporation, 1995.
17. Compaq Visual Fortran Language Reference Manual, 2001.
18. Compaq Visual Fortran Programmer's Guide, 2001.
19. IMSL Mathematical and Statistical Libraries, Compaq Visual Fortran 6.6,
IMSL Help, 1999.
20. Intel Visual Fortran Compiler 11.x for Windows, 2010
http://software.intel.com/en-us/articles/fortran-compilers/
21. High-Precision Software Directory, 2012,
http://crd-legacy.lbl.gov/~dhbailey/mpdist/



191
Lista Figurilor
Figura 1 Graficul funciei
2
3 ) ( x e x f
x
= ............................................................24
Figura 2 - Proces staionar n metoda Newton ...........................................................33
Figura 3 - Proces staionar Graficul iteratelor .........................................................38
Figura 4 - Proces staionar Graficul funciei i primei bisectoare ............................39
Figura 5 Determinarea aproximaiilor iniiale ........................................................45
Figura 6 Metoda Muller: graficul funciei i polinomului de interpolare .................67
Figura 7 - Tablourile Y1 i YA .................................................................................93
Figura 8 Interpolare: graficul funciei i polinomului de interpolare ..................... 185

192
Index
Accelerarea Aitken, 39
Aitken cu funcia G(x), 42
Algoritmul QR
algoritm i cod, 146
balansare, 149
implementare, 147
metoda, 142, 169, 175
Bessel, 12
Bisecia, 24
Cholesky
cu matricea L, 88
cu matricea S, 91
matrici band, 91
Descompunerea LU
calculul determinantului, 79
calculul determinantului, 79
Crout, 84, 87
Doolittle, 77, 84
matrice complex, 85
Eliminarea Gauss, 70, 75
Exemplul Muller-Kahan, 13
Funcia Bessel, 12
Grafic, 187
Graficul funciei, 24
Interpolare
polinomul Newton, 178
Laguerre, 60
Matricea Hilbert, 98
Matrici hermitiene i unitare, 111
Metoda iteraiilor simultane, 130
Metoda Jacobi (valori proprii), 136
Metoda Muller
rdcini reale, 62
rdcinile unei funcii complexe, 67
Metoda Newton
o ecuaie, 29
sisteme de ecuaii, 48
Metoda punctului fix
o ecuaie, 34
sisteme de ecuaii neliniare, 45, 48
Metoda puterii
matrice complex, 122
matrice real, 115
teste de oprire a iteraiei, 116
Metoda puterii puterii inverse cu
translaie
matrice complex, 127
matrice real, 123
Metode iterative
Gauss-Seidel, 103, 104
Jacobi, 100
SOR, 105
Numr de condiie, 96
Pierderea de semnificaie, 14, 15
Pivotarea parial, 72
Polinoame
calculul valorii, 50
POL (reducerea gradului), 53
Pol_Complex (rdcini complexe),
58
Pol_Direct (iterare n polinomul
original), 56
193
Polinomul lui Rump, 16
Polinomul Rump # 2, 17
Problema de valori proprii
definiii, 108
polinom caracteristic, 108
problema generalizat, 169, 175
subspaiu propriu, 110
Proces staionar
n metoda Newton, 32, 33
n metoda punctului fix, 37
Produs scalar
spaiu vectorial complex, 113
spaiu vectorial real, 112
Recuren, 12
Secanta, 26
SSH, 19
Sumare fr erori, 21
ULP, 22
Utilitare, 185
Valori speciale, 18

S-ar putea să vă placă și