Documente Academic
Documente Profesional
Documente Cultură
1.1
1.1.1
Preliminarii
Notatii pentru scalari, vectori i matrice s
Structurile de date folosite la cursul de metode numerice i, special, cazul calculului s n n matriceal sunt matrici de numere reale sau complexe. O matrice este o structur de date a bidimensional (dreptunghiular) nodurile creia se a numere reale sau complexe. Un a a n a a vector este o structur de date unidimensional (linie sau coloan) nodurile creia se a a a a n a a numere reale sau complexe. Numerele reale sau complexe se numesc scalari reali, respectiv compleci. Un scalar s complex este o pereche ordonat de scalari reali. Astfel, calculul cu matrice cu elemente a complexe se poate reduce la calcul matriceal cu matrice cu elemente reale. Ca urmare, n continuare ne vom referi numai la scalari, vectori i matrice reale. Multimea numerelor reale s va notat cu IR, multimea vectorilor cu n elemente va notat cu IRn iar IRmn este a a multimea matricelor cu elemente reale cu m linii i n coloane. Vom considera un vector ca s ind implicit de tipul coloan. Un vector linie va vzut ca un vector (coloan) transpus. a a a O matrice de tipul 1 1 este un scalar, o matrice de tipul 1 n este un vector (linie) i o s matrice te tipul m 1 este un vector (coloan). Pentru comoditate vom folosi conceptul de a matrice vid, care este o matrice fr elemente, notat [ ]. a aa a Vom considera ntotdeauna c numerele reale sunt reprezentate memoria calculatorului a n ntr-un format specic, numit format virgul mobil (FVM) i c toate operatiile aritmetice a a s a de baz (cum ar adunarea, scderea, a a mmultirea, artirea, extragerea radicalului etc.) mp pentru numerele virgul mobil sunt implementate calculator. n a a n Pe parcursul cursului se va utiliza un set de notatii pe care v sftuim s folositi i a a a l s voi. Fiecare scalar, vector sau matrice va notat cu un simbol care va interpretat ca un
nume de identicare. Pentru ecare scalar, vector sau matrice real se aloc memoria a a n calculatorului o structur de date virgul mobil. Notatiile standard sunt: a n a a Litere greceti mici: , , . . ., pentru scalari (izolati); s Litere latine mici: a, b, c, . . ., x, y, z pentru vectori (coloane); Litere latine mari: A, B, C, . . ., X, Y , Z pentru matrice. Fie A IRmn o matrice i b IRm un vector. Elementul aat pe linia i i coloana j a s s matricei A va notat cu A(i, j) sau aij . Elementul i al vectorului b va notat cu b(i) sau bi . Vom folosi intens notatia MATLAB : pentru a crea un vector linie. Expresia a=:: creaz un vector linie a cu primul element , al doilea element +, al treilea element +2 a s.a.m.d., a ultimul element nu poate mai mare dect . Valoarea implicit pentru pasul ns a a este = 1. Aadar, dac n = 5, atunci i = 1 : n creaz vectorul linie i = [ 1 2 3 4 5 ] dar s a a j = n : 1 creaz un vector vid; vectorul k = n : 1 : 1 este [ 5 4 3 2 1 ]. a Pentru a crea o matrice cu elementele unei alte matrice putem indica elementele matricei noi cu coordonatele matricei vechi. Spre exemplu, e r = [ r1 r2 . . . ] si c = [ c1 c2 . . . ] coordonatele liniilor, respectiv, ale coloanelor matricei vechi. Atunci expresia B = A(r, c) creaz matricea a A(r1 , c1 ) A(r1 , c2 ) A(r2 , c1 ) A(r2 , c2 ) B= . . . . . . . .. .
Utiliznd notatia : putem crea o mare varietate de matrice cu elementele unei matrice a date. Spre exemplu, e A IRmn o matrice data i k min(m, n). Atunci s B = A(1 : k, 1 : k) este coltul din stanga sus de ordin k al lui A, numit submatrice lider principal a lui A; a R = A(i, 1 : n) este linia i a luiA; C = A(1 : m, j) este coloana j a lui A. acest context, notatia : fr parametri In aa nseamn toate. Astfel, linia i i, respectiv, a s coloana j a lui A pot extrase prin R = A(i, :), respectiv C = A(:, j).
1.1.2
Matrice structurate
Matricele folosite calculul matriceal pot avea multe elemente nule. Numrul i pozitia lor n a s fac s existe mai multe tipuri de matrice pe care le denim cele ce urmeaz. a n a primul rnd, o matrice care are un numr mare (s zicem, mai mare de 90%) de In a a a elemente nule se numete matrice rar. O matrice care nu este rar se numete dens. s a a s a
1.1. PRELIMINARII
cazul calculului matriceal cu matrice rare, calculatorul folosete metode speciale pentru In s memorare i procesare (de exemplu, sunt memorate doar elementele nenule s mpreun cu a coordonatele lor). continuare ne vom referi numai la calcul matriceal cu matrice dense. In Astfel, toate matricele folosite (chiar i matricea zero) vor vzute ca matrice dense. s a Matricele dense pot avea un numr semnicativ de elemente nule. Matricele care elea n mentele nule sunt pozitionate ntr-o form regulat vor numite matrice (dense) structurate. a a Matricele structurate joac un rol important calculul matriceal. Cele mai importante maa n trice structurate sunt denite mai jos. 1. Matrice triunghiulare. O matrice L IRmn se numete inferior triunghiular dac s a a L(i, j) = 0, oricare ar i < j iar L se numete inferior triunghiular unitate dac s a a n plus L(i, i) = 1 oricare ar i 1 : min(m, n). O matrice U IRmn se numete s superior triunghiular dac U (i, j) = 0, oricare ar j < i iar U se numete superior a a s triunghiular unitate dac plus U (i, i) = 1 oricare ar i 1 : min(m, n). Remarcati a a n c elementele nule ale unei matrice inferior triunghiulare cu m > n i elementele nule a s ale unei matrice superior triunghiulare cu m < n formeaz o structur trapezoidal. a a a 2. Matrice diagonale. O matrice D IRmn se numete diagonal dac D(i, j) = 0, s a a oricare ar i = j, adic este acelai timp i inferior triunghiular i superior a n s s a s triuunghiular. a 3. Matrice Hessenberg. O matrice patratic G IRnn se numete inferior Hessenberg a s dac G(i, j) = 0, oricare ar j > i + 1. O matrice patratic H IRnn se numete a a s superior Hessenberg dac H(i, j) = 0, oricare ar i > j + 1. a 4. Matrice tridiagonale. O matrice patratic T IRnn se numete tridiagonal dac a s a a T (i, j) = 0, oricare ar i, j care satisfac |i j| > 1, adic este acelai timp superior a n s i inferior Hessenberg. s 5. Matrice band. O matrice B IRmn se numete matrice band de latime (p,q) a s a dac B(i, j) = 0, oricare ar i < j + p i j < i + q. O matrice tridiagonal este o a s a matrice band cu p = q = 1. a Observatie: Dei limbajele de programare de nivel s nalt nu permit astfel de structuri de date cum sunt matricele triunghiulare, putem s evitm memorarea elementelor nule i s a a s a obtinem o memorare economic folosind o singur matrice patratic pentru memorarea unei a a a matrice inferior triunghiulare i a uneia superior tringhiulare. Astfel de strategii de stocare s vor folosite spre exemplu de algoritmii de factorizare LU i QR. s Unele matrice pot s nu aib (multe) elemente nule dar s necesite o procesare special. a a a a Cteva din aceste matrice sunt: a 1. Matrice simetrice. O matrice patratic S IRnn se numete simetric dac a s a a S(i, j) = S(j, i), oricare ar i, j. In mod normal, o matrice simetric este stocat a a numai prin partea sa inferior sau superior triunghiular. a 2. Matrice pozitiv denite. O matrice patratic simetric P IRnn se numete a a s pozitiv denit dac toti scalarii xT P x, unde x IRn este un vector (coloan) nenul a a a arbitrar ales, sunt strict pozitivi. Dac xT P x 0, x IRn , atunci P se numete a s pozitiv semi-denit. O matrice pozitiv denit are toti elementii de pe diagonal a a a
SEMINAR 1. CALCUL MATRICEAL ELEMENTAR pozitivi (demonstrati) dar elementele care nu se a pe diagonal nu sunt obligatoriu a a pozitive. O matrice simetric N IRnn se numete negativ (semi)-denit dac N a s a a este pozitiv (semi)-denit. a 3. Matrice ortogonale. Doi vectori (coloan) x, y IRn se numesc ortogonali dac a a y T x = 0 i ortonormati dac, plus, x 2 = y 2 = 1. O matrice patratic Q IRnn s a n a se numete ortogonal dac toate coloanele ei formeaz perechi ortonormate, adic s a a a a QT Q = In , unde In este matricea unitate. Matricele ortogonale joac un rol decisiv a rezolvarea problemei liniare a celor mai mici ptrate. n a
1.1.3
Metodele numerice au rolul s rezolve probleme matematice care folosesc date numerice. O a problem matematic cu date initiale numerice i cu un rezultat numeric trebuie s aib a a s a a o solutie unic. general, exist multe metode de rezolvare a unei probleme de calcul a In a numeric dat. O expunere detaliat a unei metode numerice se numete algoritm. Aadar, a a s s un algoritm este o list de operatii aritmetice i logice care duc datele numerice initiale la a s solutia numeric nal. Aceste rezultate nale sunt interpretate ca solutia calculat a unei a a a probleme date. Cnd algoritmul este fcut pentru a executat pe un calculator cu un singur a a procesor, adic exist o ordine strict a executiei instructiunilor (dou instructiuni nu pot a a a a executate acelai timp!) atunci algoritmul se numete secvential. Altfel algoritmul se n s s numete paralel. s Principalele performante ale algoritmilor seventiali sunt stabilitatea i ecienta. Stabili s tatea este un obiectiv esential a foarte greu de msurat i de asigurat. Vezi cursul pentru ns a s mai multe detalii. Ecienta algoritmilor secventiali poate msurat de doi parametri: a a numrul de operatii virgul mobil N (ops) i volumul de memorie necesar M (exprimat a n a a s prin numrul de locatii FVM). Numrul N determin timpul de executie al algoritmului. a a a Toti algoritmii pe care vom studia vor avea o complexitate polinomial, astfel N i i a s M sunt polinoame de dimensiunea problemei, exprimate functie de numrul initial i cel n a s nal de date, spre exemplu functie de ordinul n al matricelor folosite. Dac n a N = 1 np + 2 np1 + . . . + p n + p+1 , ne vor interesa numai evalurile asimptotice a N 1 np , (evident limn
N N
M = 1 nq + 2 nq1 + . . . + q n + q+1
M 1 nq
= limn
M M
= 1).
Pentru a mbunti ecienta algoritmilor sunt utile urmtoarele recomandri: a at a a nu executati operatii cu rezultatul cunoscut, de exemplu evitati adunri i scderi cu a s a zero, nmultiri cu 1 sau 0, mpartiri la 1 etc; nu repetati aceleai calcule; cazul care calculatorul functioneaz corect veti obtine s n n a acelai rezultat; s evitati executia operatiilor inutile;
evitati memorarea informatiilor care nu trebuiesc neaprat memorate; de exemplu nu a memorati niciodat matricea zero sau matricea unitate: le puteti folosi far s le aveti a a a memoria calculatorului; n nu memorati aceeai informatie de mai multe ori; s folositi metode eciente de memorare a matricelor structurate, de exemplu matricele diagonale pot memorate numai prin memorarea elementelor diagonale etc; folositi suprascrierea; ex: dac vreti s calculati vectorul z = x + y i nu mai aveti a a s nevoie de x sau y pentru calculele urmtoare atunci calculati x x + y sau y a x + y. Observatie. Nu neglijati recomandrile de mai sus. B.Francis i N.Koublanovskaia au a s devenit celebri descoperind cum s evite calculele excesive dintr-un algoritm. Si tu poti a deveni un cercettor cunoscut reducnd valoarea parametrilor p i/sau q cazul problemelor a a s n numerice standard. Nu se cunoate a valoarea minim a parametrului p pentru o problem s nc a a simpl cum este a nmultirea matricelor!
1.2
Vom adopta cteva conventii pentru scrierea algoritmilor. Aceste conventii ne vor permite a s scriem algoritmii de calcul a ntr-o form concis, clar, uor de eles i de implementat a a a s nt s ntr-un limbaj de programare de nivel nalt. Instructiunile de baz ale pseudo-cod-ului sunt a prezentate mai jos. Ele pot completate cu orice alt instructiune neambigu i uor de a as s eles. nt
1.2.1
Instructiuni de atribuire
Formele generale ale unei instructiuni de atribuire sunt: v = expresie sau v expresie
unde v este numele unei variabile i expresie este orice expresie aritmetic sau logic valid. s a a a O expresie aritmetic este valid dac: a a a toate variabilele folosite au o valoare valid (adic au fost initializate sau calculate a a anterior); toate operatiile sunt bine denite i expresia are o valoare bine denit; astfel nu sunt s a permise: artirea la zero, operatiile nedeterminate cum ar 0 , 0/0, / etc. mp O expresie logic este valid dac: a a a toate variabilele logice folosite au o valoare logic valid (adevrat sau fals); a a a sunt folositi numai operatori logici binecunoscuti: SI, SAU, NU, NICI etc.
SEMINAR 1. CALCUL MATRICEAL ELEMENTAR expresia ia o valoare logic clar (adevarat sau fals). a a
Executia unei instructiuni de atribuire implic: a evaluarea expresiei; memorarea valorii expresiei memoria calculatorului n ntr-o zon identicat cu nua a mele variabilei v; vechea valoare a lui v se pierde. Uneori vom folosim o form special a a uv pentru interschimbarea valorilor dintre variabilele u i v. Aceast instructiune este echivas a lent cu urmtoarele trei instructiuni de atribuire a a 1. aux = u 2. u = v 3. v = aux, unde aux este o variabila auxiliar. a
1.2.2
Instructiunea Dac a
Utilizarea conditionat a unui set de instructiuni poate realizat folosind instructiunea a a dac a crei sintax este: a a a 1. dac expresie logic a a 1. instructiuni 1 altfel 1. instructiuni 2 Executia instructiunii dac implic a a 1. evaluarea expresie logic; rezultatul are valoare logic ADEVARAT sau FALS; a a a 2. dac rezultatul are valoarea logic ADEVARAT atunci se execut primul grup de a a a instructiuni (instructiuni 1); 3. dac rezultatul are valoarea logic FALS atunci se execut al doilea grup de instructiuni a a a (instructiuni 2). Partea altfel a unei instructiuni dac poate lipsi. a Expresia logic poate scris explicit, dar trebuie s aib o valoare logic clar la a a a a a a momentul executiei. Spre exemplu 1. dac este duminic a a 1. stai acas a altfel 1. mergi la scoal. a are sens numai dac cel care execut algoritmul tie ce zi a sptmnii se a. a a s n a a a a De asemenea, se recomand s se evite situatiile care expresia logic este o constant a a n a a evident deoarece acest caz instructiunea dac nu mai este necesar. De exemplu a n a a
1.2. CONVENTII PENTRU PSEUDO-COD 1. dac 1 > 2 a 1. a = 3.14 altfel 1. a = 2.73 se poate nlocui imediat cu a = 2.73.
1.2.3
Cicluri
Cnd avem un grup de instructiuni care trebuie executate mod repetat avem la dispozitie a n dou tipuri de instructiuni ciclice. a a) instructiunea pentru are urmtoarea sintax: a a 1. pentru k = expresie 1. instructiuni Executia unei instructiuni pentru implic a 1. evaluarea expresiei; rezultatul trebuie s e un vector linie; a 2. se atribuie variabilei k primul element al vectorului linie calculat i se execut s a instructiunile din corpul ciclului; 3. se atribuie variabilei k cel de-al doilea element al vectorului linie calculat i se s execut instructiunile; a 4. i asa mai departe pn la atribuirea lui k a ultimului element al vectorului linie. s a a Obsevatie: Valoarea curent a lui k poate folosit instructiuni dar nu recomandm a a n a modicarea acesteia. MATLAB rezultatul evalurii expreseiei poate o matrice In a n care caz lui k i se atribuie succesiv, ordinea natural, cte o coloan a matricei i n a a a s pentru ecare atribuire se execut instructiunile din corpul ciclului. a Exemplu: ind dat un scalar real i un numr natural n 1 urmtorul ciclu cals a a n culeaz = 2 . a 1. = 2. pentru k = 1 : n 1. = b) instructiunea ct timp are urmtoarea sintax: a a a 1. ct timp expresie logica a 1. instructiuni Executia unei instructiuni ct timp implic: a a 1. evaluarea expresie logic; rezultatul trebuie s e ADEVARAT sau FALS; a a 2. dac rezultatul este ADEVARAT se execut instructiunile; altfel ciclul ct timp a a a este terminat; 3. mergi la 1.
SEMINAR 1. CALCUL MATRICEAL ELEMENTAR Observatie: Dac rezultatul primei evaluri este FALS instructiunile din corpul ciclului a a nu sunt executate niciodat. Dac rezultatul primei evaluri este adevrat i valoarea a a a a s expresiei logice nu se schimb pe parcursul executrii instructiunilor, atunci ciclul a a ct timp nu se termin niciodat; avem un ciclu innit. Dac nu aveti nevoie a a a a de un ciclu innit aveti grij s schimbati valoarea expresiei pe parcursul executrii a a a instructiunilor. Exemplu: ind dat un scalar real i un numr natural n 1 urmtorul ciclu cals a a n culeaz = 2 . a 1. = 2. k = 1 3. ct timp k n a 1. = 2. k = k + 1
1.2.4
Structura algoritmilor
Orice algoritm va avea dou prti: a a 1. prima parte contine informatii privitoare la problema rezolvat i metoda folosit a s a pentru rezolvarea ei: datele de intrare (initiale); datele calculate (rezultate); metoda folosit; a Optional, prima parte poate contine numele autorului data elaborrii algoritmului a versiunea etc. 2. a doua parte este o list de instructiuni numerotate scrise pseudo-cod care arat a n a cum sunt folosite datele initiale pentru a ajunge la rezultatul nal.
1.3
BLAS
Cele mai importante operatii cu matrice tratate acest seminar sunt implementate n ntr-un pachet software numit Basic Linear Algebra Soubrutines (BLAS). Exist versiuni speciale a a BLAS concepute pentru calculatoare cu organizare ierarhic a memoriei care sunt optia mizate pentru a exploata toate atributele calculatorului int. BLAS este organizat pe trei t a nivele. Lista subnivelelor BLAS este dat Anex. a n a
1.3. BLAS
1.3.1
Nivelul 1 contine operatii de complexitate O(n). Cteva dintre acestea sunt: a 1. SAXPY (acronim pentru Scalar Alpha X Plus Y) y x + y unde x i y sunt vectori dati de dimensiune n (coloan sau linie) i este un scalar dat. s a s Evident dac y are initial toate elementele nule, atunci SAXPY calculeaz y = x. (Atentie: a a dac vreti s calculati y = x folosind SAXPY, nu uitati s initializati y cu 0). a a a 2. DOT calculeaz produsul scalar a doi vectori (coloan) x, y IRn care este, prin a a denitie,
n
= yT x =
i=1
xi yi
3. Norme vectoriale. Ne mrginim s prezentm aici norma vectorial euclidian IRn a a a a a n denit de a n = xT x = x2 . i
i=1
1.3.2
Nivelul 2 al BLAS contine operatii de complexitate O(n2 ). Cteva dintre acestea sunt: a 1. GAXPY (acronim pentru General A X Plus Y) y Ax + y unde x i y sunt vectori (coloan) de dimensiune n i A este o matrice n n dat. Evident, s a s a dac initial toate elementele lui y sunt nule, atunci GAXPY calculeaz produsul matricea a vector y = Ax. (Atentie: dac vreti s calculati y = Ax folosind GAXPY, nu uitati s a a a initializati y cu zero). acest context vom folosi i operatia cu vectori linie y T xT A+y T . In s 2. OUT produsul extern a doi vectori (coloan) x, y IRn este denit ca o matrice n n a A = xy T , i.e. A(i, j) = xi yj , i, j = 1 : n
Nivelul 2 contine totodat algoritmi de rezolvare a sistemelor triunghiulare liniare (vezi a seminarul 2).
1.3.3
Nivelul 3 al BLAS contine operatii de complexitate O(n3 ). Cele mai importante dintre acestea sunt: 1. Inmultirea matricelor: ind dati scalarii reali i i matricele reale A IRmn , s s B IRnp , C IRmp , procedura de nmultire a matricelor BLAS calculeaz a C A B + C.
10
Lund = = 1 i matricea initiala C zero, procedura de mai sus calculeaz produsul C = a s a A B. BLAS acoper toate cazurile particulare ale a nmultirii matrice-matrice. Pentru cazul care mcar una dintre matrice este simetric exist o procedur special. De asemenea, n a a a a a exist proceduri speciale pentru cazul care matricele implicate sunt triunghiulare. a n 2. Actualizarea de rang k a unei matrice simetrice: ind dati scalarii reali i , o s matrice simetric C IRmn i o matrice AIRnk , se calculeaza matricea a s C A AT + C. Dac k < n i A are coloanele liniar independente, atunci rangAAT = k. Acest lucru d a s a numele procedurii. 3. Actualizarea de rang 2k a unei matrici simetrice: ind dati scalari reali i , o s matrice simetric C IRmn i dou matrice n k A i B, procedura calculeaz: a s a s a C A B T + B AT + C. Nivelul 3 contine i algoritmi de rezolvare a sistemelor liniare triunghiulare cu membrul s drept multiplu (vezi seminar 2) care au o complexitate O(n3 ) .
1.4
Probleme rezolvate
Vom ncepe cu probleme simple, cum sunt cele rezolvate de BLAS, dar care sunt des alnite nt probleme mai complexe. Programele MATLAB de implementare a algoritmilor elaborati n sunt prezentate Anexa B. n Problema 1. Fiind date numerele reale 1 , 2 , . . . , n , scrieti un algoritm care s a n n s a calculeze suma lor = i=1 i i un alt algoritm care s calculeze produsul lor = i=1 i . Solutie. Amintiti-v c o sum este a a a ntotdeauna initializat cu 0 i un produs cu 1. a s Algoritmi posibili pentru a calcula i sunt: s Algoritmul 1.1 (Date i , i = 1 : n, algoritmul calculeaz = a 1. = 0 2. pentru i = 1 : n 1. = + i Algoritmul 1.2 (Date i , i = 1 : n, algoritmul calculeaza = 1. = 0 2. pentru i = n : 1 : 1 1. = + i Observati c cei doi algoritmi pentru calcularea sumei sunt diferiti. Datorit erorilor de a a rotunjire, care apar la efectuarea ecrei adunri, rezultatele executrii celor doi algoritmi a a a pot diferite. Adunarea virgul mobil nu este o operatie asociativ. Este foarte greu n a a a de gsit ordinea optim de a a nsumare astfel at eroarea s e minim. nc a a Algoritmul 1.3 (Date i , i = 1 : n, algoritmul calculeaz = a
n i=1 n i=1 n i=1
i )
i )
i )
1.4. PROBLEME REZOLVATE 1. = 1 2. pentru i = 1 : n 1. = i Evident, observatiile de mai sus rmn valabile. a a
11
Problema 2. Fiind dat o matrice superior triunghiular U IRnn , scrieti un algoritm a a ecient care s calculeze a 1. urma matricei U , i.e. = tr U ; 2. determinantul = det U 3. normele Frobenius, 1 i innit ale matricei U denite felul urmtor: s n a
n n
F =
i=1 j=1
u2 ij
n
(normaFrobenius),
1 = max i s = max
n i1:n
j1:n
|uij |
i=1 n
(norma1)
|uij |
j=1
(norma ).
Solutie. Prin denitie = s a i=1 U (i, i). De asemenea, este uor de demonstrat c n = i=1 U (i, i). Astfel puteti folosi algoritmii de calcul a sumei, respectiv a produsului a n numere reale de la problemele precedente. Pentru a putea calcula ecient norma matricei vom exploata structura superior triunghiular a matricei U evitnd efectuarea unor operatii a a inutile. Astfel avem
n n j n
F =
i=1 j=i
u2 , ij
1 = max
j1:n
|uij |,
i=1
= max
i1:n
|uij |.
j=i
Prin urmare, algoritmul este: Algoritmul 1.4 1. 1 = 0 2. pentru j = 1 : n 1. = 0 2. pentru i = 1 : j 1. = + |uij | 3. dac 1 < a 1. 1 = 3. = 0 4. pentru i = 1 : n 1. = 0
Problema 3. a) Fie doi vectori necoliniari dati b1 , b2 IRn . Calculati un vector q IRn aat subspatiul generat de b1 i b2 , ortogonal la b1 . b) Fie p vectori liniar independenti n s bj IRn , j = 1 : p. Calculati un set de p vectori qj , j = 1 : p din subspatiul generat de vectorii bj , ortogonali doi cte doi, i.e. astfel at qi qj = 0, i = j, qj IRn , j = 1 : p. a nc T Solutie. a) Orice vector din subspatiul generat de vectorii b1 i b2 este o combinatie s liniar a acestor doi vectori. Fie q o astfel de combinatie liniar a lui b1 i b2 , i.e. q = b1 +b2 . a a s Pentru a determina avem conditia de ortogonalitate bT q = bT b1 + bT b2 = 0. Vectorul b1 1 1 1 bT b2 1 ind nenul, rezult = T . Algoritmul este: a b1 b1 1. = 0 2. = 0 3. pentru i = 1 : n 1. = + b1 (i) b2 (i) 2. = + b1 (i) b1 (i) 4. = / 5. pentru i = 1 : n 1. q(i) = b1 (i) + b2 (i) b) Binecunoscuta procedur de ortogonalizare Gram-Schmidt utilizeaz i generalizeaz a as a rezultatul de la punctul a); vectorii ortogonali qj genereaz acelai subspatiu al lui IRn ca a s i setul de vectori bj . Ideea algoritmului Gram-Schmidt const a impune q1 = b1 i a s a n s exprima un vector qj+1 ca o combinatie liniar a vectorilor qk deja calculati i bj+1 , conform a s schemei de calcul la nivel vectorial: 1. q1 = b1 2. pentru j = 1 : p 1 j 1. qj+1 = i=1 ij qi + bj+1 unde scalarii ij , i = 1 : j trebuie s asigure ortogonalitatea vectorului qj+1 la qk , k = 1 : j. a bT b2 j 1 T La fel ca mai sus, 11 = T . Mai general, avnd vedere c qk qj+1 = i=1 ij qk qi + a n a T b1 b1 T qk bj+1 = 0 i c qk qi = 0 pentru k = i avem s a T ij =
T qi bj+1 , T qi qi
i=1:j
1.4. PROBLEME REZOLVATE Algoritmul 1.5 (Gram-Schmidt) Fiind dati vectorii liniar independenti bj , j = 1 : p, algoritmul calculeaz un set de p vectori ortogonali qj , j = 1 : p care a formeaz o baz ortogonal a subspatiului generat de vectorii bj , j = 1 : p. a a a 1. pentru k = 1 : n 1. q1 (k) = b1 (k) 2. pentru j = 1 : p 1 1. j = 0 2. pentru k = 1 : n 1. j = j + qj (k) qj (k) 2. qj+1 (k) = bj+1 (k) 3. pentru i = 1 : j 1. ij = 0 2. pentru k = 1 : n 1. ij = ij + qi (k) bj+1 (k) 3. ij = ij /i 4. pentru k = 1 : n 1. qj+1 (k) = qj+1 (k) + ij qi (k)
13
Observati c algoritmul Gram-Schmidt contine multe operatii vector-vector cum sunt a produsele SAXPY i DOT, implementate profesional la nivelul 1 BLAS. s La curs vom prezenta un algortitm mai bun pentru rezovarea aceleiai probleme. s Problema 4. Fie o matrice A IRmn , un vector b IRn i un vector c IRm , toate s date. Scrieti un algoritm ecient care s calculeze c c + A b. (Daca initial c = 0, atunci a aceasta este o problem de a nmultire matrice-vector c = A b). Solutie. Vom da doi algoritmi: primul bazat pe algoritmul DOT de calcul al produsului scalar a doi vectori (un algortim orientat pe linii) i un al doilea bazat pe SAXPY (un s algoritm orientat pe coloane). Pentru primul algoritm vom partitiona matricea A pe linii i s vom folosi formula
n
aij bj ,
i = 1 : m.
Algoritmul, numit versiunea (i, j) a lui GAXPY, este: Algoritmul 1.6 GAXPY pe linii: Fiind dat o matrice A IRmn i vectorii a s b IRn i c IRm , algoritmul calculeaz c c + A b s a 1. pentru i = 1 : m 1. pentru j = 1 : n 1. ci = ci + aij bj Pentru al doilea algoritm vom partitiona matricea A pe coloane i vom folosi formula s
n
cc+
j=1
A:,j bj .
14
SEMINAR 1. CALCUL MATRICEAL ELEMENTAR Algoritmul 1.7 GAXPY pe coloane: Fiind dat o matrice A IRmn i vectorii a s b IRn i c IRm , algoritmul calculeaz c c + A b s a 1. pentru j = 1 : n 1. pentru i = 1 : m 1. ci = ci + aij bj
Complexitatea celor doi algoritmi este aceeai Nop 2mn dar exist diferente s a ntre ei: primul este recomandat cnd matrica A este memorat pe linii i al doilea cnd matricea A a a s a este memorat pe coloane. a Problema 5. Fie trei matrice A IRmn , B IRnp i C IRmp date, scrieti un s algoritm ecient care s calculeze C C + A B. (Dac initial C = 0, atunci aceasta este a a o problem de a nmultire matrice-matrice C = A B). Solutia. Solutia standard se bazeaz pe formula binecunoscut a a
n
cij cij +
k=1
aik bkj ,
i = 1 : m,
j = 1 : p.
Avnd trei indici (i, j, k) putem scrie 3! = 6 algoritmi esential diferiti. Complexitatea acestor a algoritmi este aceeai Nop 2mnp. Prezentm trei dintre acetia cu scurte comentarii. s a s a) Versiunea (i, j, k) se bazeaz pe partitionarea lui A pe linii i a lui B pe coloane. a s Ultimul ciclu intern calculeaz un produs DOT i ultimele dou cicluri calculeaz o operatie a s a a GAXPY-linie, i.e. C(i, j) C(i, j) + A(i, :) B(:, j) respectiv C(i, :) C(i, :) + A(i, :) B. Algoritmul 1.8 Versiunea (i, j, k) a nmultirii matrice-matrice. Date A IRmn , B IRnp i C IRmp algoritmul calculeaz C C + A B. s a 1. pentru i = 1 : m 1. pentru j = 1 : p 1. pentru k = 1 : n 1. cij = cij + aik bkj b) Versiunea (j, k, i) se bazeaz pe partitionarea lui A i a lui B pe coloane. Ultimul ciclu a s intern calculeaz o SAXPY-coloan i ultimele dou cicluri calculeaz o GAXPY-coloan, a as a a a i.e. C(:, j) C(:, j) + A(:, k) B(k, j), respectiv C(:, j) C(:, j) + A B(:, j). Algoritmul 1.9 Versiunea (j, k, i) a nmultirii matrice-matrice. 1. pentru j = 1 : p 1. pentru k = 1 : n 1. pentru i = 1 : m 1. cij = cij + aik bkj c) Versiunea (k, i, j) se bazeaz pe partitionarea lui A pe coloane i a lui B pe linii. a s Ultimul ciclu calculeaz un produs SAXPY-linie i ultimele dou cicluri calculeaz produsul a s a a OUT a doi vectori, concret C(i, :) C(i, :)+A(i, k)B(k, :), respectiv C C +A(:, k)B(k, : ).
1.4. PROBLEME REZOLVATE Algoritmul 1.10 Versiunea (k, i, j) a nmultirii matrice-matrice. 1. pentru k = 1 : m 1. pentru i = 1 : p 1. pentru j = 1 : n 1. cij = cij + aik bkj
15
Problema 6. Fie L IRnn o matrice inferior triunghiular i U IRnn o matrice as superior triunghiular, ambele date. Scrieti un algoritm ecient care s calculeze A = L U . a a (Problema invers: ind dat A, calculati L i U , este cunoscut ca problema factorizrii a a s a a LU i va tratat la curs). s a Solutia. Pentru a obtine un algoritm ecient trebuie s evitm calculele inutile cum a a sunt nmultirile i adunrile cu zero. Astfel, avem s a
n min(i,j)
A(i, j) =
k=1
L(i, k) U (k, j) =
k=1
i ca s evitam comparatia dintre i i j vom s a s mparti calculul calcularea prtii inferior n a triunghiulare i a celei superior triunghiulare a lui A. Algoritmul este: s Algoritmul 1.11 1. pentru i = 1 : n 1. pentru j = 1 : i 1. aij = 0 2. pentru k = 1 : j 1. aij = aij + lik ukj 2. pentru j = i + 1 : n 1. aij = 0 2. pentru k = 1 : i 1. aij = aij + lik ukj
Nop =
(
i=1 j=1
2j +
j=i+1
2i)
2 3 n , 3
de trei ori mai mic dect a nmultirea matrice-matrice standard. Problema 7. a. Fie matricele U, V IRnn date. Propuneti un algoritm ecient pentru a calcula matricea: X = (In + U (:, 1) V (1, :)) (In + U (:, 2) V (2, :)) (In + U (:, n) V (n, :)). b Scrieti un algoritm ecient care s calculeze determinantul matricei X calculate la punctul a a).
16
Solutia a) Scriem mai ai un algoritm ecient pentru calcularea produsului X nt X (In + uv T ), unde X este o matrice dat iar u, v IRn sunt vectori coloan dati. Evident a a Y = X (In + uv T ) = X + X u v T , astfel c Y (i, j) = X(i, j) + X(i, :) u v(j) = a n X(i, j) + v(j) unde scalarul = X(i, :) u = k=1 X(i, k)u(k) depinde de i dar nu depinde de j. Avem astfel urmtorul algoritm ecient: a Algoritmul 1.12. Fiind dat matricea X IRnn i vectorii coloan u, v IRn , a s a acest algoritm calculeaz X X (In + uv T ). a 1. pentru i = 1 : n 1. = 0 2. pentru k = 1 : n 1. = + xik uk 3. pentru j = 1 : n 1. xij = xij + vj Acum, introducnd numele Xuv pentru procedura de mai sus i apelnd secventa de a s a instructiuni de mai sus prin X = Xuv(X, u, v) putem rezolva problema folosind urmatoarea procedur: a Algoritmul 1.13 1. X = In 2. pentru k = 1 : n 1. X = Xuv(X, U (:, k), V (k, :)) Observati c algoritmul 1.12 necesit O(n2 ) operatii, deci am rezolvat problema a a nmultirii a n matrice cu o complexitate de numai O(n3 ) opi. b) Metoda ecient de a calcula determinantul se bazeaz pe faptul c dac u, v IRn a a a a sunt vectori coloan, atunci det(In + uv T ) = 1 + v T u (demonstrati, spre exemplu folosind a inductia matematic). Aadar, a s
n n n
(1 +
k=1 i=1
17
1.5
Probleme propuse
Problema 1.1 Fie dou matrice A, B Rmnn . Produsul scalar dintre A i B este denit a s n m de =< A, B >= trace(B T A). Demonstrati c = i=1 j=1 aij bij i scrieti un algoritm a s care s calculeze . a Problema 1.2 Fie u, v Rn doi vectori nenuli i e A = In + uv T . Gsiti un algoritm s a ecient care s calculeze norma Frobenius a lui A. a Problema 1.3 Fie A, B, C IRnn trei matrice date i d IRn un vector dat. Scrieti un s algoritm ecient care s calculeze vectorul x = A B C d. a Problema 1.4 Fie A, B IRnn dou matrice date. Scrieti algoritmi ecienti pentru a calcularea A A B, i a B A B folosind ct mai putin spatiu de memorie. Repetati s a problema cnd A i B sunt amndou inferior triunghiulare (superior triunghiulare). a s a a Problema 1.5 Se consider date matricele: H IRnn superior Hessenberg, R Rnn a superior triunghiulara i vectorul b IRn . s a. Demonstrati c matricele X = H R i Y = R H sunt ambele superior Hessenberg. a s b. Scrieti algoritmi ecienti pentru calculul matricelor X si Y ; studiati posibilitatea de a suprascrie H cu X (cu Y ). c. Scrieti algoritmi ecienti pentru a calcula vectorii x = HRb i y = RHb. s Problema 1.6 Fie C IRnn , o matrice simetric dat i A Rnp o matrice oarecare. a as Scrieti un algoritm ecient care s calculeze actualizarea de rang p a lui C, adic C a a C + A AT . Demonstrati c dac initial C este zero, atunci matricea C calculat este a a a simetric i pozitiv semi-denit. as a Problema 1.7 Fie C IRnn o matrice simetric i matricele A, B Rnp . Scrieti un a s algoritm ecient care s calculeze actualizarea de rang 2p a lui C, adic C C + A B T + a a B AT . Problema 1.8 Fie Rnn o matrice inferior triunghiular nesingular. Scrieti un algoritm a a ecient care s calculeze T = LLT i demonstrati c T este o matrice simetric pozitiva s a a denit. a
1.6
Bibliograe
1. B. Jora, B. Dumitrescu, C. Oar, Numerical Methods, UPB, Bucureti, 1995. a s 2. G.W. Stewart, Introduction to matrix computation, Academic Press, 1973. 3. G. Golub, Ch. Van Loan, Matrix Computations, a treia editie, John Hopkins University Press, 1998. 4. G.W. Stewart, Matrix Algorithms, vol.1: Basic Decompositions, SIAM, 1999. 5. G.W. Stewart, Matrix Algorithms, vol.2: Eigensystems, SIAM, 2001. 6. B. Dumitrescu, C. Popeea, B. Jora, Metode de calcul numeric matriceal. Algoritmi fundamentali, ALL, Bucureti, 1998. s
18
1.7
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
Anexa B
function [ sigma ] = suma1(alfa) %------------------------------------------------------------------------% Algoritmul 1.1 % Functia calculeaza suma a n numere reale stocate in vectorul alfa % numerele sunt insumate in ordine normala de la alfa(1) pana la alfa(n) % Apelul: [ sigma ] = suma1(alfa) % % Buta Valentin, aprilie, 2006 %------------------------------------------------------------------------n=length(alfa); m=min(size(alfa)); if m=1 error(Datele de intrare nu sunt corecte) end sigma=0; for i=1:n sigma=sigma+alfa(i); end
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
function [ sigma ] = suma2(alfa) %------------------------------------------------------------------------% Algoritmul 1.2 % Functia calculeaza suma a n numere reale stocate in vectorul alfa % numerele sunt insumate in ordine inversa de la alfa(n) pana la alfa(1) % Apelul: [ sigma ] = suma2(alfa) % % Buta Valentin, aprilie, 2006 %------------------------------------------------------------------------n=length(alfa); m=min(size(alfa)); if m=1 error(Datele de intrare nu sunt corecte) end sigma=0; for i=n:-1:1 sigma=sigma+alfa(i); end
1: 2:
function [ p ] = produs(alfa)
1.7. ANEXA B
3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
19
%------------------------------------------------------------------------% Algoritmul 1.3 % Functia calculeaza produsul a n numere reale stocate in vectorul alfa % numerele sunt inmultite in ordine normala de la alfa(1) pana la alfa(n) % Apelul: [ p ] = produs(alfa) % % Buta Valentin, aprilie, 2006 %------------------------------------------------------------------------n=length(alfa); m=min(size(alfa)); if m=1 error(Datele de intrare nu sunt corecte) end p=1; for i=1:n p=p*alfa(i); end
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
function [ v1,vi,vF ]=norme(U) %------------------------------------------------------------------------% Algoritmul 1.4 % Functia calculeaza norma unu, norma infinit si norma Frobenius a unei % matrice superior triunghiulara U. Norma unu este notata cu v1, norma % infinit cu vi iar norma Frobenius cu vF. % Apelul: [ v1,vi,vF ] = norme(U) % % Buta Valentin, aprilie, 2006 %------------------------------------------------------------------------[ n,m ]=size(U); if n=m error(Matricea nu este patratica!); end for i=2:n-1 for j=1:i-1 if U(i,j)=0 error (Matricea nu este superior triunghiulara); end end end v1=0; for j=1:n sigma=0; for i=1:j sigma =sigma + abs(U(i,j)); end if v1<sigma v1=sigma; end end
20
32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48:
vi=0; for i=1:n sigma=0; for j=i:n sigma =sigma + abs(U(i,j)); end if vi < sigma vi = sigma; end end vF=0; for i=1:n for j=i:n vF=vF + U(i,j)*U(i,j); end end vF=sqrt(vF);
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
function [ Q ]=gramschmidt(B) %------------------------------------------------------------------------% Algoritmul 1.5 % Functia calculeaza p vectori ortogonali care genereaza acelasi subspatiu % ca p vectori liniar independenti dati. % Vectorii dati sunt memorati in coloanele matricei B, iar vectorii % calculati sunt memorati in coloanele matricei Q. % Algoritmul este cunoscut sub numele de Algoritmul Gram-Schmidt % Apelul: [ Q ]=gramschmidt(B) % % Buta Valentin, aprilie, 2006 %------------------------------------------------------------------------[ n,p ]=size(B); for k=1:n Q(k,1)=B(k,1); end for j=1:p-1 beta(j)=0; for k=1:n beta(j)=beta(j)+Q(k,j)*Q(k,j); Q(k,j+1)=B(k,j+1); end for i=1:j alfa(i,j)=0; for k=1:n alfa(i,j)=alfa(i,j)+Q(k,i)*B(k,j+1); end alfa(i,j)=-alfa(i,j)/beta(i); for k=1:n Q(k,j+1)=Q(k,j+1)+alfa(i,j)*Q(k,i);
1.7. ANEXA B
33: 34: 35:
21
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
function [ c ]=GAXPY1(A,b,c) %------------------------------------------------------------------------% Algoritmul 1.6 % Functia actualizeaza vectorul (coloana) c cu produsul unei matrice % A cu un vector (coloana) b. Algoritmul este cunoscut sub numele de GAXPY % pe linii. % Apelul: [ c ]=GAXPY1(A,b) % % Buta Valentin, aprilie, 2006 %------------------------------------------------------------------------[ m,n ]=size(A); [ mb,nc ]=size(b); if mb=1 error(b nu este vector coloana); end if nc=n error(A si b nu pot fi inmultite); end [ mc,nc ]=size(c); if mc=1 error(c nu este vector coloana); end for i=1:m for j=1:n c(i)=c(i)+A(i,j)*b(j); end end
function [ c ]=GAXPY2(A,b,c) %------------------------------------------------------------------------% Algoritmul 1.7 % Functia actualizeaza vectorul (coloana) c cu produsul unei matrice % A cu un vector (coloana) b. Algoritmul este cunoscut sub numele de GAXPY % pe coloane. % Apelul: [ c ]=GAXPY2(A,b) % % Buta Valentin, aprilie, 2006 %------------------------------------------------------------------------[ m,n ]=size(A); [ mb,nc ]=size(b);
22
15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
if mb=1 error(b nu este vector coloana); end if nc=n error(A si b nu pot fi inmultite); end [ mc,nc ]=size(c); if mc=1 error(c nu este vector coloana); end for j=1:n for i=1:m c(i)=c(i)+A(i,j)*b(j); end end end
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
function [ C ]=MxMijk(A,B) %------------------------------------------------------------------------% Algoritmul 1.8 % Functia calculeaza matricea C definita ca produsul a doua % matrice A si B. Algoritmul se bazeaza pe partitionarea lui A pe linii, % si a lui B pe coloane. % Apelul: [ C ]=MxMijk(A,B) % % Buta Valentin, aprilie, 2006 %------------------------------------------------------------------------[ m,n ]=size(A); [ x,p ]=size(B); if n=x error(Matricele nu pot fi inmultite!) end for i=1:m for j=1:p C(i,j)=0; end end for i=1:m for j=1:p for k=1:n C(i,j)=C(i,j)+A(i,k)*B(k,j); end end end end
1.7. ANEXA B
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
23
function [ C ]=MxMjki(A,B) %------------------------------------------------------------------------% Algoritmul 1.9 % Functia calculeaza matricea C definita ca produsul a doua % matrice A si B. Algoritmul se bazeaza pe partitionarea lui A si B pe % coloane. % Apelul: [ C ]=MxMjki(A,B) % % Buta Valentin, aprilie, 2006 %------------------------------------------------------------------------[ m,n ]=size(A); [ x,p ]=size(B); if n=x error(Matricele nu pot fi inmultite!) end for i=1:m for j=1:p C(i,j)=0; end end for j=1:p for k=1:n for i=1:m C(i,j)=C(i,j)+A(i,k)*B(k,j); end end end
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
function [ C ]=MxMkij(A,B) %------------------------------------------------------------------------% Algoritmul 1.10 % Functia calculeaza matricea C definita ca produsul a doua % matrice A si B. Algoritmul se bazeaza pe partitionarea lui A pe coloane % si a lui B pe linii. % Apelul: [ C ]=MxMkij(A,B) % % Buta Valentin, aprilie, 2006 %------------------------------------------------------------------------[ m,n ]=size(A); [ x,p ]=size(B); if n=x error(Matricele nu pot fi inmultite!) end for i=1:m for j=1:p C(i,j)=0;
24
21: 22: 23: 24: 25: 26: 27: 28: 29:
end end for k=1:n for i=1:m for j=1:p C(i,j)=C(i,j)+A(i,k)*B(k,j); end end end
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
function [ A ]=inmultire LU(L,U) %------------------------------------------------------------------------% Algoritmul 1.11 % Functia calculeaza eficient produsul a doua matrice patratice L si U, % prima fiind inferior triunghiulara in timp ce a doua este superior % triunghiulara. Rezultatul este memorat in matricea A. % Apelul: [ A ]=inmultire LU(L,U) % % Buta Valentin, aprilie, 2006 %------------------------------------------------------------------------[ n,x ]=size(L); [ m,y ]=size(U); if n=x error(Matricea L nu este patratica); end if m=y error(Matricea U nu este patratica); end if n=m error(Matricele nu pot fi inmultite!) end for i=1:n for j=1:i A(i,j)=0; for k=1:j A(i,j)=A(i,j)+L(i,k)*U(k,j); end end for j=i+1:n A(i,j)=0; for k=1:i A(i,j)=A(i,j)+L(i,k)*U(k,j); end end end
1.7. ANEXA B
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
25
function [ X ]=Xuv(X,u,v) %------------------------------------------------------------------------% Algoritmul 1.12 % Algoritmul calculeaza eficient produsul a doua matrice patratice una % oarecate (X) in timp ce cea de a doua are o forma particulara (In+u*v) % unde u si v sunt doi vectori (primul de tip coloana iar al doilea de tip % linie). Algoritmul suprascrie rezultatul in matricea X. % Apelul: [ X ]=Xuv(X,u,v) % % Buta Valentin, aprilie, 2006 %------------------------------------------------------------------------[ n,m ]=size(X); if n=m error(Matricea X nu este patratica); end for i=1:n sigma=0; for k=1:n sigma=sigma+X(i,k)*u(k); end for j=1:n X(i,j)=X(i,j)+sigma*v(j); end end
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
function [ X ]=prodUV(U,V) %------------------------------------------------------------------------% Algoritmul 1.13 % Algoritmul calculeaza eficient produsul a n matrice de forma % (In+U(:,i)*V(i,:)), unde i=1:n, folosind procedura XUV % Apelul: [ X ]=doi(U,V) % % Buta Valentin, aprilie, 2006 %------------------------------------------------------------------------[ n,x ]=size(U); if n=x error(Matricea U nu este patratica); end [ m,y ]=size(V); if m=y error(Matricea V nu este patratica); end for i=1:n for j=1:n X(i,j)=0 end
26
24: 25: 26: 27: 28:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
function [ detX ]=determinant(U,V) %------------------------------------------------------------------------% Algoritmul 1.14 % Functia calculeaza determinantul matricei X egala cu produsul a n elementi % de tipul In+U(:,k)V(k,:). Algoritmul se bazeaza pe faptul ca datorita formei % matricei X determinantul putea fi calculat ca produsul a n factori de % tipul 1+V(k,:)*U(:,k) unde k=1:n.% % Apelul: [ detX ]=determinant(V,U) % % Buta Valentin, aprilie, 2006 %------------------------------------------------------------------------[ n,x ]=size(U); [ m,y ]=size(V); if n=x error(Matricea U nu este patratica); end if m=y error(Matricea V nu este patratica); end detX=1; for k=1:n nu=1; for i=1:n nu=nu+V(k,i)*U(i,k); end detX=detX*nu; end