Teza De Licenta - Metode Numerice

  • Uploaded by: Dascal Andrian
  • 0
  • 0
  • January 2021
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Teza De Licenta - Metode Numerice as PDF for free.

More details

  • Words: 32,180
  • Pages: 124
Loading documents preview...
MINISTERUL EDUCAȚIEI AL REPUBLICII MOLDOVA UNIVERSITATEA DE STAT DIN TIRASPOL FACULTATEA FIZICĂ, MATEMATICĂ ȘI TEHNOLOGII INFORMAȚIONALE CATEDRA ALGEBRĂ, GEOMETRIE ȘI TOPOLOGIE

Domeniul general de studiu: Științe ale Educației Specialitatea: Matematică și informatică

TEZĂ DE LICENȚĂ

Tema:

APLICAREA METODELOR NUMERICE LA REZOLVAREA SISTEMELOR DE ECUAȚII LINIARE

Autor: studentul ciclului I, Andrian Dascal Conducător științific: Aliona Gurdiș, dr. conf. univ. Andrei Braicov, dr. conf. univ.

Chișinău – 2016

C U P R I N S: INTRODUCERE

pag. 3

Capitolul I: ASPECTE METODICE PRIVIND PREDAREA METODELOR NUMERICE 1.1 Introducere

6

1.2 Metodica elaborării programelor

8

1.3 Creativitatea. Cunoaşterea şi dezvoltarea ei

10

1.4 Asigurarea caracterului interdisciplinar

13

1.5 Obiectivele instruirii disciplinei informatica

15

Capitolul II: METODE DE REZOLVARE A SISTEMELOR DE ECUAȚII LINIARE 2.1 Noțiuni fundamentale

19

2.2 Metode exacte directe 2.2.1 Metoda matriceală

25

2.2.2 Metoda lui Cramer

30

2.2.3 Metoda lui Gauss clasică

37

2.2.4 Factorizarea LU

41

2.2.5 Factorizarea Cholesky

46

2.3 Metode exacte indirecte 2.3.1 Metoda lui Jacobi

48

2.3.2 Metoda Gauss-Seidel

50

2.3.3 Metoda relaxării

54

Capitolul III: APLICAȚII UTILIZÎND LIMBAJUL PASCAL ȘI BORLAND DELPHI 7.0 3.1 Metode exacte directe (Pascal)

56

3.2 Metode exacte indirecte (Pascal)

71

3.3 Aplicații utilizînd softul Borland Delphi 7.0

73

CONCLUZII

74

BIBLIOGRAFIE

76

ANEXE

78-122 2

Introducere Analiza numerică are o istorie lungă și bogată: Arhimede, Newton, Gauss, etc. avînd contribuții semnificative în acest domeniu. Calculul numeric reprezintă din cele mai vechi timpuri o metodă de lucru importantă în matematică. Necesitatea aplicării în practică a rezultatelor teoretice obţinute la un moment dat a arătat că de multe ori metodele numerice sunt singurele care pot scoate din impas o metodă care teoretic este calculatorie, dar posibilitatea de a ajunge la un rezultat exact este imposibilă. Metodele numerice moderne sunt caracterizate de sinergia dintre calculatoarele electronice programabile, analiza matematică, precum și opurtunitatea și necesitatea de a rezolva probleme complexe din diverse domenii, cum ar fi spre exemplu: inginerie, medicină, economie, științe fizico-matematice etc. Creșterea utilizării metodelor numerice a fost cauzată nu numai de creșterea performanțelor calculatoarelor, dar și de îmbunătățirea algoritmilor. Metodele numerice reprezintă tehnici prin care problemele matematice sunt reformulate astfel încît să fie rezolvate numai prin operaţii aritmetice. Prin trecerea de la infinit la finit, diferenţial la algebric, neliniar la liniar ș.a.m.d. Problemele complicate sunt înlocuite de probleme mai simple care au aceeaşi sau “aproape” aceeaşi soluţie. Astfel soluţiile obţinute prin aplicarea metodelor numerice reprezintă doar aproximaţii ale soluţiilor problemelor originale, şi deci implică careva mici erori. Metodele numerice reprezintă în prezent un domeniu destul de complex, fiind un domeniu atît teoretic, cît și practic. Necesitatea implementării unor algoritmi care conduc la rezolvarea sistemelor de ecuaţii liniare inclusiv la inversări de matrice au arătat că este mai util să se folosească metodele numerice chiar şi atunci când există soluţii exacte furnizate de teorie. Se pot inversa matrici destul de mari, în aplicaţiile curente fiind mai utilă folosirea metodelor numerice şi asta din două motive importante: 1) implementarea unui algoritm numeric cere un efort de programare incomparabil, mai mic decât construirea unei aplicaţii în care sunt listate metodele standard de rezolvare exactă. Un algoritm numeric se reduce de cele mai multe ori la un efort de programare. Este adevărat că există algoritmi de calcul numeric care necesită cunoştinţe mai aprofundate, dar există un corp destul de important de metode numerice foarte uşor de programat. 2) multe tehnici matematice sunt mai util de programat prin calcule aproximative decât prin soluţii exacte. În memoria unui calculator, oricum valorile tuturor variabilelor sunt reţinute prin aproximaţii ale lor, iar algoritmii pot produce aproximaţii comparabile cu cele ale posibilităţilor calculatorului, moment din care nu mai prezintă importanţă metoda folosită. În plus, unele din metodele exacte pot degenera în memoria unui calculator în situaţii care devin imposibil de stăpânit. 3

Este cunoscută situaţia în care încercând o soluţie exactă pentru un sistem de ecuaţii cu patru sau cinci ecuaţii, metoda formulelor lui Cramer dă numere care depăşesc orice posibilitate de reprezentare în memorie. Capitolele de algebră liniară sunt considerate de profesori şi în general de elevi, ca unele mai uşor de însuşit şi care nu crează probleme deosebite în aplicaţii. De fapt algebra liniară este mai uşor de însuşit din cauză că noţiunile care trebuie însuşite par la prima vedere destul de simple şi pentru că are o anumită unitate de conţinut şi de idei matematice de la capitol la capitol, ceea ce face ca trecerile de la o noţiune la alta să se facă mai lin. Noile noţiuni fiind de obicei construite pe baza celor anterioare mai bine ca la alte capitole, dar nu de puţine ori se constată că multe noţiuni sunt reţinute mecanic. Elevii se bazează mult pe regulile mnemonice (de memorie) pe care profesorii le oferă spre uşurarea calculelor şi care bineînţeles că sunt foarte utile atâta timp cât nu îi împiedică pe elevi să-şi formeze pe cât posibil şi imagini intuitive ale celor învăţate. Metodele numerice devin la acest capitol utile din două puncte de vedere: - ca metode în sine, de implementat pe calculator, care aşa cum am spus sunt foarte indicate pentru elevii care peste câţiva ani vor lucra efectiv pe calculator; - ca posibilitate de a oferi o imagine cât de cât intuitivă a ceea ce se întâmplă în interiorul unui algoritm în timp ce acesta lucrează pentru o problemă destul de banală cum ar fi inversarea unei matrici sau rezolvarea unui sistem liniar. Acest lucru este deosebit de important având în vedere că deseori suntem tentaţi cu toţii, nu numai elevii, să reţinem un algoritm aşa cum a fost dat fără a intra în prea multe detalii să le zicem “intime” ale metodei. Scopul lucrării: Lucrarea de faţă îşi propune să prezinte câteva modalităţi de îmbunătăţire a predării unor metode de calcul matriceal insistând pe aspectele metodice, dar și să contribuie la sporirea interesului viitorilor informaticeni, matematiceni... în formarea unei gîndiri algoritmice și logico-matematice. Prin problematica abordată, lucrarea de față reprezintă modul de aplicare a metodelor numerice la rezolvarea sistemelor de ecuații liniare. Elaborarea programelor într-un limbaj de programare bine cunoscut ( Pascal ), care implementează metodele de rezolvare a sistemelor de ecuații liniare și elaborarea unor aplicații în mediul Borland Delphi 7.0, conferă un studiu mai complex lucrării date. Structura lucrării: Teza de licență “Aplicarea metodelor numerice la rezolvarea sistemelor de ecuații liniare”, este constituită astfel: Introducere; Capitolul I – Aspecte metodice privind predarea metodelor numerice; Capitolul II – Metode de rezolvare a sistemelor de ecuații liniare; Capitolul III – Aplicații utilizînd limbajul Pascal și Borland Delphi 7.0; Concluzii; Bibliografie și Anexe.

4

Capitolul I conține cinci părți: Introducere; Metodica elaborării programelor (Etapele necesare rezolvării unei probleme cu calculatorul; Cerinţe metodologice necesare realizării programelor informatice educaţionale; Metodica realizării programelor); Dezvoltarea creativității prin informatică; Asigurarea caracterului interdisciplinar; Obiectivele instruirii disciplinei informatica. Capitolul II conține trei părți: Noțiuni fundamentale; Metode exacte directe (metoda matriceală, metoda lui Cramer, metoda lui Gauss, Factorizarea LU, Factorizarea Cholesky) și Metode exacte indirecte (metoda Gauss-Seidel, metoda lui Jacobi, metoda relaxării). Metodele sunt însoțite de algoritmi de rezolvare și de 2 – 3 exemple concrete rezolvate conform fiecărei metode aparte. Capitolul III conține trei părți: Metode directe (calculare determinant, metoda lui Cramer, metoda lui Gauss, Factorizarea LU, Factorizarea QR); Metode indirecte (metoda Gauss-Seidel, metoda lui Jacobi, metoda relaxării) și Aplicații utilizînd softul Embarcadero Delphi 7.0 (metoda Gauss, metoda Cramer, factorizarea LU, etc.). Capitolul dat este dedicat elaborării programelor în Pascal, Aplicațiile în mediul Delphi 7.0, sunt prezentate în anexe (Anexele 3 – 5) La finele lucrării sunt prezentate Concluziile și Lista bibliografică pentru fiecare capitol aparte. În Anexe sunt prezentate pe scurt contribuțiile unor personalități marcante care au fost reamintiți în această lucrare (Anexa 1), rezultatele pentru programele Pascal (Anexa 2), aplicații în mediul Borland Delphi 7.0 (Anexa 3), rezultatele finale în urma execuției aplicațiilor în Embarcadero Delphi 7.0 (Anexa 4) și Unit-ul UMnsistem care permite rezolvarea sistemelor de ecuații liniare liniare prin metode numerice, utilizînd mediul Embarcadero Delphi 7.0 (Anexa 5) Lucrarea dată este destinată elevilor, studenților și tuturor celor interesați de programare sau algebră liniară, tuturor celor ce doresc să devină informaticeni și matematiceni cu inițiativă, prosperi și cu realizării frumoase în domeniu.

5

Capitolul I: ASPECTE METODICE PRIVIND PREDAREA METODELOR NUMERICE DE CALCUL MATRICIAL

1.1 Introducere Arta predării este un meşteşug cu nenumărate artificii. Fiecare profesor ar trebui să ţină cont de câteva "reguli de aur":  calea cea mai bună de a învăţa ceva este de a descoperi singur;  pune-te în locul elevilor;  ghiceşte dificultăţile lor;  transmite-le nu doar informaţii ci şi obişnuinţa unei munci metodice;  fă-i să "ghicească" dar şi să demonstreze;  nu dezvălui dintr-o dată tot ci determină-i să descopere singuri cât mai mult posibil. Ca şi alte discipline, informatica are o contribuţie mare la aspectul formativ, stimulând subiectul să participe la observaţie, comparaţie, clasificare, inducţie, deducţie, algoritmizare, obişnuinţa de a nu gândi prin fragmente şi înţelegerea faptului că orice fragment este parte dintr-un întreg. Formarea fiecărei noţiuni necesită parcurgerea etapelor de elaborare, motivaţie, formarea propriu-zisă a noţiunii şi de consolidare prin aplicarea noţiunii respective. O noţiune poate fi considerată asimilată dacă ea devine şi instrument de dobândire a altor cunoştinţe şi dacă elevii pot opera cu această noţiune în situaţii noi. Este foarte important ca în mintea elevilor să existe o ordonare a noţiunilor, o corelare a acestora, o motivaţie a învăţării acestora (pentru că numai pe cunoştinţe bine asimilate se pot aşeza cunoştinţe noi). De asemenea, ei trebuie să înţeleagă faptul că toate noţiunile noi introduse îşi au locul lor precis în realităţi fizice. Pentru dezvoltarea gândirii logice la elevi, este necesar ca ei:  să-şi însuşească cât mai bine cunoştinţele teoretice şi practice prevăzute în programă;  să opereze fără greutate cu conceptele asimilate în vederea unor noi descoperiri;  să stabilească algoritmi de rezolvare a diferitelor tipuri de probleme;  să aplice algoritmul corect în cazul unei probleme noi; 6

 să transpună algoritmul în limbajul de programare studiat;  să poată găsi cea mai rapidă şi cea mai potrivită metodă de rezolvare a unei probleme sau a unei situaţii date. Când elevilor li se prezintă diferite metode de calcul numeric matriceal, ei sunt deja familiarizaţi cu noţiunile de matrice, determinant, inversă şi chiar cu cîteva proprietăţi ale acestora. Procedurile de triangularizare şi factorizare sunt studiate în scopul aplicării lor în rezolvarea sistemelor de ecuaţii liniare, calculul determinanţilor şi inversarea matricelor. Calculatorul se poate folosi, în general, ca auxiliar al procesului de învăţământ, la toate disciplinele şcolare care solicită tehnica de calcul sau de reprezentare. Învăţarea cu calculatorul are un demers activ, sprijinit pe caracterul interactiv al dialogului om-maşină. Calculatorul permite o mai bună intuire a fenomenului studiat, pe baza repetării acestuia până la înţelegerea deplină. Calculatorul poate fi folosit pentru simularea unor experienţe dificile sau imposibil de realizat în laboratoarele clasice. Spre exemplu, există programe care simulează mişcarea corpurilor în spaţiu, pe baza legii atracţiei universale, programe pentru studiul legilor dinamicii, a legilor lui Kepler, a legilor frecării, a mişcării browniene, a mişcării electronilor etc. În astfel de situaţii, folosirea graficii permite vizualizarea fenomenelor fizice şi observarea acestora în mişcare. Folosirea calculatorului şi a tehnicii de animaţie este de mare efect pedagogic în studiul transformărilor, al deplasărilor, în studiul locurilor geomerice şi al secţiunii corpurilor geometrice. Necesitatea realizării algoritmului şi programului de rezolvare a problemei studiate solicită cunoaşterea aproape perfectă a teoriei. Conceptul de învăţare şi aplicare capătă, în acest context, o noua calitate – cu accent pe activitatea formativă, participativă şi anticipativă a elevului. Folosirea calculatorului permite o dilatare a sferei de cuprindere a fenomenului studiat, şi în acelaşi timp, o comprimare a timpului folosit pentru studiu. Informatica şi calculatorul dezvoltă spiritul algoritmic, programatic, operaţional şi organizatoric, rigoare în raţionament şi exprimare precisă, caracterul intensiv al muncii şi spiritul aplicativ. Calculatorul ca mijloc de învăţământ, permite o nouă formă de prezentare a lecţiilor, ilustrarea lor practică şi integrarea cu cercetarea. Programarea este dispunerea cronologică a unor mișcări, operații, acțiuni sau activități astfel încât în finalul perioadei să se realizeze o stare posibilă a unui sistem. Programarea este cunoscută ca activitate umană dar semnalmente pot exista forme de programare naturale, fără intervenția omului cum sunt dispunerile proceselor genetice sau comportamentele dirijate instinctual la animale. Programarea informatică este o activitate de elaborare a produselor program,

programelor (software) necesare activităților realizate cu ajutorul calculatorului.

Programarea

informatică

conține

următoarele

subactivități:

specificarea,

proiectarea,

implementarea, documentarea și întreținerea produsului program. [1] 7

1.2 Metodica elaborării programelor 1.2.1 Etapele necesare rezolvării unei probleme cu calculatorul În rezolvarea unei probleme cu calculatorul este necesară parcurgerea următoarelor etape:  Enunţarea problemei, evidenţiind ceea ce se dă şi ceea ce se cere.  Analizarea problemei cu scopul de a decide dacă este rezolvabilă cu calculatorulul. În această etapă se studiază suficienţa datelor, alegerea sau găsirea unei metode eficiente pentru obţinerea soluţiei, alegerea unui limbaj de programare convenabil.  Elaborarea unui algoritm de rezolvare a problemei, a cărui structură trebuie să fie în strânsă legatură cu modul de funcţionare a calculatorului.  Scrierea programului de rezolvare a problemei în limbajul de programare ales. Programul prezintă descrierea algoritmului într-un limbaj de programare. El constă dintr-o succesiune de instrucţiuni care “indică“ calculatorului ce operaţii trebuie să realizeze, în ce ordine şi asupra căror date.  Testarea şi verificarea programului în vederea înlăturării eventualelor erori de sintaxă sau la execuţie. 1.2.2 Cerinţe metodologice necesare realizării programelor informatice educaţionale Pentru realizarea unui program bun trebuie respectate următoarele cerinţe obligatorii:  Orice program bun trebuie bine fundamentat teoretic şi pedagogic, să aibă un titlu care să semnifice semantic conţinutul său şi să fie uşor manevrabil în procesul de învăţare sau de predare.  Să se indice disciplina căreia îi aparţine programul, instituţia, autorul şi data realizării şi validării sale ca program didactic.  Realizarea unui program bun este, în general, rodul unei munci de echipă: profesori, informaticieni, ingineri, psihologi, pedagogi, sociologi etc. Nu este lipsit de importanţă dacă la realizarea programului participă şi elevi, deoarece lor li se adresează acest program.  Programul trebuie realizat în ideea unei interfeţe prietenoase, care să solicite atenţia şi concentrarea într-o ambianţă optimistă, de mobilizare la lucru. Pe cât posibil este mai bine ca programul să aibă un puternic caracter interactiv, conversaţional, să permită funcţia de “help” a calculatorului, atunci când este cazul şi să realizeze corect aprecierea prin calificative a celui ce învaţă.

8

 Cuprinsul unei teme poate începe cu o pagină de opţiuni (meniu) în care să fie date: instrucţiuni de utilizare a programului, comenzi necesare în exploatarea programului, posibilitatea întreruperii şi realizării sale în timp, date de intrare şi funcţii utilizate, precum şi posibilitatea revenirii în pagina de opţiuni.  Organizarea prezentării noţiunilor nu trebuie să obosească pe utilizator. Pentru aceasta se folosesc cu succes: sunetul, imaginea, culoarea şi animaţia. 1.2.3 Metodica realizării programelor Noţiunea de date semnifică totalitatea valorilor numerice care pot participa la execuţia unui program. Există date de intrare, date de ieşire şi date de lucru.În calculator datele sunt memorate codificat, în spaţii de memorie numite locaţii. Variabila este o cantitate care poate lua mai multe valori pe parcursul execuţiei unui program şi căreia îi este ataşat un nume simbolic. Unei variabile simple îi este ataşată o singură locaţie de memorie. Numele unei variabile poate fi format din mai multe litere şi cifre primul caracter fiind obligatoriu o literă. Constantele sunt valori fixe care nu se modifică pe parcursul execuţiei unui program. Cu ajutorul variabilelor şi al constantelor se pot alcătui expresii aritmetice, folosind operaţii de adunare, scădere, înmulţire, împărţire, ridicare la putere etc. De asemenea se pot alcătui şi expresii logice, acestea conţinând expresii aritmetice, constante şi variabile logice, operatori logici. Prin operaţia de citire, datele sunt transferate de pe mediul extern în locaţiile rezervate de memorie prin intermediul dispozitivelor periferice de intrare: tastatura, unitatea de floppy disk, scanner-ul. Prin operaţia de scriere datele (rezultate) sunt preluate din locaţiile de memorie şi afişate pe mediul extern prin intermediul dispozitivelor periferice de ieşire: monitorul (display-ul), imprimanta, unitatea de floppy disk. Trebuie postulată ideea că în munca cu elevii subiectele care solicită alcătuirea de programe trebuie mai întâi discutate cu aceştia, stabilindu-se, pe cale orală, demersurile necesare realizării acestora. În acest mod, elevii se vor obişnui să aprofundeze subiectul cercetat, să gândească algoritmul problemei şi să-şi elaboreze prin studiu propriu programul pentru calculator. Înainte de a trece la elaborarea programului, elevii trebuie să cunoască formulele matematice necesare rezolvării problemei. De asemenea, elevii trebuie să ştie că există mai multe variante de rezolvare a unei probleme cu ajutorul calculatorului şi să fie capabili să găsească varianta optimă, algoritmul cel mai simplu, clar şi concis. Programele corespunzătoare fiecărei metode descrise au fost rulate pe exemplele care se regăsesc şi în prezentarea metodelor numerice de calcul matriceal. La realizarea lor s-a încercat 9

găsirea unor soluţii care să necesite un timp de rezolvare cât mai scurt prin reducerea numărului de operaţii efectuate de calculator şi o ocupare eficientă a memoriei prin folosirea a unui număr cât mai mic de variabile prin realizarea calculelor în locaţii de memorie deja utilizate. [4]

1.3 Creativitatea. Cunoaşterea şi dezvoltarea ei Creativitatea este o capacitate complexă şi fundamentală a personalităţii, care, sprijinind-se pe date sau produse anterioare, în îmbinarea cu investigaţii şi date noi, produce ceva nou, original, de valoare şi eficienţă ştiinţifică şi social-utilă, ca rezultat al influenţelor şi relaţiilor factorilor subiectivi şi obiectivi - adică a posibilităţilor (şi calităţilor) persoanei şi a condiţiilor ambientale, ale mediului socio-cultural. Ea poate fi considerată şi ca aptitudine, dispoziţie a intelectului de a elabora idei, teorii, modele noi, originale. Gândirea este procesul cognitiv cel mai important, fiind apreciat îndeosebi prin creativitate. "Gândirea, ca o capacitate de prim ordin a personalităţii - există ca gândire umană numai prin creativitate" (I. Kant). Activitatea de rezolvare si compunere a problemelor oferă terenul cel mai fertil din domeniul activităţilor matematice pentru cultivarea si educarea creativităţii si a inventivităţii. Progresul omenirii nu este posibil fără activitatea creatoare, teoretică sau practică a oamenilor. Capacitatea de a fi creativ este esenţială pentru supraveţuire. Elementele esenţiale prin care se poate constata existenţa creativităţii sunt: flexibilitatea; noutatea şi originalitatea; fluenţa, senzitivitatea (sensibilitatea senzorială) şi ingeniozitatea. În afară de faptul că este o capacitate şi aptitudine (dispoziţie) a personalităţii, a intelectului este, în acelaşi timp, un produs şi un proces. Este un produs pentru că se dobândeşte ca abilitate de a realiza ceva nou (idee, teorie, model, metodă, tehnologie etc.) prin activitate, prin experienţă, necesitând foarte multă muncă. Edison spunea că m creaţie este nevoie de 99% transpiraţie şi 1% inspiraţie. Este totodată şi un proces, fiindcă necesită evoluţie în timp, dezvoltări şi, uneori, retrageri a factorilor şi elementelor noi, necesită învingerea unor obstacole etc. Дж. Гилфорд considera că „creativitatea” gândirii e legată de 4 particularităţi care domină: 

Originalitatea, lucruri netriviale, necesitatea expunerii ideilor, o tendinţă extrem de puternică spre noutăţi intelectuale. Omul creativ aproape întotdeauna şi pretutindeni având eul său, a găsit o rezolvare distinctă de altele.



Capacitatea de a vedea obiectul prin prisma viziunii noi, depistarea aplicării noi, lărgirea aplicaţiilor funcţionale în practică. 10



Capacitatea de a schimba viziunea asupra obiectului în aşa mod, de a-l vedea „nou”, părţile ascunse de observare.



Сapacitatea de a produce variate idei în situaţii nedeterminate, în particular într-aşa, care nu conţine repere spre aceste idei.

Mai apoi au fost şi alte tentative de a da o definiţie a gîndirii critice, însă ele au adus practic nimic nou sau prea puţin în cele expuse de Дж. Гилфорд. Aşa cum arată publicaţiile de specialitate, gândirea este un fenomen psihic legat de acţiune şi derivat din acţiune. Astfel, răspunzând unor trebuinţe, acţiunea se întâlneşte cu situaţii incerte, când este nevoie de reflectare şi de cercetare a realităţii în vederea reducerii riscului şi a incertului. Gândirea intervine atunci când apar dificultăţi în activităţi, când apar probleme. Problema crează situaţia faţă de care numărul de reacţii de care dispune subiectul se relevă insuficient sau neadecvat. Etimologic, “pro-ballein” înseamnă să ţi se pună în faţă o barieră, un obstacol: prin extensie, ceea ce conţine o dificultate teoretică sau practică a cărei înlăturare este pusă sub semnul întrebării. Deoarece dificultatea se prezintă ca o lacună a cunoaşterii, ea nu constă dintr-o singură întrebare, ci dintr-o necunoscută, astfel încât problema constă într-un sistem de întrebări asupra unei necunoscute. Problemele apar atunci când aşteptările noastre au fost înşelate, când teoriile noastre conduc la dificultăţi, la contradicţii, iar acestea pot surveni înăuntrul unei teorii, între două teorii diferite sau ca urmare a ciocnirii dintre teoriile şi observaţiile noastre. Problema este aceea care ne provoacă să învăţăm, să împingem mai departe cunoaşterea, să experimentăm şi să observăm. Se spune că o întrebare devine problemă atunci când generează o stare psihică de curiozitate, de nedumerire, de uimire sau incertitudine, de nelinişte în faţa unui obstacol ce trebuie învins, a unor dificultăţi teoretice sau practice de depăşit, de rezolvat în faţa noutăţii, a necunoscutului. În adevăratul ei sens, o situaţie-problemă are un caracter de ipoteză, iar rezolvarea ei, în sine, este tocmai drumul conştient străbătut de la elaborarea ipotezei la verificarea şi adaptarea ei. O mare descoperire ştiinţifică sau o mare operă de artă este, desigur, rezultatul unei activităţi de elaborare şi rezolvare de probleme. Soluţia la o problemă îi vine gânditorului în mod frecvent sub forma unei sclipiri de intuiţie, deşi, poate un timp, el a întors problema pe toate feţele. Actele creatoare se bazează pe un volum mare de cunoştinţe însuşite anterior. Orice descoperire presupune un salt inductiv, o combinare a ideilor din sisteme de cunoştinţe diferite, o folosire îndrăzneaţă a analogiilor, presupune un mare volum de deprinderi intelectuale, capacităţi ce nu pot fi dobândite decât prin elaborări şi rezolvări de probleme cât mai variate. Distincţia între creativitate şi inteligenţă (după M. Wallach, N. Kogan) Caracteristicile psihologice ale copiilor ţin de patru grupe : 11

I.

Creativitate puternică - inteligenţă puternică: aceşti copii dau dovadă atât de

autocontrol cât şi de libertate. II. Creativitate puternică - inteligenţă slabă: astfel de copii sânt într-un conflict cu ei înşişi şi cu mediul şcolar. Ei încearcă un sentiment de inferioritate şi de inadaptare. Totuşi, într-un context destins, facultăţile lor cognitive se pot dezvolta liber. III. Creativitate slabă - inteligenţă puternică: asemenea copii au o reuşită şcolară înaltă. Un eşec în acest domeniu le-ar părea catastrofal; ei trebuie să caute permanent şi activ succesul, pentru a evita orice posibilitate de suferinţă. IV. Creativitate slabă - inteligenţă slabă: profund perturbaţi, aceşti copii încearcă diverse manevre defensive, de la o adaptare pozitivă pînă la regresie. Rezolvând un mare număr de probleme în condiţii relativ constante, gândirea ajunge la structuri rigide şi are posibilitatea de a opera numai în cadrul limitat al acestor condiţii. Dacă aplicaţiile se extind la operaţii în condiţii variate, gândirea dobândeşte mai multă supleţe şi capacitate de adaptare. Lărgirea domeniului de aplicabilitate formează capacităţi cum ar fi:  capacitatea de transfer;  capacitatea de a deriva idei noi dintr-o idee principală;  capacitatea de a explica şi interpreta fenomenele noi prin prisma noţiunilor învăţate;  capacitatea de a concretiza ideile şi de a le raporta la cazuri particulare sau generale. Într-un cuvânt se dezvoltă însuşirile fundamentale ale creativităţii, adică flexibilitatea gândirii. Gândirea creatoare este, după cum afirma G. Polya, aceea care crează, elaborează mijloace (procedee, metode) pentru rezolvarea unor tipuri de probleme. Cu cât numărul şi varietatea problemelor la care pot fi aplicate mijloacele nou create sunt mai mari, cu atât creativitatea este mai mare. Gândirea creatoare participă la elaborarea instrumentelor de cunoaştere, a mijloacelor de rezolvare a problemelor teoretice şi practice, în timp ce gândirea productivă se foloseşte de aceste mijloace în funcţionalitatea ei. Când vorbim de creativitate în procesul de învăţare trebuie să ne gândim la crearea propriului sistem de cunoştinţe într-un domeniu. Cultivarea creativităţii presupune lupta cu stereotipurile. Problemele pe care le rezolvă elevii trebuie să fie diverse ca mod de prezentare, dar încadrabile în algoritmi de rezolvare de anumite tipuri. În faţa oricărei probleme, elevul trebuie pus în situaţia de a gândi ca în faţa unei probleme noi şi numai după acest act de gândire (cunoaşterea, eventual recunoaşterea problemei pe baza elementelor esenţiale) se poate trece la încadrarea problemei individuale în categoria sau tipul de probleme căruia îi aparţine. 12

Un rol deosebit de important în activitatea pedagogică o are problema dezvoltării capacităţilor creatoare ale elevilor. Creativitatea gândirii, mişcarea ei liberă se poate dezvolta doar pe baza unor deprinderi corect formate. Predarea şi învăţarea creativă este, în general, neglijată în procesul învăţământului de bază. Cadrele didactice activează în circumstanţe variate, au elevi cu diverse tipuri de inteligenţă şi niveluri de pregătire teoretică, de aceea le revine un rol important în sporirea capacităţii creative a acestora. Pentru a forma la elevi o gândire creatoare, ei trebuie puşi în situaţii variate, mereu noi. În acest scop se folosesc o mulţime de procedee: dezvoltarea şi complementarea treptată a unei probleme cunoscute, rezolvarea problemei prin mai multe procedee (metode) şi alegerea celei mai economicoase,

reformularea problemei prin

introducerea necunoscutei drept

cunoscută.

Important este gradul de independenţă ce se acordă elevilor şi rezolvarea problemei ca o activitate unitară care conduce la gândirea creatoare concentrată. Din ansamblul elementelor sale specifice, informatica operează cu un subset de categorii şi concepte aplicabile cercetării pedagogice. Nu toate laturile pedagogiei pot fi gândite strict cibernetic fără a forţa interpretarea unora dintre ele. Pedagogia cibernetică îşi orientează cercetările spre determinarea modurilor de aplicare a structurii, modelării, algoritmizării şi programării în domeniul instrucţiei şi educaţiei. Un salt calitativ adus în planul instruirii de către pedagogia cibernetică îl constituie – respectându-se cerinţele unei baze de principii psihopedagogice riguros organizate – conştientizarea subiectului, corelarea mai profundă între ce are de învăţat acesta şi cum anume să înveţe. Se poate vorbi din acest moment de o individualizare a actului educaţional, ceea ce reprezintă, în definitiv, problema fundamentală a oricărei tehnologii de instruire. Unealta directă a pedagogiei cibernetice o constituie instruirea programată – ca formă de organizare a procesului de învăţare, în care subiectul se pregăteşte independent, parcurgând într-un ritm propriu şi în mod activ o programă. Programa cuprinde materia de învăţat şi prevede modalităţile explicite de însuşire a ei, organizate într-o formă specifică, urmând cerinţele logicii, psihologiei, pedagogiei şi ciberneticii. [5]

1.4 Asigurarea caracterului interdisciplinar Conceptul de asistare cu calculatorul a procesului de învăţământ constă în utilizarea calculatorului în una sau mai multe din situaţiile următoare:  Predarea unei lecţii, a unui grup de lecţii sau prezentarea unei secvenţe dintr-o lecţie în scopul optimizării procesului argumentării, al evidenţierii mişcării cu ajutorul desenului de 13

animaţie, al obţinerii imediate a unor rezultate sau efecte aşteptate, al accelerării procesului învăţării şi al dezvoltării spiritului aplicativ.  Verificarea cu calculatorul a unei lecţii sau a unor secvenţe din lecţie, a unui capitol, a unei discipline de învăţământ sau chiar a unei programe şcolare – în cazul examenelor.  Învăţarea cu calculatorul – pe baza unor programe informatice educaţionale adecvate, efectuarea unor exerciţii pentru a învăţa anumite operaţii sau pentru a forma anumite deprinderi.  Dezvoltarea şi accelerarea muncii de creaţie folosind informatica şi calculatorul. O mare parte din programele didactice sunt prevăzute cu exerciţii de control, răspunsurile fiind uneori alese dintr-o listă de variante afişate pe display. În cazul unor răspunsuri eronate, cel ce învaţă este dirijat printr-un sistem de help-uri, să reia studiul prin explicaţii mai detaliate ale problemelor. Pentru cei mai mulţi, calculatorul în învăţământ şi educaţie înseamnă însă activitatea individuală a unui elev care asistă şi completează pentru un timp dat activitatea profesorului. Dezvoltarea deosebită în domeniul instruirii asistate de calculator implică utilizarea calculatorului într-o mare varietate de moduri noi, dintre care putem enumera:  procesor de texte pentru pregătirea rapoartelor, proiectelor sau materialelor didactice;  sistem de înmagazinare şi gestiune a datelor;  sistem multimedia pentru prelucrarea de text, imagini, grafice, sunet;  instrument-asistent pentru o gamă largă de activităţi: calcule ştiinţifice, analiza statistică, prelucrare de tabele, proiectare automată etc.;  instrument pentru comunicarea şi informarea la distanţă prin reţeaua mondială Web;  instrument pentru învăţarea la distanţă utilizând noi sisteme de operare şi noi pachete de programe;  sistem pentru conducerea activităţilor experimentale sau pentru simularea unor experienţe şi legi ale naturii foarte greu sau imposibil de reprodus în laboratorul şcolii. Toate acestea sunt argumente care pledează atât pentru predarea despre calculatoare cât şi pentru predarea cu ajutorul calculatorului. Având în vedere progresele realizate atât în ceea ce priveşte construcţia echipamentelor cât şi realizarea de programe, este facilitată introducerea pe scară largă şi eficientă a calculatoarelor în întreaga sferă a proceselor de predare-învăţare. [2]

14

1.5 Obiectivele instruirii disciplinei informatica Literatura pedagogică evidenţiază patru timpi ai tehnicii de elaborare ai unui obiectiv, redaţi în figura următoare: Acţiunea observabilă prin care se va exterioriza comportamentul

+

+

Obiectul

+ +

(conţinutul acţiunii)

Precizează comportamentul dorit a se forma prin învăţare

Condiţiile în care elevul va putea proba formarea comportamentului

+

+ Criteriile după care se vor aprecia performanţele

Precizează modalităţile în care se va proba şi evalua nivelul de formare a comportamentului

Pentru evitarea unor greşeli de formulare a obiectivelor operaţionale trebuie ţinut cont de următoarele:  fiecare obiectiv trebuie să exprime formarea unui comportament care se poate manifesta ca o acţiune unitară;  obiectivele operaţionale să acopere în întregime prevederile programei şcolare;  prin formularea obiectivelor să se evite orice suprapuneri privind conţinutul lor;  formularea obiectivelor să permită înţelegerea fără echivoc de către orice altă persoană care le-ar citi comportamentul dorit a se forma;  în formularea obiectivelor operaţionale ale unei teme să fie respectate obiectivele generale ale disciplinei. Pentru a se descrie cu claritate un comportament, trebuie să se aleagă un verb care să exprime cu claritate o acţiune. În continuare prezint modalităţile în care pot fi formulate obiectivele operaţionale, ţinând cont de tipul specific de activitate ce urmează a fi realizată:  Pentru cunoaştere : a defini, a distinge, a identifica, a cunoaşte, a şti, a aminti, a redescoperi, a căuta.  Pentru înţelegere : a înţelege, a transforma, a ilustra, a diferenţia, a explica, a estima, a extinde. 15

 Pentru aplicare : a aplica, a generaliza, a alege, a dezvolta, a utiliza, a organiza, a clasifica, a transforma.  Pentru analiză : a distinge, a detecta, a identifica, a recunoaşte, a clasifica, a deosebi, a analiza, a compara.  Pentru sinteză : a relata, a produce, a transmite, a modifica, a crea, a asambla, a generaliza, a se documenta, a organiza, a construi.  Pentru evaluare : a argumenta, a evalua, a decide, a propune, a arăta, a considera, a măsura, a aprecia, a valida. Obiectivele generale pentru clasele de liceu, profilul matematică-informatică , cu referinţă la disciplinele de informatică :  stimularea gândirii independente a elevilor;  însuşirea de către elevi a fondului de cunoştinţe teoretice şi formarea deprinderilor practice pentru a utiliza un calculator;  formarea gândirii algoritmice, însuşirea deprinderilor şi tehnicilor necesare practicării programării structurate;  însuşirea programării în limbaje de largă circulaţie, astfel încât absolventul de liceu să poată proiecta, depana şi întreţine produse program;  formarea gândirii logice, care să permită elevului să aprecieze corect situaţiile concrete specifice, cu scopul de a desprinde soluţii optim;  formarea deprinderilor de aplicare corectă a soluţiilor alese. Voi prezenta în continuare cîteva din obiectivele specifice disciplinelor de informatică, sistematizate în conformitate cu programa şcolară şi exprimate prin performanţele comportamentale ale elevului. a) Obiective cognitive  însuşirea limbajului algoritmic specific domeniului informatic;  formarea gândirii algoritmice proprie dialogului om-calculator;  aprofundarea structurilor de control fundamentale şi, pe această bază, deprinderea programării structurate;  însuşirea corectă şi folosirea cu exactitate a principalelor noţiuni, definiţii, concepte, legi, principii, care stau la baza programării structurate;  învăţarea şi utilizarea unor metode de reprezentare a algoritmilor (scheme logice, pseudocod), cu evidenţierea avantajelor şi dezavantajelor fiecărei metode;  utilizarea modularizării în realizarea aplicaţiilor;

16

 exploatarea eficientă a facilităţilor de programare în Turbo Pascal şi C, utilizând permanent programarea structurată - predarea noţiunilor de programare prin structuri, nu prin instrucţiuni;  însuşirea modului de lucru conversaţional;  asimilarea noţiunilor fundamentale, referitoare la structura limbajelor de programare, cu exemplificări din diverse implementări ale limbajelor Turbo Pascal sau C;  proiectarea structurată a aplicaţiilor, cu exemplificări din celelalte discipline şcolare;  posibilitatea de a transfera cunoştinţele dobândite la alte discipline (fizică, matematică, desen tehnic, studiul materialelor, electrotehnică şi electronică aplicată, măsurări electrice şi electronice, etc.) pentru a găsi explicaţia anumitor fenomene sau pentru construirea soluţiilor unor probleme de ordin teoretic sau practic din cadrul disciplinelor de informatică;  formarea capacităţii de a analiza, a înţelege şi a explica, algoritmii pe care se bazează rezolvarea problemelor şi de a le transpune în limbaj verbal, grafic, matematic;  cunoaşterea, memorarea, reproducerea corectă a definiţiilor şi algoritmilor de calcul şi posibilitatea de a transfera cunoştinţele în condiţii schimbate precum şi de a extrapola cunoştinţele la rezolvarea problemelor matematice, fizice sau ale altor domenii de instruire;  formarea deprinderilor de utilizare corectă a tabelelor, standardelor, caracteristicilor, ecuaţiilor şi de a le aplica în rezolvări de probleme, respectiv de a alege soluţii optime, justificând alegerea făcută;  formarea capacităţii de înţelegere, explicare, interpretare corectă a algoritmilor utilizaţi;  asimilarea unor metode şi tehnici de programare, metode menite să optimizeze soluţiile. b) Obiective psihomotorii  deprinderea lucrului practic la calculatoarele I.B.M.;  formarea deprinderilor de a instala şi întreţine sisteme de operare şi aplicaţii utilitare;  formarea deprinderilor de exploatare corectă şi raţională a echipamentelor de calcul, de sesizare a regimurilor anormale de lucru;  însuşirea celor mai uzuale tehnici de depanare, punere la punct şi utilizare a programelor;  formarea deprinderilor de calcul a parametrilor corespunzători unor regimuri impuse;  formarea deprinderilor de execuţie (construcţie) a unor lucrări simple de întreţinere sau reparaţii;  formarea capacităţilor de testare a sistemelor de calcul, pe baza cărora să se poată trage concluzii asupra fiabilităţii şi randamentului, etc.; c) Obiective afective

17

 formarea convingerii că utilizarea echipamentelor de calcul este o condiţie importantă a modernizării proceselor de lucru, cu toate implicaţiile economice şi sociale ce derivă de aici: creşterea productivităţii, a standardului de viaţă etc.;  formarea convingerii că studiul aprofundat, temeinic al acestei discipline, este de largă utilitate, putânduse aplica întro serie de alte domenii;  formarea unei atitudini pozitive faţă de muncă şi faţă de producătorii de bunuri materiale, de grijă şi respect faţă de baza materială a şcolii, a laboratoarelor de informatică;  formarea convingerii că asimilarea şi respectarea regulilor de protecţia muncii este o condiţie “sine qua non” a păstrării integrităţii corporale, a vieţii chiar;  cunoaşterea realizărilor româneşti şi pe plan mondial în ceea ce priveşte construcţia de echipamente de calcul, a preocupărilor, perspectivelor şi a unor personalităţi şi firme de prestigiu din acest domeniu;  formarea unor înclinaţii de angajare voluntară a elevilor în investigarea fenomenelor şi legilor specifice disciplinei, element ce poate furniza satisfacţii, siguranţă în pregătirea viitoarei profesii şi, în final, un ataşament mai accentuat faţă de aceasta. [2]

18

Capitolul II: METODE DE REZOLVARE A SISTEMELOR DE ECUAȚII LINIARE 2.1 Noțiuni fundamentale A. Matrici și determinanți. Generalități. Definiția 1: Fie K unul din corpurile

, . Prin matrice cu n linii și m coloane, cu elemente din K , se înțelege

o aplicație de forma: A : 1, 2,..., n *1, 2,..., m  K :  i, j   aij descrisă uzual cu ajutorul

 a11 a12  a21 a22 tabloului: A    ... ...   an1 an 2

... a1m   ... a2 m  , care conține valorile funcției. ... ...   ... anm 

Vom nota matricea cu M n*m ( K ) mulțimea tuturor matricelor cu n linii și m coloane, cu elemente din K. Definiția 2:

Fie K unul din corpurile

m

 a11 a12  a21 a22 , . Fie matricea pătratică A    ... ...   am1 am 2

i j

m

... a1m   ... a2 m   M m*m ( K ). ... ...   ... amm 

i j

Atunci det A    1 aij det Aij    1 aij det Aij , unde Aij este matricea care se obține din A i 1

j 1

eliminînd linia i și coloana j. Definiția 3:

 a11 a12  a21 a22 Fie matricea pătratică A    ... ...   am1 am 2

... a1m   ... a2 m   M m*m ( K ). ... ...   ... amm  19

a11 Numărul det A 

a12

... a1m

a21 a22 ... a2 m     a1 1 a2  2 ...am  m , unde Sm este mulțimea tuturor ... ... ... ...  Sm am1 am 2 ... amm

permutărilor de grad m se numește determinantul matricei Am*m . Definiția 4: Prin permutare de grad n se înțelege o funcție bijectivă  : 1, 2,..., n  1, 2,..., n. Prin

signatura

   



 i     j  i j

1i  j  n

 : 1, 2,..., n  1, 2,..., n se

permutării

înțelege

numărul:

.

Corolar 1: Oricare ar fi i, k 1, 2,..., m avem:

m

 a  1 j 1

k j

ij

dacă i  k  0, det Akj   , notațiile fiind cele det A, dacă i  k

din definiția 4. Demonstrație: În cazul i = k, afirmația rezultă din remarca anterioara, iar în cazul cînd i  k , relația rezultă dezvoltînd după linia k determinantul cu două linii identice:

a11

a12

...

... a1m ... ...

...

...

... a1m ... ...

ai1

ai 2

...

aim

ai1

ai 2

...

...

...

...

...

...

ai1

ai 2

...

...

... ...

... , rezultat înlocuind în ... ak 1 aim ... ...

a11

a12

...

ak 2 ...

aim

... linia k cu linia i. ... akm ... ...

am1 am 2 ... amm

am1 am 2 ... amm Corolar 2: Fie K unul din corpurile

, .

 a11 a12  a21 a22 Fie matricea pătratică A    ... ...   am1 am 2 Pentru m=2, numărul det A 

a11

a12

a21 a22

... a1m   ... a2 m   M m*m ( K ). ... ...   ... amm   a11a22  a12 a21 se numește determinantul matricei.

20

Pentru

m=3,

numărul

a11

a12

a13

det A  a21

a22

a23 

a31

a32

a33

a11a22 a33  a12 a23a31  a13a21a32 

(a13a22 a31  a11a23a32  a12a21a33 ) se numește determinantul matricei.

Corolar 3: Detreminantul unei matrici pătratice este nul dacă: 

există două linii (sau coloane) identice;



toate elementele unei linii (sau coloane) sunt nule;



elementele a două linii (sau coloane) sun proporționale;



o linie (sau coloană) este o combinație liniară cu celelalte linii (sau coloane);

Corolar 4:

a11 Din definiția 1.3, cazul b rezultă că: a21 a31

a12 a22

a13 a11 a23  a12

a21 a22

a32

a33

a23

a13

a31 a32 , adică putem spune că a33

determinantul unei matrici coincide cu determinantul transpusei. Se poate demonstra că o astfel de relație are loc pentru orice matrice pătratică. Deci dacă A  M m*m  K  , atunci este adevărată egalitatea: det A  det t A sau det A  TA . Corolar 5: Dacă într-o matrice pătratică se schimbă între ele două linii (sau două coloane), atunci se obține o matrice care are determinantul egal cu opusul determinantului matricei inițiale. Definiția 5: O matrice pătratică Am*m ( K ) este inversabilă, dacă putem găsi o matrice Bm*m astfel încât A  B  I m și B  A  I m . O matrice B cu proprietatea dată se numește inversă pentru matricea A. Se notează: A1 - matricea inversa matricii A. Teorema 1: (Invesabilitatea unei matrici pătratice)

 a11 a12  a21 a22 Fie matricea A    ... ...   am1 am 2

... a1m   ... a2 m   M m*m ( K ). ... ...   ... amm 

21

Matricea

A

este

inversabilă

  111 A11  1 2 1   1 A12 1 A   det A  ...  1 1 m A 1m  

dacă

 1 A21 2 2  1 A22 2 1

...

 1

2 m

A2 m

și

... ...

numai

dacă

 1 Am1  m 2  1 Am 2  ,

det A  0

și

inversa

ei

este:

m 1

 ... ...  m m ...  1 Amm 

unde

A* este matricea adjunctă a

matricei A și se obține înlocuind fiecare element al matricii transpuse a lui A cu complementul său algebric. [10] B. Sisteme de ecuații liniare. Generalități. Definiția 6: O ecuație liniară E cu necunoscutele x1 , x2 , x3 , x4 ,..., xm are forma : E : ax1  bx2  cx3  ...  kxm  w , unde a, b, c,..., k , w sunt numere. Numerele a, b, c,..., k se numesc

coeficienții ecuației E, iar w se numește termenul liber al ecuației E. Definiția 7: Ecuație nulă cu necunoscutele x1 , x2 , x3 , x4 ,..., xm este ecuația cu toți coeficienții egali cu zero, inclusiv și termenul liber, având următoarea formă: 0 x1  0 x2  0 x3  ...  0 xm  0 . Definiția 8: Două ecuații E și F sânt identice (egale) dacă au aceleași necunoscute scrise în aceeași ordine, aceiași coeficienți și același termen liber. Notare: E  F . Definiția 9: Fie E : ax1  bx2  cx3  ...  kxm  w este o ecuație liniară cu necunoscutele x1 , x2 , x3 , x4 ,..., xm . O soluție a ecuației E este un ansamblu ordonat x10 , x20 , x30 , x40 ,..., xm0 de m numere cu proprietatea: dacă în E înlocuim x1 prin x10 , x2 prin x20 , . . . , xm prin xm0 atunci vom obține o egalitate adevărată. Definiția 10: Un sistem liniar S de n ecuații cu m necunoscute x1 , x2 , x3 , x4 ,..., xm este un sistem de forma:

 a11 x1  a12 x2  ...  a1m xm  b1 a x  a x  ...  a x  b  21 1 22 2 2m m 2   ....................................... an1 x1  an 2 x2  ...  anm xm  bn

(1.1)

Această scriere a sistemului este numită forma analitică sau forma dezvoltată. Corolar 6: Matricea sistemului S (1.1) o vom nota cu M S , cea transpusă – cu TS și cea extinsă - cu ES .

22

 a11 a12  a a22 M S   21  ... ...   an1 an 2

... a1m   a11   a12 ... a2 m  , TS    ... ... ...    ... anm   a1m

a21 a22 ... a2 m

... an1   a11 a12   ... an 2  a a22 și ES   21  ... ... ... ...    ... anm   an1 an 2

... a1m ... a2 m ... ... ... anm

b1   b2  . ...   bn 

Corolar 7: Liniile matricii transpuse sunt reprezentate prin coloanele matricii. Astfel putem spune că pentru a scrie matricea transpusă, trecem în coloana 1 elementele din linia 1 a matricii sistemului S, în coloana 2 – elementele din linia 2 a matricii sistemului S, ... repetăm așa până ce finisăm liniile matricii sistemului nostru S. [13] C. Soluții, sisteme echivalente Definiția 11: Se numește soluție a sistemului (1.1) grupul (s1 , s2 , s3 ,..., sm ) care este soluție pentru fiecare din ecuațiile sistemului S. Definiția 12: Două sisteme liniare S1 și S2 cu necunoscutele x1 , x2 , x3 , x4 ,..., xm sunt echivalente, dacă sunt ambele incompatibile sau ambele compatibile și au aceleași soluții. Teorema 2: (Reguli de obținere a sistemelor echivalente) Fie S un sistem liniar de n ecuații cu m necunoscute, atunci: 1. Permutînd între ele ecuațiile sistemului S obținem un sistem S1 echivalent cu S; 2. Înlocuind o ecuație E a sistemului S printr-o combinație liniară  E   F   G  ...   M , unde  ,  ,  ,...,  sînt numere oarecare, dar   0 și E, F , G,..., M sînt

ecuații ale

sistemului altele decît E, vom obține un sistem S1 echivalent cu S; 3. Înmulțind sau împărțind o ecuație a sistemului S la un număr nenul, obținem un sistem S1 echivalent cu S; 4. Alegînd două ecuații E, F ale sistemului S și înlocuind E cu ecuația E+F sau E-F, obținem un sistem S1 echivalent cu S; 5. Îndepărtînd din S o ecuație sau mai multe ecuații nule, obținem un sistem S1 echivalent cu S; 6. Suprimînd din sistemul S o ecuație E care este dependentă de celelalte ecuații din S sau numai de o parte din celelalte ecuații, obținem un sistem S1 echivalent cu S. D. Clasificarea sistemelor Definiția 13: (clasificarea sistemelor după soluții) Un sistem liniar S este sau se numește: 

Incompatibil, dacă nu are soluții; 23



Compatibil, dacă are soluții;



Compatibil determinat, dacă are o singură soluție;



Compatibil nedeterminat, dacă are o infinitate de soluții.

Corolar 8: A discuta un sistem liniar înseamnă a stabili dacă ( și cînd) este incompatibil, compatibil, iar în caz de compatibilitate a stabili tipul de compatibilitate. Definiția 14: (clasificarea sistemelor după numărul ecuațiilor și necunoscutelor) Un sistem linear de n ecuații cu m necunoscute este: 

Determinat, dacă numărul ecuațiilor este egal cu numărul necunoscutelor ( și ecuațiile sistemului sînt independente);



Subdeterminat, dacă are mai puține ecuații decît necunoscute ( și ecuațiile sistemului sînt independente);



Supradeterminat, dacă numărul ecuațiilor depășește numărul necunoscutelor ( dar numărul ecuațiilor independente este egal cu numărul necunoscutelor);

Definiția 15: (clasificarea sistemelor în funcție de termenii liberi) Un sistem linear este: 

Omogen, dacă toți termenii lui liberi sînt zero;4



Neomogen, dacă cel puțin un termen liber al său este nenul. [3]

E. Rezolvarea sistemelor de ecuații liniare Rezolvarea sistemelor de ecuaţii algebrice liniare este una din cele mai frecvente aplicaţii care apar în calculul numeric. La rezolvarea acestor sisteme pot fi aplicate metode directe, cît și indirecte (iterative) care ne-ar putea conduce la obținerea unui rezultat. În dependență de gradul de complexitate, se aplică metoda cea mai optimă de rezolvare. Metodele directe permit obţinerea soluţiei exacte a sistemului considerat, făcând abstracţie de erorile de rotunjire, folosind un număr finit de operaţii. Eroarea care se introduce prin rotunjirea calculelor devine destul de largă pentru sisteme unde ordinul n este destul de mare. Aceste metode constau în transformarea sistemului de ecuații liniare într-un sistem triunghiular echivalent, care se rezolvă ușor. Metodele directe permit determinarea soluțiilor sistemului în cazul ideal, când nu avem erori de rotunjire. Numărul operațiilor efectuate este de ordinul n3 . Pentru sisteme cu un număr de ecuații mai mare de 100, metodele directe devin inutilizabile datorită acumulării erorilor de rotunjire care alterează soluția. Metodele iterative se caracterizează prin faptul că soluţia sistemului considerat se obţine ca o limită a unui şir de vectori ce reprezintă soluţia pentru diversele iteraţii efectuate. În cadrul acestor 24

metode se pune problema de alegere a acelei metode care e convenabilă din punct de vedere al vitezei de convergenţă. În cazul în care procedeul converge suficient de rapid procedeul de calcul a sfârşit foarte repede şi se obţine o aproximaţie foarte bună. Unul din avantajele principale ale metodelor iterative este faptul că eroarea de rotunjire poate fi eliminată. Metodele de rezolvare a sistemelor de ecuații liniare studiate în liceu sînt metoda lui Gauss și metoda lui Cramer. Pe lîngă aceste metode mai există și alte metode eficiente care ne permit rezolvarea sistemelor de ecuații liniare, unele dintre aceste metode vor fi prezentate în acest capitol.

2.2 Metode exacte directe de rezolvare a sistemelor de ecuații liniare 2.2.1 Metoda matriceală Ne amintim! 

Se numește minor de ordinal m-1 al elementului ai , j al matricei A de rang m(m>1), determinantul matricei de rang m-1, obținută din matricea A prin extinderea rîndului i si a coloanei j. Vom nota minorul elementului ai , j prin Ai , j , unde i indică rîndul, iar j – coloana la intersecția cărora se află elemental ai , j* .



Regula de consistență: 1. Există un caz elementar: matricea ce corespunde minorului curent are ordinul 1. 2. La nivelul k se fac k apeluri pentru calculul determinanților de ordinul k-1. Prin urmare procesul converge spre un caz elementar.

 a11 x1  a12 x2  ...  a1m xm  b1  a x  a x  ...  a x  b  21 1 22 2 2m m 2 Sistemul de m ecuații liniare cu m necunoscute:   ....................................... am1 x1  am 2 x2  ...  amm xm  bm

(2.1.1)

se poate scrie sub forma: Ax  b ,

(2.1.2)

care este forma matricială, numai dacă se utilizează notațiile:

25

 a11 a12  a a22 A   21  ... ...   am1 am 2

... a1m   x1   b1       b2 x2 ... a2 m  , x    și b    .  ...   ...  ... ...       ... amm   xm   bm 

(2.1.3)

Teoremă: Dacă matricea A – pătratică a sistemului de ecuații liniare este inversabilă, atunci sistemul are o soluție unică: x  A1b .

(2.1.4)

Observație: daca detA = 0, atunci sistemul poate fi compatibil nedeterminat sau incompatibil. Algoritmul de rezolvare: 1. Scriem matricea A a sistemului de ecuații liniare; 2. Calculăm determinantul matricei A (det A), comparăm det A cu 0 (zero); 3. Dacă det A  0, atunci A- inversabilă, altfel A- nu este inversabilă; 4. Aflăm inversa matricei A ( A1 ); 5. Aflăm soluția sistemului după formula: x  A1b . [14] Exemplul 1: Să se rezolve sistemul de ecuații liniare, utilizînd metoda matriceală:

 x  y  2 z  1   2 x  y  2 z  4 . 4 x  y  4 z  2  Rezolvare: Scriem sistemul dat astfel:

1 1 2  1 1 2   x   1       1  2 1 2  .  y    4  , deci det A  2 1 2  4  4  8  (8  8  2)  8  2  6  0,  A .  4 1 4   z   2  4 1 4     

1 2 4  a11    * Scriem matricea transpusă: A   1 1 1  , deci trebuie să aflăm A   a21  2 2 4 a    31 T

a11  (1)11.

1 1  6 ; 2 4

a21  (1)21.

2 4 0; 2 4

a31  (1)31.

a12  (1)1 2 .

1 1  2 ; 2 4

a22  (1) 2 2 .

1 4  4 ; 2 4

a32  (1)3 2 .

a12 a22 a32

a13   a23  . a33 

2 4 6; 1 1

1 4  3; 1 1

26

a13  (1)13 .

1 1  4; 2 2

a23  (1)23 .

1 2  2; 2 2

a33  (1)33 .

1 2  3 . 1 1

Obținem :

 6 2 4   6 2 4  1     1 A   0 4 2   A  .  0 4 2  , 6  6 3 3   6 3 3      *

 x  1   x   1         1   y   A .  4    y    2  ; z  2   z   2         

 x  1;  Deci am obținut:  y  2;  z  2.  Răspuns: Soluția sistemului nostru este S  {(1, 2, 2)} . Exemplul 2:

 x  2y  z  1  Se dă sistemul: 2 x  my  z  2 , m  R .  x  2 y  2z  3  a) Să se determine m pentru ca sistemul să aibă o soluţie unică. b) Pentru m = 10, rezolvaţi sistemul. Rezolvare:

1 2 1 a) det A  2 m 1  2m  4  2  (m 8  2)  m  8 . 1 2 2 Dacă det A  0  m  8  0  m  8, dacă m  8  det A  0 , deci pentru m  R \{8}, sistemul este compatibil determinat, adică are o soluție unică.

 a11 1 2 1     * Scriem matricea transpusă: TA   2 m 2  , deci trebuie să aflăm A   a21 a 1 1 2   31  

a11  (1)11.

m 2  2m  2; 1 2

a21  (1)21.

2 1  3; 1 2

a31  (1)31.

2 1  4  m; m 2

a12 a22 a32

a13   a23  . a33 

2 2  6; 1 2

a13  (1)13.

2 m  2  m; 1 1

a22  (1)2 2 .

1 1  1; 1 2

a23  (1) 23 .

1 2  1; 1 1

a32  (1)3 2 .

1 4  3; 1 1

a33  (1)33.

1 2  m  4. 2 m

a12  (1)1 2 .

Obținem :

27

6 2m  2m  2  m 8 m 8 m 8   2m  2 6 2  m   2m  2 6 2  m    1  3 1 1     * 1 1  A   3 1 1  A    3 1 1  A   m 8 m 8 m 8  m  8  4  m 3 m  4   4  m 3 m  4        3 m4  4  m   m 8 m 8 m 8  6 2m  2m  2  2m  2 12 6  3m   m 8 m 8 m 8   m 8  m 8  m 8   x 1  x    1  x    3 1 1       3 2 3     1     ,  y   A . 2    y    2  y     m 8 m 8 m 8       m 8 m 8 m 8  z  3  z     3   z           4  m 3 m  4    4  m  6  3m  12   m 8 m 8 m 8   m 8 m 8 m 8   8  m     x  m 8  2    , deci soluția sistemului pentru cazul cand este det A  0 , adică pentru   y    m 8  z      2m  10   m 8  m  R \{8} este: S  {(

8  m 2 2m  10 , , )} . Dacă m=8, atunci det A  0 , deci sistemul nostru m 8 m 8 m 8

nu are soluții.

 x  2y  z 1  b) Pentru m = 10, obținem următorul sistem de ecuații liniare: 2 x  10 y  z  2 .  x  2 y  2z  3  1 2 1 det A  2 10 1  20  4  2  (10  8  2)  10  8  2 . 1 2 2 1 2 1   a11    Scriem matricea transpusă: TA   2 10 2  , deci trebuie să aflăm A*   a21 1 1 2  a    31

a11  (1)11.

10 2  18; 1 2

a21  (1) 21. a31  (1)31.

2 1

a12  (1)1 2 .

2 2  6; 1 2

1 1 1  3; a22  (1) 2 2 .  1; 2 1 2

2 1  14; 10 2

a32  (1)3 2 .

1 4  3; 1 1

a13  (1)13 .

a12 a22 a32

a13   a23  . a33 

2 10  8; 1 1

a23  (1) 23 . a33  (1)33 .

1 2 1 1 1

1 2 6 2 10

Obținem : 28

   9 3 4   18 6 8   18 6 8    1 3 1 1      * 1 1  A   3 1 1   A    3 1 1   A  ,  2 2  2 2  14 3 6        14 3 6  3  7 3  2       9 3 4  x 1 x 1 x              9   3 1 1       1   2   y    1  ,    y   A . 2    y    2 2 2        z  3  z   3 z 5            3    7 3  2  2  5 deci soluția sistemului pentru cazul cand m=10, adică pentru m  R este: S  {(9,1, )} . 2

Răspuns: a) S  {(

8  m 2 2m  10 , , )} , pentru m  R \{8} și det A  0 ; m 8 m 8 m 8

S  {} , pentru m=8 obținem det A  0 , sistemul nostru nu are soluții. 5 b) S  {(9,1, )} pentru m=10, det A  0 2

29

2.2.2 Metoda lui Cramer Ne amintim! 

Matricea pătratică A se numește nesingulară, dacă determinantul ei este diferit de 0, (zero).



Matricea inversă matricei A – matricea care, fiind înmulțită la A, dă ca rezultat matricea unitate, I.

Capacitatea de a calcula determinanții numerici de ordinul m, permite rezolvarea unei game largi de problem din diverse domenii. Una dintre aplicațiile practice ale calculului determinanților este rezolvarea sistemelor de ecuații liniare. Fie dat sistemul în forma pătratică (2.1.1), pe care-l vom scrie în forma (2.1.2) cu notațiile (2.1.3). În cazul cînd determinant A este diferit de zero, există matricea inversă, în urma înmulțirii ambelor părți ale egalității (2.1.2) la matricea inversă vom obține în rezultat o egalitate de forma (2.1.4). Formula (2.1.4 ) ne permite calcularea soluțiilor sistemului (2.1.1) în cazul cînd matricea A a sistemului este nesingulară. Formula detaliată care va fi utilizată pentru calcularea componentelor vectorului soluției rezultă nemijlocit din (2.1.4) și proprietățile matricei inverse:

xi 

a1,1 ... a1, j 1 a2,1 ... a2, j 1

b1 b2

i , i  1, n , unde i  ... ... ... ...  am,1 ... am, j 1 bm

a1, j 1 ... a1,m a2, j 1 ... a2,m ... am, j 1

... ... ... am,m

.

(2.2.1)

 i este determinantul matricei formate din matricea A, în care coloana i este înlocuită prin vertorul termenilor liberi. Formulele (2.2.1) se numesc formulele Cramer. Metoda lui Cramer permite rezolvarea sistemelor liniare de m ecuaţii cu m necunoscute având determinantul asociat matricei sistemului nenul. Definiție:

Un sistem liniar de m ecuații cu m necunoscute se numește sistem Cramer, dacă

determinantul matricei coeficienților sistemului este diferit de zero. Teoremă: (Regula lui Cramer) Un sistem liniar S, format din n ecuații liniare cu n necunoscute, pentru care  = det(A)  0 este compatibil determinat, cu soluția dată de formulele lui Cramer:

x1 

 1  , x2  2 ,..., xi  i ,   

(2.2.2)

unde  i se obține înlocuind în  , coloana coeficienților necunoscutei i, i  1,3 , prin coloana termenilor liberi. [1] 30

Demonstrație: A. Presupunem că sistemul S este compatibil determinat. Mulțimea soluțiilor lui S are deci un singur element. Aplicând teorema despre soluția particulară a unui sistem S,din care rezultă expresia: S  x0  S0   x0  y y  S0  , unde S – sistem de ecuații liniare, S 0 - sistem omogen obținut prin înlocuirea coloanei b cu coloana 0, și x0 - o soluție particulară a lui S si

S 0 . În consecință, mulțimea S 0 nu poate avea decât un singur element. Dar, S 0 fiind un Ksubspațiu a lui K n , nu poate fi egal decât cu {0}. Conform ipotezei că un sistem omogen are doar soluția {0,...,0}, dacă și numai dacă rang(A) = n, deci det(A)  0. B. Presupunem că det(A)  0. Sistemul omogen atașat S 0 are deci doar solutia banală, adică

S 0 = {0}. Conform teoremei aplicate recent la această demonstrație, mulțimea S are cel mult un elemet. Nu ne rămâne să demonstrăm, decât existența unei soluții particulare a sistemului S. Considerăm scalarii xi  K , definiți astfel: xi  (det( A))1 det[c1A ,..., ciA1 , bt , ciA1 ,..., cnA ] , unde

i {1,..., n} . Pentru a ajunge la concluzia x0  {x1 ,..., xn } este o soluție a lui S, e suficient să arătăm că Ax0t  bt  x0t  A1bt  x0t  (det( A))1 A*bt , unde A* este adjuncta matricii

 b1  n A. Avem deci Ax  b  xi  (det( A)) (1i ,  2i ,...,  ni )   ...   (det( A)) 1  b j  ji , unde  ji j 1 bn  t 0

t

1

n

sunt complemenții algebrici corespunzători. Dar,

b  j 1

j

ji

nu reprezintă altceva decât

dezvoltarea după coloana a i-a a determinantului det[c1A ,..., ciA1 , bt , ciA1 ,..., cnA ], i {1,..., n} . Așadar, x0 reprezintă unica soluție a sistemului S. [12] Algoritmul Cramer de rezolvare: 1. Calculăm determinantul matricei A (det A); 2. Calculăm determinanții  i , înlocuind coloana i cu coloana termenilor liberi; 3. Exprimăm necunoscutele astfel: xi 

i . 

Rezolvarea sistemelor liniare de n ecuatii cu n necunoscute, cu parametru Fie A matricea atașată a sistemului. Pasul 1: Calculăm det (A) și rezolvăm ecuația det(A)= 0.

31

Pasul 2: Pentru valorile parametrilor pentru care det(A) ≠ 0, sistemul este compatibil determinat, adica are soluție unică și îl rezolvăm. Pasul 3: Pentru valorile parametrilor pentru care det(A) = 0 continuăm rezolvarea sistemului pentru fiecare caz în parte astfel: A. determinam rangul lui A căutînd un minor al lui A diferit de 0 (determinantul principal); B. calculăm determinanții caracteristici (minorii), dacă există (determinanții obținuți prin abordarea determinantului principal cu o linie și termenii liberi). Determinăm valorile parametrilor care anulează determinanții caracteristici dacă este cazul; C. Pentru cazurile în care toți determinanții caracteristici sunt nuli sistemul este compatibil nedeterminat și se rezolvă sistemul. Dacă există cel puțin un determinant caracteristic nenul atunci sistemul este incompatibil. Observatie: Punctele A, B, C din pasul 3 se pot repeta de mai multe ori pe parcursul rezolvării. Exemplul 1:

 x  y  2 z  1  Să se rezolve sistemul de ecuații liniare, utilizînd metoda lui Cramer:  2 x  y  2 z  4 . 4 x  y  4 z  2  Rezolvare:

1 1 2 Calculăm detreminantul matricei: det A  2 1 2  4  4  8  (8  8  2)  6 ; 4 1 4 Calculăm determinanții xi , înlocuind coloana i cu coloana termenilor liberi:

1 1 2 1  4 1 2  6 ; 2

1

1 1 2  2  2 4 2  12 ;

1

1

3  2 1 4  12 ;

4 2 4

4

1

4

1

2

Exprimăm necunoscutele astfel: x

1 6  1 ;  6

y

 2 12  2;  6

z

3 12   2 .  6

 x  1;  Deci am obținut:  y  2;  z  2.  Răspuns: Soluția sistemului este S  {(1, 2, 2)} .

32

Exemplul 2: Să se studieze compatibilitatea acestui sistem în R, în funcție de parametrul k și h, apoi să se determine soluțiile acestui sistem în cazul în care acestea există.

 kx  y  z  4   x  2 y  3z  6, unde k , h  R 3x  y  2 z  h  Rezolvare:

k 1 1 k 1 1    Pas.1 A   1 2 3  ,   1 2 3  4k  9  1  (6  3k  2)  k  4;  3 1 2  3 1 2   Dacă determinantul   0  k  4  0  k  4. Dacă k  4    0 , deci pentru k  R \ 4 , sistemul este compatibil determinat, adică are o soluție unică. Pas.2 Determinăm această soluție utilizînd metoda lui Cramer, deci urmează să calculăm următorii determinanți:  x ,  y ,  z .

4 x  6

1 2

1 3  16  3h  6  (2h  12  12)  k  2;

h 1 2 k 4 y  1 6

1 3  12k  36  h  (18  3kh  8)  26  12k  3kh  h;

3 h 2

k z  1

1 2

4 6  2kh  18  4  (24  6k  h)  6k  h  2kh  10;

3 1 h x

 y 26  12k  3kh  h x k  2  6k  h  2kh  10  ; z z   ; y ;  4k  4k  4k

Am obținut soluția: S  {(

k  2 26  12k  3kh  h 6k  h  2kh  10 , , )} . 4k 4k 4k

 4x  y  z  4  Pas.3 Dacă k  4 , atunci sistemul devine astfel:  x  2 y  3z  6, h  R . 3x  y  2 z  h  Sistemul dat depinde numai de parametrul h și   0. Să determinăm rangul matricei sistemului: 33

d

4 1  8  1  7  0  rangul matricei sistemului este 2, sistemul are două ecuații principale și 1 2

una secundară.

4 1 4 Avem nevoie de un determinant caracteristic: dc  1 2 6  8h  18  4  (24  24  h)  7 h  14 , 3 1 h dc  0  7h  14  0  h  2 .

Dacă h  2 , atunci sistemul este incompatibil  S  . Dacă h  2 , atunci sistemul este compatibil nedeterminat. Notăm z  w și rezolvăm sistemul

 4x  y  w  4  4x  y  4  w    x  2 y  3w  6   x  2 y  6  3w   zw zw  

x 

4w 1  w 2  8  2w  (6  3w)  w  2 , x  x  ; 6  3w 2  7

y 

 4 4w 20  11w  24  12w  (4  w)  11w  20 , y  y  ; 1 6  3w  7

Deci S  {(

w  2 20  11w , , w)} , unde w  R , oricare. 7 7

Pas.4 Concluzie: 1) Dacă k  R \{4} și h  R , sistemul este compatibil determinat și are soluția unică S  {(

2) Dacă S  {(

k  2 26  12k  3kh  h 6k  h  2kh  10 , , )} . 4k 4k 4k

k 4

și

h  2 , sistemul este compatibil nedeterminat și are soluțiile

w  2 20  11w , , w)} , unde w  R , oricare. 7 7

3) Dacă k  4 și h  R \{2} , sistemul este incompatibil și S  . Exemplul 3: Să se studieze compatibilitatea acestui sistem în R, în funcție de a și b. Să se determine soluțiile acestui sistem în cazul în care acestea există.

 x yz 0  ax  y  z  a  1, a, b  x  y  bz  1  Rezolvare: 34

1 1 1 1 1 1   Pasul 1: A   a 1 1  , det( A)  a 1 1  b  1  a  1  1  ab  (1  a)(b  1). 1 1 b 1 1 b   Revolvăm det  A  0  a  1 sau b  1. Pasul 2: Daca a  1 si b  1  det( A)  0. Deci sistemul este compatibil determinat, adică are soluție unică. Determinăm această soluție:

0 1 1 1 0 1 1 1 0 dx  a  1 1 1  (a  1)(1  b), dy  a a  1 1  (a  1)(b  2), dz  a 1 a  1  a  1, 1

1

1 b

Prin urmare obținem: x  1, y 

1

b

1 1

1

b2 1  b2 1  , z , deci soluția este: S  (1, , ) . 1 b 1 b  1 b 1 b 

Pasul 3: Aici avem mai multe cazuri: 1) a  1, b  1 ;

2)

a  1, b  1 ;

3)

a  1, b  1

Deci vom parcurge pașii A, B, C pentru fiecare caz în parte. Cazul I

 x yz 0  Obținem sistemul:  x  y  z  0 , det( A)  0.  x  y  z  1  Determinăm rangul lui A: Minorii de ordinul II ai lui A sunt de forma

1 1  0  rang A<2. Avem dp =1  rang A=1, avem 1 1

un sistem format dintr-o ecuație principală și două ecuații secundare. Calculăm determinanții caracteristici. Aceștia vor avea forma:

1 0 1 0

 0 sau

1 0  1 1 1

Determinantul caracteristic

1 0  0  sistemul este incompatibil. 1 1

Cazul II

 x yz 0  Obținem sistemul:  x  y  z  0 , det( A)  0.  x  y  bz  1  Determinăm rangul lui A: 35

dp =

1 1  b  1  0  rang A=2. Avem un sistem format din două ecuații principale și o ecuație 1 b

secundară.

1 1 0 Calculăm determinanții caracteristici. Vom avea un determinant caracteristic: dc = 1 1 0  0  1 b 1 sistemul este compatibil nedeterminat. Notăm:

xq

și avem de rezolvat

sistemul:

xq xq      q  y  z  0   y  z  q . q  y  bz  1  y  bz  1  q  

dy 

1 q q 1  bq  1  q  q(1  b)  1 , unde dz   1  q  q  1 . 1  q b 1 1  q

1   q(1  b)  1 Deci soluția sistemului dat este: S  (q, , )  , q  b 1 b 1  

Cazul III

 x yz 0  Obținem sistemul: ax  y  z  a  1, det( A)  0.  x  y  z  1  Determinăm rangul lui A: dp =

1 1  1  a  0  rang A=2. Avem un sistem format din două ecuații principale și o ecuație a 1

secundară.

1 1 0 Vom avea un determinant caracteristic: dc = a 1 a  1  a  1  0  sistemul este incompatibil. 1 1 1 Concluzie: 

Dacă a, b 

\{1} , atunci sistemul este compatibil determinat și are soluție unică.

 b2 1  S  (1, , )  1 b 1 b 



Dacă a  1, b 

\{1} , atunci sistemul este compatibil nedeterminat și are soluțiile:

1   q(1  b)  1 S  (q, , )  , q  b 1 b 1  

 Dacă b  1, a  , atunci sistemul este incompatibil și S   . 36

2.2.3 Metoda lui Gauss clasică Ne amintim! 

Matricea extinsă a unui sistem de m ecuații cu m necunoscute se va numi matricea format din m linii si m+1 coloane, format din coeficienții sistemului și vectorul termenilor liberi, amplasați după cum urmează. ( vezi Corolar 6)

Una dintre metodele eficiente de determinare a soluției unui sistem de ecuații liniare este metoda excluderii consecutive a necunoscutelor, această metodă este cunoscută sub numele de metoda lui Gauss. Ea poate fi utilizată în cazul cînd sistemul cercetat are o soluție unică sau o infinitate de soliții. Metoda transformărilor elementare este de fapt procedeul de reducere a necunoscutelor, scris eventual sub formă matriceală. În cazul sistemelor de două ecuaţii cu două necunoscute, această metodă este de fapt metoda reducerii. [1] Fie sistemul S m de m ecuații liniare cu m necunoscute:

i : ai1 x1  ai 2 x2  ...  aim xm  wi , unde i  1, m

(2.3.1)

unde am notat cu  i ecuația i din sistemul considerat. Este cunoscut faptul că sistemul S poate fi scris folosind notațiile matriciale, sub forma: S : Ax  w , unde x este vectorul de componente

x1 , x2 , x3 ,..., xm și A  (aik ), unde i, k  1, m este matricea sistemului, iar w este de asemenea un vector avînd componentele w1 , w2 , w3 ,..., wm . Dacă eliminăm din acest sistem una din necunoscute, spre exemplu pe x1 , obținem primul sistem intermediar de m-1 ecuații cu m-1 necunoscute (1) (1) (1) (1) (1) (1)  (1) j : a j 2 x2  a j 3 x3  ...  a jm xm  w j , j  2, m sau mai concis ar fi Sm1 : A x  w , unde prima

coloană a lui A(1) are numai elemente nule, iar sistemul intermediar Sm1 conține următoarele m-1 necunoscute: x2 , x3 ,..., xm . Ecuația  (1) j  2, m , s-a obținut înmulțind una din ecuațiiile j , sistemului S m , de exemplu 1 , cu facorul  obținem relațiile:  (1) j j 

a j1 a11

a j1 a11

și adunînd ecuația obținută la ecuația  j ,

1 , j  2, m

(2.3.2)

unde a11  0. În acest mod sistemul S m este transformat într-un sistem echivalent, format din Sm1 și ecuația 1 . Cu sistemul Sm1 procedăm la fel, eliminînd de exemplu pe x2 , obținem astfel un al doilea

sistem

intermediar

de

m-2

ecuații

cu

m-2

necunoscute

(2) k(2) : ak(2)3 x3  ak(2)4 x4  ...  akm xm  wk(2) , k  3, m , sau mai concis ar fi Sm2 : A(2) x  w(2) , unde în

37

matricea A(2) primele două coloane sunt formate numai din elemente nule, iar sistemul Sm 2 are următoarele m-2 necunoscute: x3 , x4 ,..., xm . Astfel sistemul S m s-a transformat într-un sistem echivalent alcătuit din sistemul Sm 2 , din ecuația  2(1) a sistemului Sm1 și din ecuația 1 aparținînd sistemului S m . Procedăm analog pînă ajungem la ultimul sistem intermediar format de o ecuație cu ( m1) o singură necunoscută: m( m1) : amm xm  wm( m1) sau S1 : A( m1) x  w( m1) . Astfel sistemul S m s-a

transformat în sistemul echivalent S m , format din cîte o ecuație a sistemelor Sm , Sm1 , Sm2 ,..., S2 , S1 anume:

1 :  2(1) : 3(2) :

a11 x1 

...

...

a12 x2  (1) a22 x2  ...

a13 x3  ... (1) a23 x3  ... (2) a33 x3  ... ...

...

 n( n 1) :

 a1m xm  w1 ,  a2(1)m xm  w2(1) , (2)  a3(2) m xm  w2 ,

(2.3.3)

... ( m 1) amm xm  w2( m1) .

Este esențial de remarcat că sistemul S m are o matrice triunghiulară superioară și că elementele (1) ( m1) sînt presupuse diferite de zero. Formarea sistemului (2.3.3) constituie faza directă a a11 , a22 ,..., amm

metodei de eliminare. În consecință, sistemul S m se rezolvă ușor. Pentru aceasta aflăm din ultima ecuație necunoscuta xm , apoi valoarea găsită o substituim în penultima ecuație. Din această ecuație aflăm pe xm1 ș.a.m.d. pînă ce aflăm toate necunoscutele sistemului. Rezolvarea sistemului (2.3.3) formează faza indirectă a acestei metode. [5] Observație: Procesul de calcul al soluției unui sistem de ecuații liniare utilizînd metoda lui Gauss se divide în două etape: 1. directă – transformarea sistemului de ecuații liniare inițial S m în sistemul echivalent S m prin transformări elementare a matricii extinse. 2. indirectă – calculul componentelor soluției sistemului S m , adică rezolvarea sistemului (2.3.3) Pentru prelucrarea treptată a sistemului, se utilizează urmatoarele transformări elementare, care conduc la sisteme echivalente: 

Reașezarea ecuațiilor în altă ordine;



Reașezarea necunoscutelor în altă ordine;



Înmulțirea unei ecuații cu un număr nenul;



Adunarea ecuațiilor membru cu membru. 38

Aplicînd în mod convenabil astfel de transformari, se ajunge la una din situatiile: 1. Sistemul final are forma triunghiulară, soluția sa fiind unică (compatibil determinat); 2. Sistemul final are forma trapezoidală, cu mai multe soluții (compatibil nedeterminat); 3. Sistemul final contine o contradictie, fără soluții (incompatibil). Algoritmul Gauss de rezolvare: 1. Scriem matricea extinsă a sistemului (adică matricea sistemului, căreia îi anexăm coloana termenilor liberi); 2. Aplicăm transformari elementare (ca și cum am lucra cu ecuațiile) asupra acestei matrice, până când aceasta ia forma triunghiulară sau trapezoidală; 3. Consideram sistemul liniar caruia îi corespunde această matrice extinsă (el este echivalent cu cel dat!); 4. Dacă în acest sistem apare o contradicție, atunci sistemul este incompatibil; 5. Dacă nu apare nici o contradicție, atunci sistemul este compatibil sau compatibil nedeterminat, dupa cum el are forma triunghiulara sau trapezoidala; 6. Solutia sistemului (cînd aceasta exista!) se afla usor, parcurgand drumul înapoi, de la ultima ecuație (cu cele mai puține necunoscute), către prima (cu cele mai multe necunoscute). [10] Exemplul 1:

 x  y  2 z  1  Să se rezolve sistemul de ecuații liniare, utilizînd metoda lui Gauss:  2 x  y  2 z  4 . 4 x  y  4 z  2  Rezolvare: Pentru a rezolva sistemul dat, este necesar să folosim matricea extinsă, efectuînd transformările necesare, obținem spre final o matrice extinsă de forma triunghiulară, de unde vom afla ușor soluția finală a sistemului nostru. Deci vom obține:  1 1 2 1   1 1 2 1   1 1 2 1   1 1 2 1   x  y  2 z  1;           2 1 2 4   0 3 2 2   0 3 2 2   0 3 2 2    3 y  2 z  2;   4 1 4 2   4 1 4 2   0 3 4 2   0 0 2 4    2 z  4.   

 x  y  4  1;  x  y  4  1;  x  y  3;  x  2  3;  x  1;        3 y  4  2;   3 y  4  2;  3 y  6;   y  2;   y  2;  z  2.  z  2.  z  2.  z  2.  z  2.      Răspuns: Soluția sistemului nostru este S  {(1, 2, 2)} .

39

Exemplul 2: Să se studieze compatibilitatea acestui sistem în R, în funcție de parametrul s și t, apoi să se determine soluțiile acestui sistem în cazul în care acestea există.

 x yz 0   sx  y  z  s  1, unde s, t  R  x  y  tz  1  Rezolvare: Pentru a rezolva sistemul dat, este necesar să folosim matricea extinsă, efectuînd transformările necesare, obținem spre final o matrice extinsă de forma triunghiulară, de unde vom afla ușor soluția finală a sistemului nostru. Deci vom obține: 1 1 1 0     s 1 1 s  1  1 1 t 1   

1 1 1 0     0 1  s 1  s s  1 1 1 t 1  

1 1 1 0     0 (1  s)(t  1) 0 st  t  2s  2  0  0 t 1 1  

1 1 1 0     0 1  s 1  s s  1 0 0 t  1 1  

 (t  1) (t  1) 0 1    (1  s)(t  1) 0 st  t  2s  2   0  0  0 t 1 1  

 (1  s)(t  1) 0 0 st  t  s  1   (1  s)(t  1) x  st  t  s  1    0 (1  s)(t  1) 0 s(t  2)  t  2   (1  s)(t  1) y  st  t  2s  2      0 0 t 1 1 (t  1) z  1   

 x    y     

st  t  s  1 (1  s)(t  1) st  t  2s  2 st  t  s  1 st  t  2s  2 1  S  {( , , )} (1  s)(t  1) (1  s)(t  1) (1  s)(t  1) t  1 1 z t 1

Răspuns: Soluția sistemului nostru este S  {(

st  t  s  1 st  t  2s  2 1 , , )} . (1  s)(t  1) (1  s)(t  1) t  1

40

2.2.4 Factorizarea LU (Crout & Doolittle) Fie sistemul compatibil determinat: Ax  b .

(2.4.1)

Factorizarea LU presupune descompunerea matricei A intr-un produs de matrice LU , unde:

 11 0   22 L   21  ... ...   n1 n 2

0   11   0 ... 0  și U    ... ... ...    ... nn   0

12 ... 1n  22 ... 2 n  .

...

... 0

(2.4.2)

... ...   ... nn 

Această descompunere este posibilă dacă toți determinanții de colț ai matricei A sunt nenuli. Pentru a asigura unicitatea descompunerii, trebuie precizate n elemente ale matricei L sau U. În mod tradițional, se specifică ii sau ii , adică ii =1, atunci factorizarea LU se numește factorizare Doolittle, iar dacă ii =1, atunci factorizarea LU se numește factorizare Crout. Astfel dar rezolvarea sistemului (2.4.1)se reduce la rezolvarea sistemelor triunghiulare: Ly  b

(2.4.3)

b  y1  1  11  cu soluția:  i 1  y   b   y  1 , i  2, n ij j   i  1  j 1  ii 

(2.4.4)

și Ux=y

(2.4.5)

y  xn  n  nn  cu soluția:  n  1 x   y  ij x j  , i  2, n   i i  j i 1   ii 

(2.4.6)

Algoritmul LU de rezolvare: 1) Generăm matricea A a sistemului și a vectorului coloană – b. Numărul de ecuații (linii) ale sistemului le vom nota cu n. 2) Folosim cele două factorizări: Crout și Doolittle. a) Factorizarea Crout: pentru i  1, n avem ii  1 j 1

pentru i  1, n și pentru j  1, i avem ij  aij   ik kj k 1

pentru j  i  1, n avem ij 

i 1 1  a  ik kj  .  ij  ii  k 1 

41

b) Factorizarea Doolittle: pentru i  1, n avem ii  1 pentru i  1, n și pentru j  1, i  1 avem ij 

i 1   a  ik kj   ij   jj  k 1 

i 1

pentru j  i, n avem ij  aij   ik kj . k 1

3) Rezolvarea celor două sisteme triunghiulare: y1 

i 1   1 , pentru i  2, n atunci yi   bi   ij y j  . 11 j 1    ii

xn 

n   1 , pentru i  2, n atunci xi   yi   ij x j  . [8] nn j i 1    ii

b1

yn

Exemplul 1: Să se determine soluția sistemului următor, folosind factorizarea LU:

 30 x1  x2  x3  10a   x1  30 x2  2 x3  10a  1  2 x  x  30 x  27 3  1 2



 30 1 1 30     1 30 2 29   2 1 30 27   

Rezolvare: Pentru a vedea dacă se poate aplica factorizarea LU, trebuie ca determinanții de colț să fie diferiți de zero. Vom calcula acești determinanți astfel:

1 | 30 | 30  0; 30 1 3  1 30 2

1

2 

30 1  30  30  11  900  1  899  0; 1 30

1 2  30  30  30  111  11 2  (1 30  2  11 30  1 2  30)  27003  150  26853  0; 30

Vom aplica factorizarea Doolittle:

0  30 1 1   1    A  L U , unde ii  1 , adică  1 30 2    21 1  2 1 30       31 32

0   11   0  0 1   0

12 22 0

13  23  . 33 

Efectuînd înmulțirea a două matrici, vom afla necunoscutele  și  .

42

11  30; 12  1;

13  1;

21  11  1  21 

1 ; 30

1 1 899  22  30  22  30   ; 30 30 30 1 2 1 59 1 21  13  23  2   23  2  23  2   ; 31  11  2  30  31  2  31   ; 30 30 15 30 30 1 899 899 1 14 30 28 31  12  32  22  1    32  1   32  1   32    ; 15 30 30 15 15 899 899

21  12  22  30 

31  13  32  23  33  30 

1 28 59 1 28 59 805650    33  30  33  30     ; 15 899 30 15 899 30 26970

Am obținut în rezultat astfel:   1  30 1 1      1 1 30 2     30  2 1 30      1  15

  0   30 1   899 1 0 0   30   28 1  0 0 899   0

  1  30 1 1   1   unde A   1 30 2  , L    30  2 1 30   1     15

   59  30  805650  26970  1

   30 1 0   889 1 0  și U   0   30   28 0 0 1 899   0

   59  30  80565  2697  1

În continuare vom rezolva două sisteme:   1  1 L y  B    30  1   15

    0 y1  30  y1  30 y 30     1   1      1 0    y2    29    y2  29   30   y2  28     30  y3   27   26855   28 1 28   y   3 1 y3  27   30   28  899 899 15 899   0

  30 1  899 U x  y  0  30  0 0 

30  1  1   x1      1 30  x1  1   x1   30     59     59 30    x2    28    x2  (28  )    x2  1 30     30 899  x3  26855      x3  1 80565  26855 2697      899   x3   2697  899 80565 

Răspuns: Soluția sistemului este: S  {(1;1; 1)}

43

Exemplul 2: Să se determine soluția sistemului următor, folosind factorizarea LU:

 x yz 2   2x  y  z  1 . x  3y  2z  5  Rezolvare:

 1 1 1   m  2       Scriem sistemul dat în forma matricială: Ax  b , unde A   2 1 1  , x   n  , b   1  .  1 3 2  k 5       Verificăm determinanții de colț ai acestui sistem:

1  0,

1

1

2 1

1 1 1  3  0, 2 1 1  3  0. Rezultă ca matricea A este nesingulară. 1

3

2

Rezolvare utilizînd factorizarea Crout.

 1 1 1   11 0    Presupunem că A   2 1 1    21 22  1 3 2       31 32

  1 12   0 1 33   0 0 0 0

12  12  . Ne propunem să determinăm 1 

coeficienții lij , u jk . Pentru aceasta, folosim definiția inmulțirii matricilor. Astfel obținem: a11  11 1

 11  1

a12  11  12

 12  1

a13  11  13

 13  1

a21  21 1

 21  2

a22  21  12  21 1

 22  3 . Deoarece A  L U obținem:

a23  21  13  22  23

 23  1

a31  31 1

 31  1

a32  31  12  32 1

 32  2

a33  31  13  32  23  33 1

 33  1

1  L  2 1  1  U  0 0 

0 0  3 0  2 1  . 1 1  1 1 0 1 

Urmează să rezolvăm sistemele triunghiulare. Pentru rezolvarea sistemului inițial, avem de rezolvat

 1 0 0   s1   2   1 1 1  m   s1              două sisteme triunghiulare:  2 3 0    s2    1  &  0 1 1   n    s2  . Rezolvînd primul 1 2 1  s  5 0 0 1   k   s     3        3  s1   2  m 1         sistem obținem soluția: S   s2    1  . Substituind în al doilea sistem obținem: x   n    2  .  s  1  k  1  3       44

Rezolvare utilizînd factorizarea Doolittle.

0  1 1 1   1    Presupunem că A   2 1 1    21 1  1 3 2       31 32

0   11   0 0 1   0

12 22 0

12  12  . 33 

Ne propunem să determinăm coeficienții lij , u jk . Pentru aceasta, folosim definiția inmulțirii matricilor. Astfel obținem: a11  1  11

 11  1

a12  1  12

 12  1

a13  1  13

 13  1

a21  21  11

 21  2

a22  21  12  1 22

 22  3 . Deoarece A  L U obținem:

a23  21  13  1 23

 23  3

a31  31  11

 31  1

a32  31  12  32  22

 32  

a33  31  13  32  23  1 23

 33  1

2 3

  1 0 0   L   2 1 0   2 1 . 1  3    1 1 1   U   0 3 3  0 0 1   

Urmează să rezolvăm sistemele triunghiulare. Pentru rezolvarea sistemului inițial, avem de rezolvat    1 0 0   s1   2   1 1 1   m   s1        două sisteme triunghiulare:  2 1 0    s2    1  &  0 3 3    n    s2  . 0 0 1   k   s     s  5 2      3 1  3    1  3  

 s1   2      Rezolvînd primul sistem obținem soluția: S   s2    3  . Substituind în al doilea sistem obținem: s   1   3   m 1     x   n    2 .  k  1     Răspuns: Soluția sistemului nostru este S  {(1, 2,1)} .

45

2.2.5 Factorizarea Cholesky Un caz particular de sisteme liniare este acela în care matricea A a sistemului este simetrică și pozitiv definită (adică toți determinanții de colț sunt strict pozitivi). Pentru astfel de sisteme putem folosi un caz particular al factorizării LU:

 11 0  21 22 T descompunem matricea A a sistemului într-un produs L  L , unde L    ... ...   m1 m 2

0   ... 0  . ... ...   ... mm  ...

Coeficienții ij se obțin din definiția produsului a două matrice. [7] Exemplul 1: Să

se

rezolve

sistemul

de

ecuații

liniare,

utilizînd

factorizarea

Cholesky:

 x1  4 x 2  5 x 3  10  4 x1  20 x 2  32 x 3  56  5 x1  32 x 2  70 x 3  107 Rezolvare:

1 4 5   10      Matricea sistemului şi vectorul termenilor liberi sînt: A   4 20 32  și b   56  .  5 32 70  107      Calculăm elementele b i1 şi c1 j astfel: b11  a11  1, b21  a 21  4, b31  a 31  5 , apoi calculînd obținem: c12 

1 1  a12  4 , c13   a13  5 . Aplicîn datele vom găsi: b22  a 22  b21  c12  4 , b11 b11

b32  a 32  b31  c12  12, b33  a 33  ( b31  c13  b32  c 23 )  9, apoi calculînd obținem:

1 0 0  1 4 5 1 12   c 23    a 23  b 21  c13    3 . Obţinem, deci: B   4 4 0  și C   0 1 3  b 22 4 0 0 1  5 12 9      Rezolvând sistemul B y  b se obţine:

y1 

b1 b11

 10 , y 2 

1 1 b 2  b 21  y1   4 , y 3    b3  ( b31  y1  b32  y 2 )   1. b 22 b33

Din sistemul C x  y obţinem succesiv valorile necunoscutelor începând cu ultima:

46

x 3  y 3  1, x 2  y 2  c 23  x 3  1, x1  y1  ( c12  x 2  c13  x 3 )  1. Deci

vectorul

soluţie

este:

 1   x   1 .  1   Exemplul 2:

 x  2y  z  5  Să se rezolve sistemul de ecuații liniare, utilizînd factorizarea Cholesky: 2 x  5 y  2 z  11 .  x  2 y  3z  7  Rezolvare:

1 2 1   Matricea sistemului este: A   2 5 2  . Se observă că matricea este simetrică. Vom calcula 1 2 3  

1 2 1 determinantul matricei A astfel: det A  2 5 2  15  4  4  (5  12  4)  23  21  2 , deoarece 1 2 3 det A=2>0, înțelegem că matricea A este pozitiv definită. Aplicînd factorizarea Cholesky obținem egalitatea:

 1 2 1   11 0    A   2 5 2    21 22 1 2 3      31 32

  11 21   .  0 22 33   0 0 0 0

31  32  . 33 

Folosind definiția produsului a două matrice, obținem relațiile: a11  112 ; a12  11.21 ; a13  11.31 ; a22  212  222 ; a23  21.31  22 .32 ; a33  312  322 .332 ;

Deci vom obține următoarele valori: 11  1; 21  2; 31  1; 22  1; 32  0; 33  2; Pentru a determina soluția sistemului inițial, avem nevoie de rezolvat două sisteme triunghiulare:

1 0  2 1 1 0 

0   y1   5   1 2      0  .  y2   11 și  0 1     2   y3   7   0 0

1   x  5      0 . y    1  .   2   z   2 

 y1   5   x   2          Rezolvînd aceste două sisteme obținem soluțiile respective:  y2    1  și  y    1  .  y     z  1  3  2     Răspuns: Soluția sistemului nostru este S  {(2,1,1)} .

47

2.3 Metode exacte iterative de rezolvare a sistemelor de ecuații liniare 2.3.1 Metoda iterativă Jacobi Metoda Jacobi este o metodă iterativă de rezolvare a sistemelor liniare de forma Ax = b.

(3.1.1)

Matricea A se descompune în suma L + D + U , unde  0   a21 L   a31   ... a  m1

0 0

0 0

a32 ... am 2

0 ... am3

... 0   a11   ... 0   a21 ... 0  , D   0   ... ...   ...  0 ... 0  

0 a22

0 0

0 ... 0

a33 ... 0

0   0 a12   0  0 0 ... 0  , U   ... ...   ... ...  0 0 0 0 ... amm  

... ...

a13 ... a23 ... ... ... 0 0

... ...

a1m   a2 m  ...   am 1,m  0 

Se definește traiectoria Jacobi a vectorului x (0) ca fiind vectorul x( k 1)  D1[b  ( L  U ) x( k ) ], k  0,1, 2,...

(3.1.2)

Folosind teorema de convergență se studiază dacă traiectoria Jacobi converge la soluția x (*) a sistemului (3.1.1). Traiectoria Jacobi converge la soluția x (*) a sistemului (3.1.1), dacă și numai dacă raza spectrală ρ a matricei M   D1 ( L  U )

(3.1.3)

este strict subunitară, adică max{  det(M   I n )  0}  1

(3.1.4)

În caz de convergență, componentele x1( k 1) , x2( k 1) ,..., xn( k 1) ale vectorului x( k 1) , situat pe traiectoria Jacobi a vectorului x (0) , sunt date de relațiile: n

xi( k 1)  (bi   aij x (jk ) )  j 1 j i

1 , i  1, n; k  0,1, 2,... [11] aii

(3.1.5)

Algoritmul Jacobi de rezolvare: 1. generarea matricei A a sistemului și a vectorului b, unde n - numărul de necunoscute (numărul de linii ale matricei A) 2. generarea matricelor L, D, U și verificarea convergenței metodei:

   D1  L  U



 1

3. construirea traiectoriei Jacobi 48

n

repetă xi( k 1)  (bi   aij x (jk ) )  j 1 j i

1 , i  1, n; pînă cînd aii

n

 (x i 1

( k 1) i

 xi( k ) )   n . [2]

Exemplu : Calculați primii trei termeni ai traiectoriei Jacobi asociate vectorului (0, 0, 0) pentru sistemul:

5 x  2 y  3z  1   3x  9 y  z  2 .  2x  y  7z  3  Rezolvare:

 5 2 3    Sistemul nostru îl scriem sub forma (3.1.1), astfel obținem: A   3 9 1  ,  2 1 7   

 1   b   2 . 3  

Matricea A se descompune în suma L+D+U cu

 0 0 0 5 0 0   0 2 3        L   3 0 0  , D   0 9 0  , U   0 0 1  .  2 1 0   0 0 7  0 0 0       Verificarea condiției de convergență a algoritmului presupune calculul valorilor proprii ale matricei (3.1.3)  0  1 1 M  D (L  U )   3   2 7

1 7

3  5   1  . 9   0  

Calculînd

în

modul

maximul

2 5 0

al

valorilor

proprii

ale

matricei

M,

obținem

 (M )  0.2673998083  1, și deci algoritmul converge. Aplicînd formulele (3.1.5), plecînd de la tripletul x(0)  0, y (0)  0, z (0)  0, obținem succesiv:

 x (1)  -0.2000000000  (1)  y  0.2222222222,  z (1)  -0.4285714286 

 x (2)  0.1460317460  (2)  y  0.2031746032 ,  z (2)  -0.5174603174 

 x (3)  0.1917460316  (3)  y  0.3283950617 .  z (3)  -0.4158730159 

49

2.3.2 Metoda iterativă Gauss-Seidel Metoda Gauss-Seidel este o metodă de rezolvare numerică a sistemelor de tip Cramer, prin Aproximații succesive. Matricea A a sistemului se descompune în suma L + D + U , unde L este matrice triunghiulară subdiagonală, D matrice diagonală și U matrice triunghiulară supradiagonală. Pentru un vector x(0) 

n

, șirul de vectori x ( k ) definit prin:

x( k 1)  ( L  D)1 (b  Ux( k ) )

(3.2.1)

se numește traiectoria Gauss-Seidel a vectorului x (0) . Traiectoria Gauss-Seidel a vectorului x (0) converge dacă și numai dacă raza spectrală ρ a matricei este strict subunitară.

( L  D)1U

(3.2.2)

În caz de convergență, componentele: x1( k 1) , x2( k 1) ,..., xn( k 1) ale vectorului x ( k 1) , situat pe traiectoria Gauss-Seidel a vectorului x (0) , sunt date relațiile: n

x1( k 1)  (b1   a1 j  x(jk ) )  j 2

i 1

1 a11

xi( k 1)  (bi   aij  x(jk 1)  j 1

(3.2.3)

n

a

j i 1

ij

 x (jk ) ) 

1 , i  2, n aii

[4]

(3.2.4)

Algoritmul Gauss-Seidel de rezolvare: Deoarece metoda Gauss-Seidel este o metodă iterativă, trebuie specificată o condiție de oprire a algoritmului. În continuare vom folosi urmîtoarea condiție de oprire a algoritmului: n

 (x i 1

( k 1) i

 xi( k ) )   n .

(3.2.5)

Etapele algoritmului: 1. generarea matricei A a sistemului și a vectorului b, unde n - numărul de necunoscute (numărul de linii ale matricei A) 2. generarea matricelor L, D, U și verificarea convergenței metodei:

    L  D 1 U   1 3. construcția traiectoriei Gauss-Seidel, repetă (3.2.3) și (3.2.4) pînă cînd are loc (3.2.5) Metodei Gauss-Seidel i se mai zice metoda “iteraţiilor succesive”, pentru că la un pas careva

k  0 , de îndată ce o coordonată a soluţiei este calculată, ea se utilizează în ecuaţiile pentru coordonatele următoare xi( k 1) , i  j. [9]

50

Exemplul : Să se rezolve sistemul de ecuații liniare prin metoda Seidel:  9ax1  x2  x3  x4  9a  1  x  10ax  x  2 x  10a  2  1 2 3 4  2 x1  x2  11ax3  x4  11a  2  x1  2 x2  x3  12ax4  12a  2

Rezolvare: Fie a=3, vom obține sistemul:

 27 x1  x2  x3  x4  26  25 x1  26  2 x1  x2  x3  x4  x  30 x  x  2 x  28 25 x  28  x  5 x  x  2 x  1  2 3 4 1 2 3 4  2   2 x  x  33 x  x   31 35 x  31  2 x  x  2 x  x 1 2 3 4 3 1 2 3 4    x1  2 x2  x3  36 x4  38  35 x4  38  x1  2 x2  x3  x4 26 2 1 1 1   x1  25  25 x1  25 x2  25 x3  25 x4   1,0400 0,0800 0,0400 0,0400 0,0400   x   28  1 x  5 x  1 x  2 x   2 1 2 3 4 1,1200 0,0400 0,2000 0,0400 0,0800   25 25 25 25 25    .  0,8858 0,0571 0,0286 0,0571 0,0286   x  31  2 x  1 x  2 x  1 x    3 35 35 1 35 2 35 3 35 4 -1,0858 0,0286 0,0571 0,0286 0,0286    38 1 2 1 1  x4    x1  x2  x3  x4 35 35 35 35 35  n

Vom calcula norma după formulele:  1  max  aij  1 și  j 1

1 1 1   2   25  25  25  25    5 1 2   1    25 25 25 25     , de unde: 2 1 2 1     35 35 35 35   1 2 1 1     35 35 35   35

n

2

 max  aij  1 i 1

3 4 3   5 ; ; ;  1 25 35 35   25 54 2 10   16  max  ; ; ;  1 350 350 350   350

 1  max   

2

Deci procesul iterativ converge. Calculăm prima iterație, vom lua în calitate de aproximație inițială: x(0)   x1(0) , x2(0) , x3(0) , x4(0)    0, 0, 0, 0  .

51

26 26    (1) 26 x1(1)  x1(1)     x1  25 25 25    28 1 26 28 26 (1) (1)    x (1)   674 x2     x2       2 25 25 25 25 625 625      31 2 26 1 674 31 52 674 20001    x (1)  x3(1)      x3(1)       3 35 35 25 35 625 35 875 21875 21875    38 1 26 2 674 1 20001 38 26 1348 20001 835679  x4(1)        x4(1)     x4(1)      35 35 25 35 625 35 21875 35 875 21875 765625 765625     26 674 20001 835679  Am obținut prima iterație: x(1)   x1(1) , x2(1) , x3(1) , x4(1)    ,  , , .  25 625 21875 765625 

Verificăm condiția: x(1)  x(0)   ,   0.1 x1(1)  x1(0) 

26  0   ,   0.1 25

x2(1)  x2(0)  

674  0   ,   0.1 625

x3(1)  x3(0) 

20001  0   ,   0.1 21875

x4(1)  x4(0) 

835679  0   ,   0.1 765625

Calculăm a doua iterație, vom lua în calitate de aproximație:  26 674 20001 835679  x(1)   x1(1) , x2(1) , x3(1) , x4(1)    ,  , , .  25 625 21875 765625 

26 2 26 1 674 1 20001 1 835679  x1(2)           25 25 25 25 625 25 21875 25 765625  28 1 17603686 5 674 1 20001 2 835679  x2(2)            25 25 19140625 25 625 25 21875 25 765625   31 2 17603686 1 74957614 2 20001 1 835679 (2)  x3           35 35 19140625 35 478515625 35 21875 35 765625  38 1 17603686 2 74957614 1 16141870664 1 835679  x4(2)           35 35 19140625 35 478515625 35 16748046875 35 765625  17603686  (2)  x1  19140625   x1(2)  0,9197027787755102  x (2)   74957614  (2)  2  x  0,1566461157877551 478515625    2 (2)  x (2)  16141870664  x3  0,963806155098309  3  x4(2)  1,270953238149129 16748046875  617914130481  x4(2)   586181640625 

Am obținut prima iterație: 74957614 16141870664 617914130481   17603686 x(2)   x1(2) , x2(2) , x3(2) , x4(2)    , , , .  19140625 478515625 16748046875 586181640625 

Verificăm condiția: x(2)  x(1)   ,   0.1 52

x1(2)  x1(1) 

17603686 26 2302564     ,   0.1 19140625 25 19140625

x2(1)  x2(0)   x3(2)  x3(1) 

74957614 674 441073636     ,   0.1 478515625 625 478515625

16141870664 20001 828605039     ,   0.1 16748046875 21875 16748046875

x4(1)  x4(0)  

617914130481 835679 1257730864856     ,   0.1 586181640625 765625 586181640625

Observație: Celelalte iterații se calculează asemănaător celor anterioare. Rezolvarea sistemului dat cuprinde 3 iterații pentru   0.1 , iar pentru   0.001 rezolvarea sistemului cuprinde 5 iterații.

53

2.3.3 Metoda relaxării successive Metoda relaxării succesive este o metodă de rezolvare numerică a sistemelor de tip Cramer, prin aproximații succesive. Această metod se deosebește de metoda GaussSeidel prin aceea că se introduc corecțile: x( k )  x( k 1)  x( k ) , k  0,1, 2,...

(3.3.1)

Matricea A a sistemului se descompune în suma L + D + U, unde L este matrice triunghiulară subdiagonală, D - matrice diagonală și U - matrice triunghiulară supradiagonală. Pentru

un

x( k 1)  ( L 

1



x(0) 

vector

n

,

șirul

de

vectori

1 D)1 {b [(1  )  D U]  x( k ) }, k  0,1, 2,...

x (k) definit

prin: (3.3.2)



se numește traiectoria vectorului x (0) obținută prin relaxări succesive. Traiectoria vectorului x (0) obținută prin relaxări succesive converge dacă și numai dacăă raza spectrală  a matricei este strict subunitară

( L 

1



1 D)1  [(1  )  D U]

(3.3.3)



În caz de convergență, componentele x1( k 1) , x2( k 1) ,..., xn( k 1) ale vectorului x ( k 1) situat pe traiectoria vectorului x (0) obținută prin relaxări succesive sunt date relațiile: n



j 2

a11

i 1

n

x1( k 1)  (1   )  x1( k )  [(b1   a1 j  x(jk ) )]  xi( k 1)  (1   )  xi( k )  [(bi   aij  x(jk 1)  j 1

(3.3.4)

a

j i 1

ij

 x(jk ) )] 

 aii

, i  2, n

[10]

(3.3.5)

Observație: Metoda Gauss-Seidel este un caz particular al metodei relaxării succesive, pentru care   1 . Algoritmul metodei: Deoarece metoda relaxării succesive este o metodă iterativă, trebuie specificată o condiție de oprire a algoritmului. Această condiție este similară cu cea folosită în paragraful anterioar, și anume: n

 (x i 1

( k 1) i

 xi( k ) )   n .

(3.3.6)

Etapele algoritmului: 1. generarea matricei A a sistemului și a vectorului b, unde n - numărul de necunoscute (numărul de linii ale matricei A) 2. generarea matricelor L, D, U și verificarea convergenței metodei: 54

1   1  1     L  D   [(1  )  D U ]      

   1 și   (0, 2) . 

3. construcția traiectoriei relaxărilor succesive, repetă (3.3.4) și (3.3.5) pînă cînd are loc (3.3.6)

Exemplul : Să se rezolve sistemul de ecuații liniare prin metoda relaxării successive: Să se găsească primele 3 elemente ale traiectoriei vectorului (0, 0)T , utilizînd metoda relaxării succesive cu   0.5 , pentru sistemul:

 4 x  y  1  4 x  3 y  2 Rezolvare:

 4 1  1  Sistemul se poate scrie sub forma Ax = b, unde: A   , b    .  4 3  2   0 0  4 0 0 1 Matricea A se descompune în suma L + D + U, cu: L   , D   , U   .  4 0  0 3 0 0 Algoritmul converge dacă raza spectrală a matricei: 1 1   0.500 0.125     1  M    L   D    1    D  U    ,         0.333 0.583 

este strict subunitară. Efectuînd calculele, obținem că  (M )  0.75  1 , deci algoritmul este convergent. În continuare, aplicăm formulele (3.3.4) și (3.3.5), plecînd de la punctele x(0) = 0, y(0) = 0 obținem: x(1) = −0.1250000000

y(1) = −0.5000000000

x(2) = −0.1250000000

y(2) = −0.7500000000

x(3) = −0.0937500000

y(3) = −0.9166666667

Pentru comparație, am determinat soluția exactă a sistemului considerat: x = −0.125;

y = −0.5;

55

Capitolul III: APLICAȚII UTILIZÎND LIMBAJUL PASCAL ȘI BORLAND DELPHI 7.0 3.1 Metode exacte directe de rezolvare a sistemelor de ecuații liniare Rezultatele obținute în urma compilării programelor sunt prezentate în Anexa 2 PROBLEMA 1 (PASCAL) Să se alcătuiască un program Pascal pentru a calcula următoarele operaţii pentru matrici pătratice: A  B;

A  B;

k  A;

A2 ;

AT ;

A  B;

B  A;

k  B;

B2;

BT ;

det ( A); det ( B).

REZOLVARE: Program P1; uses crt; type matrice=array[1..20,1..20] of real; vector=array[1..20] of real; var a,b,c,e,sum,dif,ta,tb,prod1,prod2, prod3,prod4,scalar1,scalar2:matrice; n,i,j:byte; determ:real; Procedure Int_Matrice_A(var k:matrice); var IntM:matrice;i,j:integer; begin writeln('Introducerea elementelor matricei A: '); For i:=1 to n do For j:=1 to n do begin write('a[',i,',',j,']='); readln(intM[i,j]); end; k:=intm; end; Procedure Int_Matrice_B(var k:matrice); var IntM:matrice;i,j:integer; begin writeln('Introducerea elementelor matricei B: ');

56

For i:=1 to n do For j:=1 to n do begin write('b[',i,',',j,']='); readln(intM[i,j]); end; k:=intm; end; Procedure Afisare_Matrice(h:matrice); var i,j:integer; begin For i:=1 to n do begin For j:=1 to n do write(h[i,j]:8:2); writeln; end; end; Procedure Sum_Matrice(var l,m,c:matrice); var i,j:integer; begin For i:=1 to n do For j:=1 to n do c[i,j]:=l[i,j]+m[i,j]; end; Procedure Dif_matrice(var l,m,c:matrice); var i,j:integer; begin For i:=1 to n do For j:=1 to n do c[i,j]:=l[i,j]-m[i,j]; end; Procedure Prod_matr_k(var m,c:matrice); var k1:real;i,j:integer; begin writeln('Introducerea scalarului k'); readln(k1); For i:=1 to n do begin For j:=1 to n do c[i,j]:=k1*m[i,j]; end; end; Procedure Produs_matrice(var q,m,c:matrice); var l:real;k:byte; i,j:integer; begin For i:=1 to n do For j:=1 to n do begin l:=0; For k:=1 to n do l:=l+q[i,k]*m[k,j]; c[i,j]:=l; end; end; Procedure Transpusa(var m,l:matrice); var i,j:integer;

57

begin For i:=1 to n do For j:=1 to n do l[i,j]:=m[j,i]; end; Procedure Determinant(var h:matrice; det:real); var temp:real;t:boolean;iv,x,f:byte;i,j:integer; begin det:=1; for j:=1 to n-1 do begin iv:=j; t:=true; while (iv<=n) and t do if h[iv,j]=0 then iv:=iv+1 else t:=false; if t then begin det:=0;exit;end; {daca toate elementele de pe coloana iv, de la j la n sunt 0, atunci determinantul este 0} if j<> iv then begin det:=-det; for x:=j to n do begin temp:=h[j,x]; h[j,x]:=h[iv,x]; h[iv,x]:=temp; end; end; for f:=j+1 to n do for x:=j+1 to n do h[f,x]:=h[f,x]-h[j,x]*h[f,j]/h[j,j]; end; for j:=1 to n do det:=det*h[j,j]; writeln('Valoarea determinantului este:',det:10:2); end; BEGIN clrscr; writeln('Introducerea dimensiunii matricelor: n= '); readln(n); int_matrice_A(a); int_matrice_B(b); Sum_matrice(a,b,sum); Dif_matrice(a,b,dif); Produs_matrice(a,b,prod1); Produs_matrice(b,a,prod2); Prod_matr_k(a,scalar1); Prod_matr_k(b,scalar2); Produs_matrice(a,a,prod3); Produs_matrice(b,b,prod4); Transpusa(a,ta); Transpusa(b,tb); writeln('Matricea A'); afisare_matrice(a); readkey;writeln; writeln('Matrica B'); afisare_matrice(b); readkey;writeln; writeln('Suma matricelor: A+B'); afisare_matrice(sum); readkey;writeln;

58

writeln('Diferenta matricelor: A-B'); afisare_matrice(dif); readkey;writeln; writeln('Produsul matricelor: A*B'); afisare_matrice(prod1); readkey;writeln; writeln('Produsul matricelor: B*A'); afisare_matrice(prod2); readkey;writeln; writeln('Inmultirea cu un scalar: s1*A'); afisare_matrice(scalar1); readkey;writeln; writeln('Inmultirea cu un scalar: s2*B'); afisare_matrice(scalar2); readkey;writeln; writeln('Patratul matricei A: A*A'); afisare_matrice(prod3); readkey;writeln; writeln('Patratul matricei B: B*B'); afisare_matrice(prod4); readkey;writeln; writeln('Transpusa matricei A'); afisare_matrice(ta); readkey;writeln; writeln('Transpusa matricei B'); afisare_matrice(tb); readkey;writeln; writeln('Determinantul matricei A:'); Determinant(a,determ); readkey;writeln; writeln('Determinantul matricei B:'); Determinant(b,determ); readkey;writeln; writeln('Sfarsitul programului'); readkey; end.

PROBLEMA 2 (PASCAL) Calcularea soluțiilor sistemului de ecuații liniare utilizînd metoda lui Cramer și metoda lui Gauss. Rezultatul se va afișa în documentul Cramer_Gauss.txt REZOLVARE: Program P2; uses crt; type matrice=array[1..20,1..20] of real; vector=array[1..20] of real; var a,c:matrice; w:text; n,i,j,k,l,iv,i1,j1,q1,q2:integer; determ,temp:real; d,x,b:vector; t: boolean; Procedure Int_Matrice(var k:matrice); var IntM:matrice; i,j:integer; begin writeln('Introducerea elementelor matricei: '); For i:=1 to n do For j:=1 to n do begin write('a[',i,',',j,']=');readln(IntM[i,j]); end; k:=IntM; end; Procedure Afisare_Matrice(h:matrice);

59

var i,j:integer; begin For i:=1 to n do begin For j:=1 to n do write(w,h[i,j]:2:0); writeln(w); end; end; Procedure Afisare_sistem(a:matrice;b:vector;n:integer); var i,j:integer; begin for i:=1 to n do begin write(w,a[i,1]:5:2,' x',1); for j:=2 to n do write(w,' + ',a[i,j]:5:2,' x',j); writeln(w,' = ',b[i]:5:2); end; end; Function Determinant(h:matrice):real; var temp,det:real; t:boolean; iv,x,f:byte; i,j:integer; begin det:=1; for j:=1 to n-1 do begin iv:=j; t:=true; while (iv<=n) and t do if h[iv,j]=0 then iv:=iv+1 else t:=false; if t then begin det:=0;exit; end; if j<> iv then begin det:=-det; for x:=j to n do begin temp:=h[j,x]; h[j,x]:=h[iv,x]; h[iv,x]:=temp; end; end; for f:=j+1 to n do for x:=j+1 to n do h[f,x]:=h[f,x]-h[j,x]*h[f,j]/h[j,j]; end; for j:=1 to n do det:=det*h[j,j]; determinant:=det; end; BEGIN clrscr; assign(w,'Cramer_Gauss.txt'); rewrite(w); writeln('Introduceti dimensiunea matricii, n= '); readln(n); writeln('Introduceti matricea extinsa a sistemului ');

60

for i:=1 to n do begin for j:=1 to n do begin write('a[',i,',',j,']='); readln(a[i,j]); end; write('b[',i,']='); readln(b[i]); end; writeln(w,''); writeln(w,'Sistemul initial este: '); Afisare_sistem(a,b,n); writeln(w,''); writeln(w,'Matricea A este:'); Afisare_matrice(a); writeln(w,''); writeln(w,'Metoda lui Cramer: '); writeln(w,''); Determ:=determinant(a); writeln(w,'Determinantul matricii sistemului este: '); writeln(w,determ:10:2); writeln(w,''); writeln(w,'Minorii sunt:'); for q1:=1 to n do begin c:=a; for q2:=1 to n do c[q2,q1]:=b[q2]; writeln(w,''); writeln(w,'Matricea D',q1);writeln; afisare_matrice(c); d[q1]:=determinant(c); writeln(w,'Dx',q1,'=',d[q1]:10:2); if determ<>0 then x[q1]:=d[q1]/determ;writeln; end; writeln(w,''); writeln(w,'Solutiile sistemului sunt:'); for i:=1 to n do writeln(w,'x[',i,']=',x[i]:10:5); writeln(w,''); writeln(w,'Metoda lui Gauss: '); writeln(w,''); writeln(w,'Solutia sistemului este:'); for j:=1 to n-1 do begin iv:=j;t:=true; while (iv<=n) and t do if a[iv,j]=0 then iv:=iv+1 else t:=false; if t then begin writeln('Determinantul principal este nul!'); exit; end; if j<>iv then begin for k:=j to n do begin temp:=a[j,k]; a[j,k]:=a[iv,k]; a[iv,k]:=temp; end;

61

temp:=b[j]; b[j]:=b[iv]; b[iv]:=temp; end; for l:=j+1 to n do begin for k:=j+1 to n do a[l,k]:=a[l,k]-a[j,k]*a[l,j]/a[j,j]; b[l]:=b[l]-b[j]*a[l,j]/a[j,j]; end; end; if a[n,n]=0 then begin writeln('Determinantul principal este nul!');exit; end; x[n]:=b[n]/a[n,n]; for i:=n-1 downto 1 do begin temp:=b[i]; for j:=i+1 to n do temp:=temp-a[i,j]*x[j]; x[i]:=temp/a[i,i]; end; for i:=1 to n do writeln(w,'x',i,'=',x[i]:10:5 ); writeln('Vezi fisierul Cramer_Gauss.txt'); close(w); readkey; end.

PROBLEMA 3 (PASCAL) Calcularea soluțiilor sistemului de ecuații liniare utilizînd factorizarea LU. REZOLVARE: Program P3; uses crt; label 1; type matrice=array[1..20,1..20] of real; vector=array[1..20] of real; var a,l,u:matrice; b,x,y:vector; i,j,n,k1:byte;dd:real; f:text; Procedure Init; begin write('Introdu n=');readln(n);writeln(f,'n=',n); writeln('Introdu elementele matricii A:'); for i:=1 to n do for j:=1 to n do begin write('a[',i,',',j,']='); readln(a[i,j]); end; writeln('Introdu coloana termenilor liberi, B:'); for i:=1 to n do begin

62

write('b[',i,']='); readln(b[i]); end; writeln(f,'Datele initiale:'); for i:=1 to n do begin write(f,'| '); for j:=1 to n do write(f,a[i,j]:9:2); writeln(f,' |',' |x',i,'|',' |',b[i]:9:2,'|'); end; end; Function Determinant(q:byte):real; var temp,det:real;t:boolean;iv,x,f:byte; h:matrice; begin det:=1;h:=a; for j:=1 to q-1 do begin iv:=j; t:=true; while (iv<=n) and t do if h[iv,j]=0 then iv:=iv+1 else t:=false; if t then begin det:=0;exit; end; {daca toate elementele de pe coloana iv, de la j la n sunt 0,atunci determinantul este 0} if j<> iv then begin det:=-det; for x:=j to q do begin temp:=h[j,x]; h[j,x]:=h[iv,x]; h[iv,x]:=temp; end; end; for f:=j+1 to q do for x:=j+1 to q do h[f,x]:=h[f,x]-h[j,x]*h[f,j]/h[j,j]; end; for j:=1 to q do det:=det*h[j,j]; { writeln('Valoarea determinantului este:',det:10:2);} determinant:=det; end; Procedure Crout; var k:byte;s:real; begin writeln(f,'Factorizarea Crout:'); for i:=1 to n do u[i,i]:=1; for i:=1 to n do begin for j:=1 to i do begin s:=0; for k:=1 to j-1 do

63

s:=s+l[i,k]*u[k,j]; l[i,j]:=a[i,j]-s; end; for j:=i+1 to n do begin s:=0; for k:=1 to i-1 do s:=s+l[i,k]*u[k,j]; u[i,j]:=(1/l[i,i])*(a[i,j]-s); end; end; writeln(f,'Matricea U este:'); for i:=1 to n do begin for j:=1 to n do write(f,u[i,j]:12:4); writeln(f); end; writeln(f,'Matricea L este:'); for i:=1 to n do begin for j:=1 to n do write(f,l[i,j]:12:4); writeln(f); end; end; Procedure Doolittle; var k:byte;s:real; begin for i:=1 to n do for j:=1 to n do begin u[i,j]:=0;l[i,j]:=0; end; writeln(f,'Factorizarea Doolitte:'); for i:=1 to n do l[i,i]:=1; for i:=1 to n do begin for j:=1 to i-1 do begin s:=0; for k:=1 to i do s:=s+l[i,k]*u[k,j]; l[i,j]:=(1/u[j,j])*(a[i,j]-s); end; for j:=i to n do begin s:=0; for k:=1 to i-1 do s:=s+l[i,k]*u[k,j]; u[i,j]:=a[i,j]-s; end; end; writeln(f,'Matricea U este:'); for i:=1 to n do begin

64

for j:=1 to n do write(f,u[i,j]:12:4); writeln(f); end; writeln(f,'Matricea L este:'); for i:=1 to n do begin for j:=1 to n do write(f,l[i,j]:12:4); writeln(f); end; end; Procedure Intermediar_Y; var s:real; begin y[1]:=b[1]/l[1,1]; for i:=2 to n do begin s:=0; for j:=1 to i-1 do s:=s+l[i,j]*y[j]; y[i]:=(b[i]-s)/l[i,i]; end; writeln(f,'Vectorul intermediar Y:'); for i:=1 to n do write(f,y[i]:9:4); writeln(f); end; Procedure Solutia_X; var s:real; begin x[n]:=y[n]/u[n,n]; for i:=n-1 downto 1 do begin s:=0; for j:=i+1 to n do s:=s+u[i,j]*x[j]; x[i]:=(y[i]-s)/u[i,i]; end; writeln(f,'Solutia X:'); for i:=1 to n do write(f,x[i]:9:4); writeln(f); end; Begin clrscr; assign(f,'sol_fact.txt'); rewrite(f); Init; for k1:=1 to n do begin dd:=Determinant(k1); if dd=0 then begin writeln(f,'Factorizarea LU nu poate fi aplicata'); goto 1; end; writeln(f,'Valoarea determinantilor de colt:');

65

for i:=1 to k1 do begin write(f,'| '); for j:=1 to k1 do write(f,a[i,j]:9:2); writeln(f,' |'); end; writeln(f,'D',k1,'=',dd:10:2); end; Crout; Intermediar_Y; Solutia_X; Doolittle; Intermediar_Y; Solutia_X; close(f); 1:readkey; End.

PROBLEMA 4 (PASCAL) Obținerea inversei unei matrici patratice prin metoda Cholesky, utilizînd pointeri. REZOLVARE: Program P4; Uses Crt; Type pMAT = ^MAT; MAT = Array[0..20,0..20] of Double; pVEC = ^VEC; VEC = Array[0..20] of Double; Var A : pMAT; {Matricea de intrare de dimensiune n,n} A1: pMAT; {Copie A pentru verificare} B : pMAT; {Inversa matricii A de dimensiune nn} C : pMAT; {Pastrarea solutiei A1*B=I} i,j,n: Integer; Procedure choldc1(n:integer; Var a:pMAT; Var p:pVEC); Forward; Procedure choldc(n:integer; A:pMAT; Var aa:pMAT); Var i,j:integer; p:pVEC; Begin New(p); for i := 0 to n-1 do for j := 0 to n-1 do aa^[i,j] := A^[i,j]; choldc1(n, aa, p); for i := 0 to n-1 do begin aa^[i,i] := p^[i]; for j := i + 1 to n-1 do aa^[i,j] := 0.0 end; Dispose(p) End; Procedure choldcsl(n:integer; A:pMAT; Var aa:pMAT); Var i,j,k:integer; sum:double; p:pVEC; Begin New(p); for i := 0 to n-1 do for j := 0 to n-1 do aa^[i,j] := A^[i,j];

66

choldc1(n, aa, p); for i := 0 to n-1 do begin aa^[i,i] := 1.0 / p^[i]; for j := i + 1 to n-1 do begin sum := 0.0; for k := i to j-1 do sum := sum - aa^[j,k] * aa^[k,i]; aa^[j,i] := sum / p^[j]; end end; Dispose(p) End; Function choldet(n:integer; a:pMAT): Double; Var c:pMAT; d:double; i,j:integer; Begin New(c); d:=1.0; choldc(n,a,c); for i := 0 to n-1 do d := d * c^[i,i]; choldet := d * d; Dispose(c) End; Procedure cholsl(n:integer; A:pMAT; Var aa:pMAT); Var i,j,k:integer; Begin choldcsl(n,A,aa); for i := 0 to n-1 do for j := i + 1 to n-1 do aa^[i,j] := 0.0; for i := 0 to n-1 do begin aa^[i,i] := aa^[i,i] * aa^[i,i]; for k := i + 1 to n-1 do aa^[i,i] := aa^[i,i] + aa^[k,i] * aa^[k,i]; for j := i + 1 to n-1 do for k := j to n-1 do aa^[i,j] := aa^[i,j] + aa^[k,i] * aa^[k,j]; end; for i := 0 to n-1 do for j := 0 to i-1 do aa^[i,j] := aa^[j,i] End; Procedure choldc1(n:integer; Var a:pMAT; Var p:pVEC); Var i,j,k:integer; sum:double; Begin for i := 0 to n-1 do begin for j := i to n-1 do begin sum := a^[i,j]; for k := i - 1 Downto 0 do sum := sum - a^[i,k] * a^[j,k]; if i = j then begin if sum <= 0 then writeln(' Matricea nu este pozitiv definita!');

67

p^[i] := sqrt(sum); end else a^[j,i] := sum / p^[i] end; end; End; Procedure MatPrint(s:String;n:integer; A:pMAT); Var i,j:integer; Begin writeln; writeln(' ',s); for i:=0 to n-1 do begin for j:=0 to n-1 do write(' ',A^[i,j]:10:6); writeln end End; Function Check_Matrix(n:integer;A:pMAT):Boolean; var i,j,k:integer; sum:double; begin Check_Matrix:=True; for i := 0 to n-1 do begin for j := i to n-1 do begin sum := a^[i,j]; for k := i - 1 Downto 0 do sum := sum - a^[i,k] * a^[j,k]; if i = j then if sum <= 0 then Check_Matrix:=False end; end; end; Procedure MATMULT(n:Integer;A,B:pMAT; VAR C: pMAT); VAR SUM : DOUBLE; I,J,K : integer; BEGIN for I:=0 to n-1 do for J:=0 to n-1 do begin SUM:= 0.0; for K:=0 to n-1 do SUM:=SUM+A^[I,K]*B^[K,J]; C^[I,J]:=SUM end END; Procedure MatCopy(n:Integer; A:pMAT; VAR A1:pMAT); Var i,j: Integer; Begin For i:=0 to n-1 do For j:=0 to n-1 do A1^[i,j]:=A^[i,j] End; { programul principal pentru a demonstra utilizarea funcției cholsl () } BEGIN

68

New(A); New(A1); New(B); writeln(' Obtinerea inversei unei matrici patratice, simetrice prin metoda Cholesky'); writeln(' (Matricea trebuie sa fie pozitiv definita).'); n := 4; writeln; writeln(' Size = ', n); {definesc jumatatea inferioara a matricei simetrice} A^[0,0]:= 5; A^[1,0]:=-1; A^[1,1]:= 5; A^[2,0]:=-1; A^[2,1]:=-1; A^[2,2]:= 5; A^[3,0]:=-1; A^[3,1]:=-1; A^[3,2]:=-1; A^[3,3]:= 5; {definesc jumatatea superioara a matricei simetrice} For i:=0 to n-1 do For j:=i+1 to n-1 do A^[i,j]:=A^[j,i]; MatPrint('Matrix A:',n,A); writeln; if Check_Matrix(n,A) then begin MatCopy(n,A,A1); writeln(' Determinant = ', choldet(n,A):10:6); cholsl(n,A,B); MatPrint('Matrix Inv(A):',n,B) end else writeln(' Scuze, aceasta matrice nu este pozitiv definita !'); writeln; write(' Doriti sa verificati (y/n)?: '); if Readkey='y' then begin New(C); MatMult(n,A1,B,C); Writeln; MatPrint('Verificare A * Inv(A) = I:',n,C); Dispose(C); Readkey end; Dispose(A); Dispose(A1); Dispose(B); END.

PROBLEMA 5 (PASCAL)* Calcularea soluțiilor sistemului de ecuații liniare utilizînd factorizarea QR. REZOLVARE: Program P5; type matr=array[1..20,1..20]of real; vect=array[1..20]of real; var a,q,h,c,d,u:matr; v:vect; s:real; n,i,j,k:integer; procedure citire(var n:integer;var a:matr); var i,j:integer; begin write('Introdu dimensiunea matricii A, n=');readln(n); writeln('Introduceti coeficientii matricei:');

69

for i:=1 to n do for j:=1 to n do begin write('a(',i,',',j,')='); readln(a[i,j]); end; end; procedure prod_matr(a,b:matr;n:integer;var c:matr); var i,j,k:integer; begin for i:=1 to n do for j:=1 to n do begin c[i,j]:=0; for k:=1 to n do c[i,j]:=c[i,j]+a[i,k]*b[k,j]; end; end; Begin citire(n,a); for i:=1 to n do for j:=1 to n do if i=j then u[i,j]:=1 else u[i,j]:=0;q:=u; for k:=1 to n-1 do begin for i:=1 to k-1 do v[i]:=0;s:=0; for i:=k to n do s:=s+sqr(a[i,k]); v[k]:=a[k,k]+sqrt(s); for i:=k+1 to n do v[i]:=a[i,k]; s:=0; for i:=1 to n do s:=s+sqr(v[i]); for i:=1 to n do for j:=1 to n do h[i,j]:=u[i,j]-2*v[i]*v[j]/s; prod_matr(h,a,n,c); prod_matr(q,h,n,d); a:=c;q:=d; writeln('Matricea Q este:'); for i:=1 to n do begin for j:=1 to n do write(q[i,j]:10:4);writeln; end; writeln('Matricea R este:'); for i:=1 to n do begin for j:=1 to n do write(a[i,j]:10:4);writeln; end; readln; end; end.

70

3.2 Metode exacte indirecte de rezolvare a sistemelor de ecuații liniare PROBLEMA 6 (PASCAL) Calcularea soluțiilor sistemului de ecuații liniare utilizînd metoda lui Jacobi. REZOLVARE: Program P6; uses crt; const eps=1E-4; type vector=array[1..10] of real; matrice=array[1..10,1..10] of real; var n,i,j,k:integer; a,x:matrice; b,s1,s2:vector; BEGIN clrscr; write('Introdu numarul de ecuatii ale sistemului n='); readln(n); writeln('Introdu componentele matricii sistemului si termenilor liberi'); for i:=1 to n do begin for j:=1 to n do begin write('a(',i,',',j,')='); read(a[i,j]); end; write('b(',i,')=');read(b[i]); end; writeln('Matricea extinsa este: '); for i:=1 to n do begin for j:=1 to n do write(a[i,j]:10:5,' '); writeln(b[i]:12:5); end; writeln; k:=1; for i:=1 to n do x[i,k]:=0; repeat writeln('Numarul iteratiei k=',k); for i:=1 to n do begin s1[i]:=0; s2[i]:=0; for j:=1 to n do begin if ji then s2[i]:=s2[i]+a[i,j]*x[j,k]; end; x[i,k+1]:=(b[i]-s1[i]-s2[i])/a[i,i]; writeln('x(',i,',',k+1,')=',x[i,k+1]:10:5); end; writeln; readkey; k:=k+1; until abs(x[n,k]-x[n,k-1])<eps;readkey; END.

71

PROBLEMA 7 (PASCAL) Calcularea soluțiilor sistemului de ecuații liniare utilizînd metoda Gauss - Seidel. REZOLVARE: Program P7; uses crt; const epsad=1E-2; type vector=array[1..20]of real; matrice=array[1..20,1..20]of real; var n,i,j,k:integer; a,x:matrice; b,s1,s2:vector; Begin clrscr; write('Introduceti numarul de ecuatii ale sistemului n='); readln(n); writeln('Introduceti componentele matricei sistemului si termenul liber'); for i:=1 to n do begin for j:=1 to n do begin write('a(',i,',',j,')='); read(a[i,j]); end; write('b(',i,')='); readln(b[i]); end; writeln('Matricea extinsa este:'); for i:=1 to n do begin for j:=1 to n do write(a[i,j]:8:5,' '); writeln(b[i]:8:5); end; writeln;k:=1; for i:=1 to n do x[i,k]:=0; repeat writeln('Numarul iteratiei k=',k); for i:=1 to n do begin s1[i]:=0; s2[i]:=0; for j:=1 to n do begin if ji then s2[i]:=s2[i]+a[i,j]*x[j,k]; end; x[i,k+1]:=(b[i]-s2[i])/a[i,i]; writeln('x(',i,',',k+1,')=',x[i,k+1]:8:5); end; k:=k+1; until abs(x[i,k]-x[i,k-1])<epsad; readkey; end.

72

3.3 Aplicații utilizînd softul Borland Delphi 7.0 Embarcadero Delphi, cunoscut anterior ca CodeGear Delphi și Borland Delphi, este un mediu de dezvoltare a programelor pentru Microsoft Windows, produs inițial de firma americană Borland, deținut și dezvoltat în prezent de Embarcadero Technologies. Delphi 2010 este cea mai recentă versiune și este distribuită în trei ediții: Professional, Enterprise și Architect. Acesta oferă interfețe programatorului pentru a construi o aplicație folosind Extensible Markup Language (XML), Extensible Stylesheet Language (XSL), Simple Object Access Protocol (SOAP) și Web Services Description Language (WSDL). Bazat pe limbajul de programare obiect Pascal. Delphi este un mediu de programare şi nu un limbaj de programare. Aceasta înseamnă că mediul Delphi este un editor în care programatorul scrie instrucţiuni într-un limbaj de programare, folosit pentru dezvoltarea de aplicaţii. Partea cea mai importantă din aplicaţie care se poate construi cu ajutorul mouse-ului este interfaţa. Sistemul de operare Windows a stabilit un set de reguli pe care trebuie să le respecte fiecare aplicaţie pentru a putea fi executată în acest sistem de operare. Fiecare aplicaţie Windows conţine o fereastră, eventual un meniu, butoane, cutii de editare, ş.a.m.d. Există un set finit de obiecte furnizate de către Windows şi care pot alcătui interfaţa aplicaţiei. Vom încerca să construim câteva aplicaţii simple în care vom pune în lumină conceptele de bază ale programării sub mediul Delphi. Aplicațiile obținute, cît și modul de realizare a acestora pot fi vizualizate în Anexa 3

73

CONCLUZII “Analiza numerică este studiul algoritmilor pentru rezolvarea problemelor matematicii continue. ” Lloyd N. Trefethen Cuvîntul cheie este “algoritm”. Deși foarte multe lucrări nu evidențiază acest lucru, în centrul atenției Analizei numerice stă proiectarea și analiza algoritmilor de rezolvare a unei anumite clase de probleme. Problemele sunt cele din matematica continuă. ,,Continuă” înseamnă aici faptul că variabilele ce intervin sunt de tip real sau complex. Deoarece numerele reale și complexe nu pot fi reprezentate exact în calculator, ele trebuie aproximate printr-o reprezentare finită. Din acest moment intervin erorile de rotungire și studiul lor este unul din obiectivele importante ale Analizei numerice. Un argument în sprijinul acestei idei, în afară de omniprezența erorilor, este dat de metodele exacte de rezolvare a sistemelor de ecuații liniare, cum ar fi eliminarea gaussiană. Cele mai multe probleme ale matematicii continue nu pot fi rezolvate prin algoritmi așa-ziși finiți, chiar presupunînd prin absurd că am lucra în aritmetică cu precizie exactă. Un prim exemplu care se poate da aici este problema rezolvării unei ecuații polinomiale. Acest lucru se evidențiază la problemele de valori și vectori proprii, dar apar și în orice problemă ce presupune termeni neliniari sau derivate - determinarea zerourilor, cuadraturi, ecuații diferențiale și integrale, optimizare etc. Metodele numerice - parte din disciplinele fundamentale de pregătire a studenților din domeniul ingineriei, avînd ca scop prezentarea principiilor și relațiilor de calcul matematic, numeric, care astăzi stă la baza construcțiilor programelor de calcul profesionale utilizate în prezent de orice inginer MatCad, MatLab, Mathematica, Nastran, etc. Aceste principii și relații de calcul se referă la operațiile de interpolare, derivare și integrare numerică, precum și la metodele de rezolvare a ecuațiilor, sistemelor de ecuații liniare sau sistemelor de ecuații diferențiale. Algebra liniară și metodele numerice reprezintă secțiunea matematicii computaționale, dedicate studiului de soluționare numerică a problemelor de algebra liniară. Metodele numerice prezentate în lucrare permit rezolvarea unor probleme celebre care au preocupat pe matematiceni și ingineri de-a lungul timpului, unele din acestea purtînd numele lor (Anexa 1). Multe din problemele economice, respectiv din aplicațiile matematicii în alte domenii se reprezintă prin intermediul unor sisteme de ecuații liniare. Sistemele de ecuații liniare este unul dintre domeniile matematicii în care metodele numerice și utilizarea calculatorului și-au demonstrat din plin utilizarea. 74

Rezolvarea sistemelor cu un mare număr de ecuații liniare reprezintă unul din domeniile în care calculatoarele numerice și-au demonstrat din plin eficiența. Problema rezolvării sistemelor de ecuații liniare este foarte des întîlnită în simularea numerică. Nu trebuie uitat că, la reprezentarea numerelor în calculator nu putem reține decît un număr finit de cifre. Se poate ajunge în situația ca din cauza acestor erori, determinantul să devină egal cu zero sau să aibă o valoare foarte mică în modul. Complexitatea implementărilor prezente în bibliotecile matematice se datorează în mare parte tehnicilor de evitare a acestei situații, dar totodată și eforturilor de minimizare a memoriei utilizate și a timpului de calcul. La rezolvarea unor sisteme de ecuații liniare se folosesc diferite metode care au ca scop reducerea numărului de operații elementare în raport cu cele corespunzătoare metodei clasice de utilizare a regulei lui Cramer, adică reducerea numărului de date din memoria calculatorului, scurtarea timpului de calcul și nu în ultimul rind, reducerea erorilor de calcul. Metodele de rezolvare a sistemelor de ecuații liniare sunt de două tipuri: metode directe (metode de eliminare sau metode exacte), în care soluția este obținută în urma unui număr de operații dinainte cunoscut; metode iterative, care se bazează pe folosirea unei aproximații inițiale ce se îmbunătățește de la o etapă la alta. ,,Problemele matematicii continue” sunt problemele pe care știința și ingineria sunt construite, fără metode numerice, știința și ingineria, așa cum sunt ele practicate astăzi ar ajunge repede în impas. Ele sunt de asemenea problemele care au preocupat cei mai mulți matematicieni de la Newton pînă azi. La fel ca și cei ce se ocupă de matematica pură, specialiștii în Analiza numerică sunt moștenitorii marii tradiții a lui Euler, Lagrange, Gauss și a altor mari matematicieni. Din motivele amintite mai sus am încercat să realizez o lucrare în care să existe un echilibru între teorie, aspectele algoritmice și implementările practice. În această teză s-a optat pentru: 1. Prezentarea unor modalităţi de îmbunătăţire a predării metodelor numerice de calcul matriceal, contribuind la dezvoltarea unei gîndiri algoritmice și logico-matematice la elevi și studenţi (vezi capitolul I); 2. Aplicarea metodelor numerice la rezolvarea sistemelor de ecuații liniare (cu și fără parametri), utilizarea algoritmilor de rezolvare pentru fiecare metodă (vezi capitolul II); 3. Elaborarea codurile de program pentru fiecăre metodă în Turbo Pascal 7.0, realizarea unor aplicații în mediul Borland Delphi 7.0 și crearea unit-ului personalizat. Lucrarea este destinată în primul rind pregătirii studenților specialităților cu profil mathematic, informatics și ethnic. Presupune cunoștințe minime din algebra liniară și analiză numerică. Sper ca această lucrare să răspundă nevoilor actuale ale elevilor și studenților. Succese și multă baftă tuturor care doresc să studieze și să se aprofundeze în această secțiune a matematicii computaționale.

75

BIBLIOGRAFIE Capitolul I 1. Alexandru-Ioan Olteanu, Analiză numerică, Editura Alma Mater Sibiu, 202 pagini, 2005. 2. Brânzei Dan şi Roxana, Metodica predării informaticii, Ed. Dacia, București, 2012 3. Brânzei Dan şi Roxana, Metodica predării matematicii, Ed. Paralela 45, Piteşti, 2010 4. M. Popescu, P. Popescu, Metode Numerice, Ed. Reprograph, Craiova, 2009, 180 pag., ISBN 978-973-671-208-1 (editură recunoscută CNCSIS) 5. Web: http://www.scritub.com/profesor-scoala/METODICA-PREDARIIINFORMATICII42919.php (10.02.2016, 19:33) Capitolul II 1. A. Gremalschi, S. Corlat, A. Braicov, Manualul Informatică pentru clasa a-XII-a, edit. Știința, Chișinău - 2010, 144 pag. 2. C. Berbente, S. Mitran, S. Zancu, Metode numerice, edit. Tehnică, București - 1998, 313 pag. 3. C. Ioniță, Sisteme de ecuații liniare și calcul matricial, edit. Printech, București - 1999, 328 pag. 4. G. Coman, Analiză Numerică, edit. Libris, Cluj-Napoca - 1995, 148 pag. 5. J. Bela, Rezolvarea numerică a sistemelor de ecuații liniare, edit. Academia Republicii Populare Române, București - 1961, 222 pag. 6. L. Brăescu, S. Mariș, Metode numerice. Probleme de seminar și lucrări de laborator, Timișoara – 2007, 153 pag 7. L. Chiriac, Metode numerice, Chișinău - 2014, 193 pag. 8. M. Popa, R. Militaru, Metode numerice. Aplicații, 74 pag. 9. M. Popa, R. Militaru, Metode numerice. Note de curs, 45 pag. 10. N. Cotfas, Elemente de algebră liniară, edit. Universității din București, 2009, 200 pag. 11. V. Adrian, M. Cornel, P. Cristian, Metode numerice în inginerie, edit. Universitaria, București 2005, 270 pag. 12. Web: http://www.math.ubbcluj.ro/~bodo/for_students/Sisteme_de_ec.pdf (25.01.2016, 19:37)

76

13. Web: http://www.tmmate.ro/.../Sisteme%20de%20ecuatii%20clasa%20XI%20Popa% (27.02.2016, 16:04)

14. Web: https://match82.wikispaces.com/file/view/metoda+matriceala.doc (20.11.2015, 17:43) Capitolul III 1. Jeffrey R. Chasnov, Introduction to Numerical Methods, The Hong Kong University of Science and Technology, 2012, 63 pag. 2. Steven C. Chapra, Raymond P. Canale, Sixth Edition, ISBN 978–0–07–340106–5, 994 pag. 3. Web: http://moodle.ust.md/course/view.php?id=29 (24.01.2016, 18:39) 4. Web: http://www.scritub.com/stiinta/informatica/Dezvoltarea-rapida-de-aplicati63144.php (04.03.2016, 17:26)

5. Web: https://domashke.net/referati/referaty-po-informatike/kursovaya-rabota-resheniesistemy-linejnyh-uravnenij-metodom-gaussa-i-zhordana-gaussa (28.01.2016, 20:17) 6. В.М. Пестриков, А.Н. Маслобоев, О.К. Федоров, Основы программирования в системе Borland Delphi, Санкт-Петербург 2004, 108 страниц

77

ANEXE Anexa 1: Personalități marcante Gabriel Cramer (1704 – 1752) – matematician elvețian, născut în Geneva. Cele mai remarcabile rezultate în matematică le obține în domeniul algebrei și al probabilității. În 1728 propune o soluție pentru o celebră problemă de teoria probabilităților, numită Paradoxul de la St. Petersburg. În 1730 a creat determinanții, sub formă de algoritm matematic în legătură cu combinările și a elaborat ceea ce ulterior s-a denumit "regula lui Cramer", fiind utilizată la rezolvarea sistemelor de ecuații liniare. La 40 de ani a scris lucrarea sa cel mai valoroasă, un tratat asupra curbelor algebrice intitulat: “Introduction à l'analyse des lignes courbes algébriques”, pe care a publicat-o în 1750. A prezentat printre primii matematicieni, teoria curbelor în toate detaliile lor, folosind în mod foarte fecund: triunghiul analitic, în studiul fenomenelor diverselor ramuri ale unei curbe. Aici se găsește cea mai veche demonstrație a propoziției conform căreia o curbă de gradul n este determinată de n(n+3)/2 puncte ale acesteia aflate într-o poziție generală. Cramer a editat operele a doi dintre frații Bernoulli. A tratat problema formei sferoidale a planetelor și a deplasării în timp a apsidelor acestora. A continuat studiile lui Newton asupra curbelor cubice. O altă contribuție valoroasă care îi poartă numele este paradoxul lui Cramer (legat de intersecția a două curbe de ordin superior).

Carl Friedrich Gauss (1777 – 1855) – matematician și cercetător german, născut în Braunschweig. Spirit precoce, a debutat de la 10-12 ani prin studiul seriei binomiale. De asemenea, și-a uimit profesorii din școala primară prin găsirea unei metode de calcul a sumei întregilor până la 100 astfel: 1 + 100 = 101, 2 + 99 = 101, 3 + 98 = 101, astfel încât e nevoie doar de făcut calculul: 50 × 101 = 5050. În liceu, s-a ocupat de teoria numerelor complexe, iar în teza sa de doctorat (1795) a introdus reprezentarea geometrică a acestora. Între 1834 și 1837, s-a ocupat de resturile pătratice, cu determinarea numărului de clase al formelor pătratice, de numere transcendente. La 17 ani a descoperit metoda celor mai mici pătrate. Opera se axează pe teoria numerelor (fiind considerat creatorul acestui domeniu), analiză matematică, geometrie diferențială, sau statistică, Gauss publicându-și doar o parte din cercetări, într-un stil spartan, astfel încât erau puțini cititori ai operei sale în acele vremuri. De asemenea, a studiat teoria congruențelor, aproximarea fracțiilor zecimale, a completat tabelul numerelor prime. A făcut distincție între congruențele algebrice și cele transcendente și indicat o metodă directă pentru rezolvarea congruențelor binome. În teoria numerelor a introdus semnul de congruență, de apartenență, cel al izomorfismului, iar cel mai important, axiomatizarea acestui domeniu, operă desăvârșită de către Emmy Noether, cercetările fiind continuate de Dirichlet. În 1825 a redactat prima demonstrație completă și riguroasă a celebrei Theorema aureum, adică legea reciprocității resturilor pătratice, ceea ce ulterior va fi cunoscută sub numele de lema lui Gauss. Aceasta este legată de teorema congruențelor și fusese remarcată de Euler încă din 1772. În ceea ce privește algebra, în teza sa de doctorat a demonstrat teorema fundamentală a algebrei, enunțată încă din 1629 de Albert Girard și demonstrată incomplet deD'Alembert și Euler. În 1801 a creat determinanții, iar în 1812 a introdus seria hipergeometrică. În teoria geometrie diferențiale, a obținut formulele fundamentale ale suprafețelor, curbura totală și reprezentarea sferică a acestora. În 1813 a studiat suprafețelor omofocale de ordinul al doilea. De asemenea, s-a ocupat de studiul triunghiurilor areolar-raționale, de problema Snellius-Pothenot și de cea a triunghiului care ulterior va fi numit triunghiul lui Pompeiu. S-a arătat interesat și de existența unei geometrii neeuclidiene, discutând lucrul acesta cu Farkas Bolyai, Gerling sau Schumacher. Când fiul lui Farkas Bolyai, János, descoperă geometria neeuclidiană în 1829, Gauss îi scrie lui 78

Farkas Bolyai: „A-i lăuda munca ar însemna să mă laud pe mine, deoarece conținutul lucrării... coincide aproape cu meditațiile mele, gânduri care mi-au ocupat mintea în ultimii 35 de ani”. Opere importante:  Disquisitiones Arithmeticae, (1801) o lucrare în șapte secțiuni dedicată teoriei numerelor, în afară de ultima parte, dedicată celebrului său poligon cu 17 laturi;  Disquisitiones generales circa seriem infinitam, un tratat riguros asupra seriilor, și o introducere a funcțiilor hipergeometrice;  Methodus nova integralium valores per approximationem inveniendi, un eseu asupra aproximării integralelor;  Bestimmung der Genauigkeit der Beobachtungen (1816), o analiză asupra eficienței estimatorilor statistici;  Theoria combinationis observationum erroribus minimis obnoxiae (1823), lucrare dedicată statisticii, în particular ultimei metode de aproximare a pătratelor perfecte;  Disquisitiones generales circa superficies curva (1828), dedicată geometriei diferențiale, fiind opera sa cea mai cunoscută în acest domeniu;

Prescott Durand Crout (1907 – 1984) - matematician din SUA, născut în Ohio, dar a trăit și a lucrat în Massachusetts. În 1929 a finisat treapta MIT. Teza sa de doctorat a fost intitulată astfel: "Apropierea funcțiilor și integralelor de o combinație liniară de funcții" . El a fost membru al Facultatii de Matematica (1934-1973) și emerit din 1973 pînă la moartea sa în 1984. Elevii lui la MIT au fost Francis Hildebrand (1940), Carl Nordling (1941 ), Frank Bothwell (1946), Norman Painter (1947), Merle Andrew (1948), Frederick Holt (1950), și Carl Steeg, Jr. (1952). Prescott Durand Crout este autor al cartii "Determinarea satisfacerii domeniilor lui Laplace, lui Poisson etc. " El este, probabil, inventatorul matrice descompunerea Crout.

Philipp Ludwig von Seidel (1821 –1896) – matematician german. A lucrat în domeniul matematicii și astronomiei. În 1856, a creat teoria aberațiilor sistemelor optice de al treilea ordin . În anii 1865-1866, bazatîndu-se pe teoria lui Seidel Adolf Hugo Shteyngeylem (fiul fondatorului opticii germane și fabrii optice Carl Shteyngeylya) a proiectat și construit de lentile portret. Aplanat, care a devenit principalul tip de lentile folosit de fotografi la sfârșitul XIX și începutul secolului XX. Folosind un fotometru K.Shteyngeylya, efectuate observatii astronomice pentru a determina luminozitatea stelelor, și în 1863 a publicat lucrarea "Rezultatele măsurătorilor fotometrice 208 stele majore fixe" reprezintă primul catalog stea fotometrice, care are o valoare științifică. În plus, ea determină luminozitatea majore planete, și, de asemenea, a studiat absorbția luminii de atmosfera. În domeniul matematicii pure lucrările lui Seidel se referă în principal la teoria seriilor, precum și alte obiecte de analiza matematica. A publicat în 1874, metoda propusă pentru rezolvarea unui sistem de ecuații algebrice liniare, acum cunoscut sub numele de metoda Seidel sau Gauss - Seidel.

André-Louis Cholesky (1875 - 1918) - ofițer militar francez și matematician. Cholesky sa născut în Montguyon, Franța. Familia lui paternă a fost descendent din familia Cholewski care a emigrat din Polonia în timpul Marii emigrări. A urmat Liceul din Bordeaux și a intrat la École Polytechnique, unde au învățat Camille Iordania și Henri Becquerel. A lucrat în geodezie și hartaluare, a fost implicat în topografie în Creta și Africa de Nord, înainte de primul război mondial el este amintit în primul rând pentru dezvoltarea unei matrice, descompunere cunoscută sub numele de descompunerea Cholesky, care a fost folosită în lucrarea sa topografică. El a servit armata franceză ca ofițer mecanic și a fost ucis în luptă cu câteva luni înainte de sfârșitul primului război mondial; descoperirea sa a fost publicată postum de colegul său ofițer Comandant Benoît în Buletinul Géodésique. 79

Anexa 2: Rezultatele obținute în urma compilării programelor în PASCAL Problema 1: Introducerea dimensiunii matricelor: n=2 Introducerea elementelor matricei A: a[1,1]=2 a[1,2]=4 a[2,1]=6 a[2,2]=8 Introducerea elementelor matricei B: b[1,1]=3 b[1,2]=5 b[2,1]=7 b[2,2]=9 Introducerea scalarului k 5 Introducerea scalarului k 10 Matricea A 2.00 4.00 6.00 8.00 Suma matricelor: A+B 5.00 9.00 13.00 17.00 Produsul matricelor: A*B 34.00 46.00 74.00 102.00 Inmultirea cu un scalar: s1*A 10.00 20.00 30.00 40.00 Patratul matricei A: A*A 28.00 40.00 60.00 88.00 Transpusa matricei A 2.00 6.00 4.00 8.00 Determinantul matricei A: Valoarea determinantului este: Determinantul matricei B: Valoarea determinantului este: Sfarsitul programului

Matrica B 3.00 5.00 7.00 9.00 Diferenta matricelor: A-B -1.00 -1.00 -1.00 -1.00 Produsul matricelor: B*A 36.00 52.00 68.00 100.00 Inmultirea cu un scalar: s2*B 30.00 50.00 70.00 90.00 Patratul matricei B: B*B 44.00 60.00 84.00 116.00 Transpusa matricei B 3.00 7.00 5.00 9.00

-8.00 -8.00

Problema 2: Sistemul 1.00 x1 4.00 x1 2.00 x1 Matricea 1 2 3 4 3 1 2 5 7

initial + 2.00 + 3.00 + 5.00 A este:

este: x2 + 3.00 x3 = x2 + 1.00 x3 = x2 + 7.00 x3 =

2.00 4.00 2.00

80

Metoda lui Cramer: Determinantul matricii sistemului este: 6.00 Minorii sunt: Matricea D1 Matricea D2 2 2 3 1 2 3 4 3 1 4 4 1 2 5 7 2 2 7 Dx1= 22.00 Dx2= -26.00

Matricea D3 1 2 2 4 3 4 2 5 2 Dx3= 14.00

Solutiile sistemului sunt: x[1]= 3.66667 x[2]= -4.33333 x[3]= 2.33333 Metoda lui Gauss: Solutia sistemului este: x1= 3.66667 x2=-4.33333 x3= 2.33333

Problema 3: Introdu n=3 Introdu elementele matricii A: a[1,1]=30 a[2,1]=1 a[1,2]=1 a[2,2]=30 a[1,3]=1 a[2,3]=2 Introdu coloana termenilor liberi, B: b[1]=30 b[2]=29 b[3]=-27 Deschide fisierul LU.txt Dimensiunea matricii patratice: n= 3 Datele initiale, A*X=B: | 30.00 1.00 1.00 | |x1| | 1.00 30.00 2.00 | |x2| | 2.00 1.00 30.00 | |x3| Valoarea determinantilor de colt: | 30.00 | D1= 30.00 Valoarea determinantilor de colt: | 30.00 1.00 | | 1.00 30.00 | D2= 899.00 Valoarea determinantilor de colt: | 30.00 1.00 1.00 | | 1.00 30.00 2.00 | | 2.00 1.00 30.00 | D3= 26855.00 Aplicarea metodei Crout: Factorizarea Crout: Matricea U este: 1.0000 0.0333 0.0000 1.0000 0.0000 0.0000 Matricea L este: 30.0000 0.0000 1.0000 29.9667

a[3,1]=2 a[3,2]=1 a[3,3]=30

| | |

30.00| 29.00| -27.00|

0.0333 0.0656 1.0000 0.0000 0.0000

79

2.0000 0.9333 29.8721 Vectorul intermediar Y: 1.0000 0.9344 -1.0000 Solutia X: 1.0000 1.0000 -1.0000 Aplicarea metodei Doolittle: Factorizarea Doolitte: Matricea U este: 30.0000 1.0000 1.0000 0.0000 29.9667 1.9667 0.0000 0.0000 29.8721 Matricea L este: 1.0000 0.0000 0.0000 0.0333 1.0000 0.0000 0.0667 0.0311 1.0000 Vectorul intermediar Y: 30.0000 28.0000 -29.8721 Solutia X: 1.0000 1.0000 -1.0000

Problema 4: Obtinerea inversei unei matrici patratice, simetrice prin metoda Cholesky (Matricea trebuie sa fie pozitiv definita). Size = 4 Matrix A: 5.000000 -1.000000 -1.000000 -1.000000 -1.000000 5.000000 -1.000000 -1.000000 -1.000000 -1.000000 5.000000 -1.000000 -1.000000 -1.000000 -1.000000 5.000000 Determinant = 432.000000 Matrix Inv(A): 0.250000 0.083333 0.083333 0.083333 0.083333 0.250000 0.083333 0.083333 0.083333 0.083333 0.250000 0.083333 0.083333 0.083333 0.083333 0.250000 Doriti sa verificati (y/n)?: Verificare A * Inv(A) = I: 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000

Problema 5: Introdu dimensiunea matricii A, n=3 Introduceti coeficientii matricei: a(1,1)=5 a(2,1)=5 a(1,2)=2 a(2,2)=-6 a(1,3)=1 a(2,3)=2 Matricea Q este: -0.6155 -0.6155 -0.6155 0.7655 0.4924 0.1876 Matricea R este: -8.1240 3.4466 0.0000 -5.4489 0.0000 1.5591

0.4924 0.1876 0.8499 -1.3540 1.1032 1.7175

a(3,1)=-4 a(3,2)=2 a(3,3)=1 Matricea Q este: -0.6155 -0.7272 -0.6155 0.6844 0.4924 -0.0535 Matricea R este: -8.1240 3.4466 0.0000 -5.6676 0.0000 0.0000

-0.3041 -0.3909 -0.8687 -1.3540 0.5881 -1.9547

*Soluția exactă a sistemului este: S  1; 2; 3 80

Problema 6: Introdu numarul de ecuatii ale sistemului n=3 Introdu componentele matricii sistemului si termenilor liberi a(1,1)=30 a(1,2)=1 a(1,3)=1 b(1)=30 Matricea extinsa este: 30.00000 1.00000 2.00000

1.00000 30.00000 1.00000

Numarul iteratiei k=1 x(1,2)= x(2,2)= x(3,2)=

1.00000 0.96667 -0.90000

a(2,1)=1 a(2,2)=30 a(2,3)=2 b(2)=29 1.00000 2.00000 30.00000

a(3,1)=2 a(3,2)=1 a(3,3)=30 b(3)=-27

30.00000 29.00000 -27.00000

Numarul iteratiei k=2 x(1,3)= x(2,3)= x(3,3)=

0.99778 0.99333 -0.99889

Numarul iteratiei k=3 x(1,4)= x(2,4)= x(3,4)=

1.00019 1.00000 -0.99963

Problema 7: Introduceti numarul de ecuatii ale sistemului n=3 Introduceti componentele matricei sistemului si termenul liber a(1,1)=30 a(2,1)=1 a(1,2)=1 a(2,2)=2 a(1,3)=1 a(2,3)=30 b(1)=30 b(2)=29 Matricea extinsa este: 30.00000 1.00000 1.00000 30.00000 1.00000 2.00000 30.00000 29.00000 2.00000 1.00000 -27.00000 30.00000 Numarul iteratiei k=1 x(1,2)= 1.00000 x(2,2)=14.50000 x(3,2)=-1.11111

a(3,1)=2 a(3,2)=1 a(3,3)=-27 b(3)=30

Numarul iteratiei k=2 x(1,3)= 0.55370 x(2,3)=31.16667 x(3,3)=-1.11111

81

Anexa 3: Aplicații utilizînd softul Borland Delphi 7.0 Aplicația 1: (Sisteme 2 x 2) Rezolvarea sistemelor de ecuații liniare utilizînd metoda grafică.

Realizare: 1. File / New Application. 2. Plasăm pe formă componente conform imaginii de mai sus ( vom avea 15 etichete, 6 casete de editare, 4 componente Panel și 2 butoane). 3. Stabilim pentru proprietatea Text a componentelor Edit valorile implicite. Stabilim pentru proprietatea Caption a componentelor Panel valoare nulă (componentele Panel astfel vor fi fără de nici o valoare). 4. Prelucrăm evenimentul OnClick pentru componentele Button1 pentru a afișa coordonatele celor două ecuații pe care le vom construi cu ajutorul formei a doua. 5. Creăm forma a doua, si stabilim culoarea albă ca fundal, stabilim legătura dintre forma 1 și forma 2. 6. Prelucrăm evenimentele OnPaint și OnResize pentru forma 2. Aci vom desena sistemul de coordonate, apoi vom plasa în acest sistem intervalul [-9,9] pe Ox si pe Oy. 7. Coordonatele punctului de intersecție a celor două drepte se va afișa ca un mesaj aparte, prelucrăm evenimentul OnClick pentru forma 2. 8. Lansăm aplicaţia la execuţie.

82

Codul sursă: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; Label10: TLabel; Label11: TLabel; Label12: TLabel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Edit6: TEdit; Panel1: TPanel; Panel2: TPanel; Panel3: TPanel; Panel4: TPanel; Button1: TButton; Button2: TButton; Label13: TLabel; Label14: TLabel; Label15: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; k1,k2,k3,k4,k5,k6:real; implementation Uses Unit2; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin // Ecuatia dreptei 1 k1:= - strtofloat(Edit1.Text)/strtofloat(Edit2.Text); Panel1.Caption:= floattostr(k1); k2:= strtofloat(Edit3.Text)/strtofloat(Edit2.Text); Panel2.Caption:= floattostr(k2); // Ecuatia dreptei 2

83

k3:= - strtofloat(Edit4.Text)/strtofloat(Edit5.Text); Panel3.Caption:= floattostr(k3); k4:= strtofloat(Edit6.Text)/strtofloat(Edit5.Text); Panel4.Caption:= floattostr(k4); end; procedure TForm1.Button2Click(Sender: TObject); begin Form2.ShowModal; end; end.

Aplicația 2: (Sisteme 3 x 3) Rezolvarea sistemelor de ecuații liniare utilizînd metoda lui Cramer.

Realizare: 1. File / New Application. 2. Plasăm pe formă componente conform imaginii de mai sus ( vom avea 12 etichete, 12 casete de editare, 43 componente Panel și 3 butoane). 3. Stabilim pentru proprietatea Text a componentelor Edit valoare nulă (casetele Edit astfel vor fi fără de nici o valoare). Stabilim pentru proprietatea Caption a componentelor Panel valoare nulă (componentele Panel astfel vor fi fără de nici o valoare). 4. Prelucrăm evenimentul OnClick pentru componentele Panel10, Panel20, Panel30 și Panel40 pentru a afișa determinanții.

84

5. Prelucrăm evenimentul OnClick pentru componentele Button 1 ( va calcula fiecare determinant aparte), Button2 (va rezolva sistemul, afișînd soluțiile acestuia) și Button3 ( va curăța toate componentele Edit și Panel din forma dată). 6. Lansăm aplicaţia la execuţie. Codul sursă: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Panel1: TPanel; Panel2: TPanel; Panel3: TPanel; Panel4: TPanel; Panel5: TPanel; Panel6: TPanel; Panel7: TPanel; Panel8: TPanel; Panel9: TPanel; Panel10: TPanel; Panel11: TPanel; Panel12: TPanel; Panel13: TPanel; Panel14: TPanel; Panel15: TPanel; Panel16: TPanel; Panel17: TPanel; Panel18: TPanel; Panel19: TPanel; Panel20: TPanel; Panel21: TPanel; Panel22: TPanel; Panel23: TPanel; Panel24: TPanel; Panel25: TPanel; Panel26: TPanel; Panel27: TPanel; Panel28: TPanel; Panel29: TPanel; Panel30: TPanel; Panel31: TPanel; Panel32: TPanel; Panel33: TPanel; Panel34: TPanel; Panel35: TPanel; Panel36: TPanel; Panel37: TPanel; Panel38: TPanel; Panel39: TPanel; Panel40: TPanel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit;

85

Edit4: TEdit; Edit5: TEdit; Edit6: TEdit; Edit7: TEdit; Edit8: TEdit; Edit9: TEdit; Edit10: TEdit; Edit11: TEdit; Edit12: TEdit; Button1: TButton; Panel41: TPanel; Panel42: TPanel; Panel43: TPanel; Button2: TButton; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; Label10: TLabel; Label11: TLabel; Label12: TLabel; Label13: TLabel; Label14: TLabel; Button3: TButton; procedure Panel10Click(Sender: procedure Panel20Click(Sender: procedure Panel30Click(Sender: procedure Panel40Click(Sender: procedure Button1Click(Sender: procedure Button2Click(Sender: procedure Button3Click(Sender: private { Private declarations } public { Public declarations } end;

TObject); TObject); TObject); TObject); TObject); TObject); TObject);

var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Panel10Click(Sender: TObject); begin Panel1.Caption:= Edit1.Text; Panel2.Caption:= Edit2.Text; Panel3.Caption:= Edit3.Text; Panel4.Caption:= Edit5.Text; Panel5.Caption:= Edit6.Text; Panel6.Caption:= Edit7.Text; Panel7.Caption:= Edit9.Text; Panel8.Caption:= Edit10.Text; Panel9.Caption:= Edit11.Text; end;

86

procedure TForm1.Panel20Click(Sender: TObject); begin Panel11.Caption:= Edit4.Text; Panel12.Caption:= Edit2.Text; Panel13.Caption:= Edit3.Text; Panel14.Caption:= Edit8.Text; Panel15.Caption:= Edit6.Text; Panel16.Caption:= Edit7.Text; Panel17.Caption:= Edit12.Text; Panel18.Caption:= Edit10.Text; Panel19.Caption:= Edit11.Text; end; procedure TForm1.Panel30Click(Sender: TObject); begin Panel21.Caption:= Edit1.Text; Panel22.Caption:= Edit4.Text; Panel23.Caption:= Edit3.Text; Panel24.Caption:= Edit5.Text; Panel25.Caption:= Edit8.Text; Panel26.Caption:= Edit7.Text; Panel27.Caption:= Edit9.Text; Panel28.Caption:= Edit12.Text; Panel29.Caption:= Edit11.Text; end; procedure TForm1.Panel40Click(Sender: TObject); begin Panel31.Caption:= Edit1.Text; Panel32.Caption:= Edit2.Text; Panel33.Caption:= Edit4.Text; Panel34.Caption:= Edit5.Text; Panel35.Caption:= Edit6.Text; Panel36.Caption:= Edit8.Text; Panel37.Caption:= Edit9.Text; Panel38.Caption:= Edit10.Text; Panel39.Caption:= Edit12.Text; end; procedure TForm1.Button1Click(Sender: TObject); var k,k1,k2,k3:real; begin k:=Strtofloat(Panel1.Caption) *Strtofloat(Panel5.Caption) *Strtofloat(Panel9.Caption) +Strtofloat(Panel4.Caption) *Strtofloat(Panel8.Caption) *Strtofloat(Panel3.Caption) +Strtofloat(Panel2.Caption) *Strtofloat(Panel6.Caption) *Strtofloat(Panel7.Caption) -Strtofloat(Panel3.Caption) *Strtofloat(Panel5.Caption) *Strtofloat(Panel7.Caption) Strtofloat(Panel2.Caption) *Strtofloat(Panel4.Caption) *Strtofloat(Panel9.Caption) -Strtofloat(Panel6.Caption) *Strtofloat(Panel8.Caption) *Strtofloat(Panel1.Caption); Panel10.Caption:= Floattostr(k); k1:=Strtofloat(Panel11.Caption) *Strtofloat(Panel15.Caption) *Strtofloat(Panel19.Caption) +Strtofloat(Panel14.Caption) *Strtofloat(Panel18.Caption) *Strtofloat(Panel13.Caption) +Strtofloat(Panel12.Caption) *Strtofloat(Panel16.Caption) *Strtofloat(Panel17.Caption) -Strtofloat(Panel13.Caption) *Strtofloat(Panel15.Caption) *Strtofloat(Panel17.Caption)-

87

Strtofloat(Panel12.Caption) *Strtofloat(Panel14.Caption) *Strtofloat(Panel19.Caption) -Strtofloat(Panel16.Caption) *Strtofloat(Panel18.Caption) *Strtofloat(Panel11.Caption); Panel20.Caption:= Floattostr(k1); k2:=Strtofloat(Panel21.Caption) *Strtofloat(Panel25.Caption) *Strtofloat(Panel29.Caption) +Strtofloat(Panel24.Caption) *Strtofloat(Panel28.Caption) *Strtofloat(Panel23.Caption)+ Strtofloat(Panel22.Caption) *Strtofloat(Panel26.Caption) *Strtofloat(Panel27.Caption) -Strtofloat(Panel23.Caption) *Strtofloat(Panel25.Caption) *Strtofloat(Panel27.Caption)Strtofloat(Panel22.Caption) *Strtofloat(Panel24.Caption) *Strtofloat(Panel29.Caption)-Strtofloat(Panel26.Caption) *Strtofloat(Panel28.Caption)*Strtofloat(Panel21.Caption); Panel30.Caption:= Floattostr(k2); k3:=Strtofloat(Panel31.Caption) *Strtofloat(Panel35.Caption) *Strtofloat(Panel39.Caption) +Strtofloat(Panel34.Caption) *Strtofloat(Panel38.Caption) *Strtofloat(Panel33.Caption)+ Strtofloat(Panel32.Caption) *Strtofloat(Panel36.Caption) *Strtofloat(Panel37.Caption) -Strtofloat(Panel33.Caption) *Strtofloat(Panel35.Caption) *Strtofloat(Panel37.Caption)Strtofloat(Panel32.Caption) *Strtofloat(Panel34.Caption) *Strtofloat(Panel39.Caption) -Strtofloat(Panel36.Caption) *Strtofloat(Panel38.Caption) *Strtofloat(Panel31.Caption); Panel40.Caption:= Floattostr(k3); end; procedure TForm1.Button2Click(Sender: TObject); var s1,s2,s3:real; begin s1:= strtofloat(Panel20.Caption)/strtofloat(Panel10.Caption); Panel41.Caption:=floattostr(s1); s2:= strtofloat(Panel30.Caption)/strtofloat(Panel10.Caption); Panel42.Caption:= floattostr(s2); s3:= strtofloat(Panel40.Caption)/strtofloat(Panel10.Caption); Panel43.Caption:= floattostr(s3); end; procedure TForm1.Button3Click(Sender: TObject); begin Edit1.text:=''; Edit2.text:=''; Edit3.text:=''; Edit4.text:=''; Edit5.text:=''; Edit6.text:=''; Edit7.text:=''; Edit8.text:=''; Edit9.text:=''; Edit10.text:=''; Edit11.text:=''; Edit12.text:=''; Panel1.Caption:=''; Panel2.Caption:=''; Panel3.Caption:=''; Panel4.Caption:=''; Panel5.Caption:=''; Panel6.Caption:=''; Panel7.Caption:=''; Panel8.Caption:=''; Panel9.Caption:=''; Panel10.Caption:=''; Panel11.Caption:=''; Panel12.Caption:=''; Panel13.Caption:=''; Panel14.Caption:=''; Panel15.Caption:=''; Panel16.Caption:=''; Panel17.Caption:=''; Panel18.Caption:=''; Panel19.Caption:=''; Panel20.Caption:=''; Panel21.Caption:=''; Panel22.Caption:=''; Panel23.Caption:=''; Panel24.Caption:=''; Panel25.Caption:=''; Panel26.Caption:=''; Panel27.Caption:=''; Panel28.Caption:='';

88

Panel29.Caption:=''; Panel31.Caption:=''; Panel33.Caption:=''; Panel35.Caption:=''; Panel37.Caption:=''; Panel39.Caption:=''; Panel41.Caption:=''; Panel43.Caption:='';

Panel30.Caption:=''; Panel32.Caption:=''; Panel34.Caption:=''; Panel36.Caption:=''; Panel38.Caption:=''; Panel40.Caption:=''; Panel42.Caption:='';

end; end.

Aplicația 3: (Sisteme 4 x 4) Rezolvarea sistemelor de ecuații liniare utilizînd metoda clasică a lui Gauss (obținerea matricii superior triunghiulare)

Realizare: 1. File / New Application. 2. Plasăm pe formă componente conform imaginii de mai sus ( vom avea 8 etichete, 20 casete de editare, 24 componente Panel și 6 butoane). 3. Stabilim pentru proprietatea Text a componentelor Edit valorile implicite. Stabilim pentru proprietatea Caption a componentelor Panel valoare nulă (componentele Panel astfel vor fi fără de nici o valoare). 4. Prelucrăm evenimentul OnClick pentru componentele Button1, Button2, Button3 și Button4 pentru a afișa coloanele matricii triunghiulare. 5. Prelucrăm evenimentul OnClick pentru componentele Button5 ( va afișa soluțiile sistemului) și Button6 ( va curăța toate componentele Edit și Panel din forma dată). 89

6. Lansăm aplicaţia la execuţie. Codul sursă: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Panel1: TPanel; Panel2: TPanel; Panel3: TPanel; Panel4: TPanel; Panel5: TPanel; Panel6: TPanel; Panel7: TPanel; Panel8: TPanel; Panel9: TPanel; Panel10: TPanel; Panel11: TPanel; Panel12: TPanel; Panel13: TPanel; Panel14: TPanel; Panel15: TPanel; Panel16: TPanel; E1: TEdit; E2: TEdit; E3: TEdit; E4: TEdit; E6: TEdit; E7: TEdit; E8: TEdit; E9: TEdit; E10: TEdit; E11: TEdit; E12: TEdit; E13: TEdit; E14: TEdit; E15: TEdit; E16: TEdit; E5: TEdit; Label1: TLabel; Label2: TLabel; E17: TEdit; E18: TEdit; E19: TEdit; E20: TEdit; Panel17: TPanel; Panel18: TPanel; Panel19: TPanel; Panel20: TPanel; Label3: TLabel; Button2: TButton; Button3: TButton; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel;

90

Panel21: TPanel; Panel22: TPanel; Panel23: TPanel; Panel24: TPanel; Label8: TLabel; Label9: TLabel; Label10: TLabel; Label11: TLabel; Label12: TLabel; Label13: TLabel; Label14: TLabel; Label15: TLabel; Button4: TButton; Button5: TButton; Button6: TButton; Button7: TButton; Label16: TLabel; procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); procedure Button7Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,P16:real; k1,k2,k3,k4,k5,k6,k7,k8,k9:real; s1,s2,s3,s4,s5:real; r1,r2,r3,r4:real; implementation {$R *.dfm} procedure TForm1.Button4Click(Sender: TObject); begin // Coloana I Panel1.Caption:= '1'; Panel5.Caption:= '0'; Panel9.Caption:= '0'; Panel13.Caption:= '0'; // Coloana II P1:= strtofloat(E2.Text)/strtofloat(E1.Text); Panel2.Caption:= floattostr(P1); P5:= P1-(strtofloat(E6.Text)/strtofloat(E5.Text)); Panel6.Caption:= floattostr(P5); P9:= P1-(strtofloat(E10.Text)/strtofloat(E9.Text)); Panel10.Caption:= floattostr(P9); P13:= P1-(strtofloat(E14.Text)/strtofloat(E13.Text)); Panel14.Caption:= floattostr(P13); // Coloana III P2:= strtofloat(E3.Text)/strtofloat(E1.Text); Panel3.Caption:= floattostr(P2); P6:= P2-(strtofloat(E7.Text)/strtofloat(E5.Text)); Panel7.Caption:= floattostr(P6); P10:= P2-(strtofloat(E11.Text)/strtofloat(E9.Text));

91

Panel11.Caption:= floattostr(P10); P14:= P2-(strtofloat(E15.Text)/strtofloat(E13.Text)); Panel15.Caption:= floattostr(P14); // Coloana IV P3:= strtofloat(E4.Text)/strtofloat(E1.Text); Panel4.Caption:= floattostr(P3); P7:= P3-(strtofloat(E8.Text)/strtofloat(E5.Text)); Panel8.Caption:= floattostr(P7); P11:= P3-(strtofloat(E12.Text)/strtofloat(E9.Text)); Panel12.Caption:= floattostr(P11); P15:= P3-(strtofloat(E16.Text)/strtofloat(E13.Text)); Panel16.Caption:= floattostr(P15); // Coloana termenilor liberi P4:= strtofloat(E17.Text)/strtofloat(E1.Text); Panel17.Caption:= floattostr(P4); P8:= P4-(strtofloat(E18.Text)/strtofloat(E5.Text)); Panel18.Caption:= floattostr(P8); P12:= P4-(strtofloat(E19.Text)/strtofloat(E9.Text)); Panel19.Caption:= floattostr(P12); P16:= P4-(strtofloat(E20.Text)/strtofloat(E13.Text)); Panel20.Caption:= floattostr(P16); end; procedure TForm1.Button5Click(Sender: TObject); begin // Coloana I Panel1.Caption:= '1'; Panel5.Caption:= '0'; Panel9.Caption:= '0'; Panel13.Caption:= '0'; // Coloana II Panel6.Caption:= '1'; Panel10.Caption:= '0'; Panel14.Caption:= '0'; // Coloana III k1:= P6/P5; Panel7.Caption:=floattostr(k1); k2:= k1-P10/P9; Panel11.Caption:=floattostr(k2); k3:= k1-P14/P13; Panel15.Caption:=floattostr(k3); // Coloana IV k4:= P7/P5; Panel8.Caption:=floattostr(k4); k5:= k4-P11/P9; Panel12.Caption:=floattostr(k5); k6:= k4-P15/P13; Panel16.Caption:=floattostr(k6); // Coloana termenilor liberi k7:= P8/P5; Panel8.Caption:=floattostr(k7); k8:= k7-P12/P9; Panel12.Caption:=floattostr(k8); k9:= k7-P16/P13; Panel16.Caption:=floattostr(k9); end; procedure TForm1.Button6Click(Sender: TObject); begin // Coloana I Panel1.Caption:= '1'; Panel5.Caption:= '0'; Panel9.Caption:= '0'; Panel13.Caption:= '0'; // Coloana II Panel6.Caption:= '1'; Panel10.Caption:= '0'; Panel14.Caption:= '0'; // Coloana III Panel11.Caption:= '1'; Panel15.Caption:= '0';

92

// Coloana IV s1:=k5/k2; Panel12.Caption:= floattostr(s1); s2:=s1-k6/k3; Panel16.Caption:= floattostr(s2); // Coloana termenilor liberi s3:=k8/k2; Panel19.Caption:= floattostr(s3); s4:=s3-k9/k3; Panel20.Caption:= floattostr(s4); end; procedure TForm1.Button7Click(Sender: TObject); begin // Coloana I Panel1.Caption:= '1'; Panel5.Caption:= '0'; Panel9.Caption:= '0'; Panel13.Caption:= '0'; // Coloana II Panel6.Caption:= '1'; Panel10.Caption:= '0'; Panel14.Caption:= '0'; // Coloana III Panel11.Caption:= '1'; Panel15.Caption:= '0'; // Coloana IV Panel16.Caption:= '1'; // Coloana termenilor liberi s5:=s4/s2; Panel20.Caption:= floattostr(s5); end; procedure TForm1.Button2Click(Sender: TObject); begin r1:=s5/strtofloat(Panel16.Caption); Panel24.Caption:=floattostr(r1); r2:=s3-s1*r1; Panel23.Caption:=floattostr(r2); r3:=k7-k4*r1-k1*r2; Panel22.Caption:=floattostr(r3); r4:=p4-p3*r1-p2*r2-p1*r3; Panel21.Caption:=floattostr(r4); end; procedure TForm1.Button3Click(Sender: TObject); begin E1.text:=''; E2.text:=''; E3.text:=''; E4.text:=''; E5.text:=''; E6.text:=''; E7.text:=''; E8.text:=''; E9.text:=''; E10.text:=''; E11.text:=''; E12.text:=''; E13.text:=''; E14.text:=''; E15.text:=''; E16.text:=''; E17.text:=''; E18.text:=''; E19.text:=''; E20.text:=''; Panel1.Caption:=''; Panel3.Caption:=''; Panel5.Caption:=''; Panel7.Caption:=''; Panel9.Caption:=''; Panel11.Caption:=''; Panel13.Caption:=''; Panel15.Caption:=''; Panel17.Caption:=''; Panel19.Caption:=''; Panel21.Caption:=''; Panel23.Caption:='';

Panel2.Caption:=''; Panel4.Caption:=''; Panel6.Caption:=''; Panel8.Caption:=''; Panel10.Caption:=''; Panel12.Caption:=''; Panel14.Caption:=''; Panel16.Caption:=''; Panel18.Caption:=''; Panel20.Caption:=''; Panel22.Caption:=''; Panel24.Caption:='';

end; end.

93

Aplicația 4: (Sisteme 10 x 10) Rezolvarea sistemelor de ecuații liniare utilizînd metoda lui Gauss

Realizare: 1. File / New Application. 2. Plasăm pe formă componente conform imaginii de mai sus ( vom avea 4 etichete, o casetă de editare, 3 componente Stringgrid și 2 butoane). 3. Stabilim pentru proprietatea Text a componentei Edit valoarea conform imaginii de mai sus. 4. Prelucrăm evenimentul OnChange pentru component Edit. 5. Prelucrăm evenimentul OnCreate pentru Forma. 6. Prelucrăm evenimentul OnClick pentru componentele Button1 și Button2. 7. Lansăm aplicaţia la execuţie. Codul sursă: unit Unit3; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls, jpeg, ExtCtrls; const MaxDimension = 10; type Vector = array[1..MaxDimension] of Double; Matrix = array[1..MaxDimension] of Vector; TForm3 = class(TForm) Label1: TLabel; Edit1: TEdit; StringGrid1: TStringGrid; StringGrid2: TStringGrid;

94

Button1: TButton; Label2: TLabel; Label3: TLabel; ListBox1: TListBox; Button2: TButton; Label4: TLabel; Image1: TImage; procedure Edit1Change(Sender: TObject); procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form3: TForm3; Implementation {$R *.dfm} procedure TForm3.Button1Click(Sender: TObject); var a: Matrix; b,x: Vector; h: Double; i,j,k,n:integer; begin n := StrToIntDef(Text, StringGrid1.ColCount); for j := 0 to n - 1 do for i := 0 to n - 1 do a[i + 1, j + 1] := StrToFloatDef(StringGrid1.Cells[j, i], 0); for I := 0 to n - 1 do b[i + 1] := StrToFloatDef(StringGrid2.Cells[0, i], 0); for i:=1 to n-1 do for j:=i+1 to n do begin a[j,i]:=-a[j,i]/a[i,i]; for k:=i+1 to n do a[j,k]:=a[j,k]+a[j,i]*a[i,k]; b[j]:=b[j]+a[j,i]*b[i] end; x[n]:=b[n]/a[n,n]; for i:=n-1 downto 1 do begin h:=b[i]; for j:=i+1 to n do h:=h-x[j]*a[i,j]; x[i]:=h/a[i,i] end; for i:=1 to n do ListBox1.Items.Append('x(' + IntToStr(i) + ')=' + FloatToStr(x[i])); end; procedure TForm3.Edit1Change(Sender: TObject); begin with StringGrid1, Edit1 do begin ColCount := StrToIntDef(Text, 3); RowCount := StrToIntDef(Text, 3); end; with StringGrid2, Edit1 do

95

RowCount := StrToIntDef(Text, 3) end; procedure TForm3.FormCreate(Sender: TObject); var i, j: integer; begin Randomize; for I := 0 to StrToIntDef(Text, StringGrid1.ColCount) - 1 do for J := 0 to StrToIntDef(Text, StringGrid1.RowCount) - 1 do StringGrid1.Cells[I, J] := IntToStr(Random(100)); for I := 0 to StrToIntDef(Text, StringGrid2.RowCount) - 1 do StringGrid2.Cells[0, I] := IntToStr(Random(100)) end; procedure TForm3.Button2Click(Sender: TObject); begin ListBox1.Items.Clear; end; end.

Aplicația 5: (Sisteme 3 x 3) Rezolvarea sistemelor de ecuații liniare utilizînd Factorizarea LU (Doolittle & Crout).

Realizare: 1. File / New Application. 2. Plasăm pe formă componente conform imaginii de mai sus ( vom avea 8 etichete, 12 casete de editare, 48 componente Panel și 4 butoane). 3. Stabilim pentru proprietatea Text a componentelor Edit valorile și pentru proprietatea Caption a componentelor Panel valori conform imaginii de mai sus.

96

4. Prelucrăm evenimentul OnClick pentru componentele Button1 (afișează descompunerea LU după Doolittle), Button2 (rezolvă Doolittle). 5. Prelucrăm evenimentul OnClick pentru componentele Button3 (afișează descompunerea LU după Crout), Button4 (rezolvă Crout). 6. Lansăm aplicaţia la execuţie. Codul sursă: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, jpeg, ExtCtrls, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Edit6: TEdit; Edit7: TEdit; Edit8: TEdit; Edit9: TEdit; Edit10: TEdit; Edit11: TEdit; Edit12: TEdit; Panel1: TPanel; Panel2: TPanel; Panel3: TPanel; Panel4: TPanel; Panel5: TPanel; Panel6: TPanel; Panel7: TPanel; Panel8: TPanel; Panel9: TPanel; Panel10: TPanel; Panel11: TPanel; Panel12: TPanel; Panel13: TPanel; Panel14: TPanel; Panel15: TPanel; Panel16: TPanel; Panel17: TPanel; Panel18: TPanel; Panel43: TPanel; Panel46: TPanel; Panel44: TPanel; Panel47: TPanel; Panel45: TPanel; Panel48: TPanel; Button1: TButton; Panel19: TPanel; Panel20: TPanel; Panel21: TPanel; Panel22: TPanel;

97

Panel23: TPanel; Panel24: TPanel; Panel25: TPanel; Panel26: TPanel; Panel27: TPanel; Panel28: TPanel; Panel29: TPanel; Panel30: TPanel; Panel31: TPanel; Panel32: TPanel; Panel33: TPanel; Panel34: TPanel; Panel35: TPanel; Panel36: TPanel; Panel37: TPanel; Panel38: TPanel; Panel39: TPanel; Panel40: TPanel; Panel41: TPanel; Panel42: TPanel; Button2: TButton; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label6: TLabel; Label5: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; Button3: TButton; Button4: TButton; procedure Button3Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; l1,l2,l3,u1,u2,u3,u4,u5,u6,y1,y2,y3,x1,x2,x3:real; s1,s2,s3,k1,k2,k3,k4,k5,k6,z1,z2,z3,w1,w2,w3:real; implementation {$R *.dfm} procedure TForm1.Button3Click(Sender: TObject); begin u1:=strtofloat(Edit1.Text); l1:=strtofloat(Edit5.Text)/u1; l2:=strtofloat(Edit9.Text)/u1; u2:=strtofloat(Edit2.Text); u4:=strtofloat(Edit6.Text)-l1*u2; l3:=(strtofloat(Edit10.Text)-l2*u2)/u4; u3:=strtofloat(Edit3.Text); u5:=strtofloat(Edit7.Text)-l1*u3; u6:=strtofloat(Edit11.Text)-l2*u3-l3*u5; // Afisare matricea L

98

Panel4.Caption:=floattostr(l1); Panel7.Caption:=floattostr(l2); Panel8.Caption:=floattostr(l3); // Afisare matricea U Panel10.Caption:=floattostr(u1); Panel11.Caption:=floattostr(u2); Panel12.Caption:=floattostr(u3); Panel14.Caption:=floattostr(u4); Panel15.Caption:=floattostr(u5); Panel18.Caption:=floattostr(u6); end; procedure TForm1.Button1Click(Sender: TObject); begin // Rezolvam sistemul: L*Y=B y1:=strtofloat(Edit4.Text); y2:=strtofloat(Edit8.Text)-l1*y1; y3:=strtofloat(Edit12.Text)-l2*y1-l3*y2; // Afisare Y Panel37.Caption:=floattostr(y1); Panel38.Caption:=floattostr(y2); Panel39.Caption:=floattostr(y3); // Rezolvam sistemul: U*X=Y x3:=y3/u6; x2:=(y2-u5*x3)/u4; x1:=(y1-u3*x3-u2*x2)/u1; // Afisare X Panel40.Caption:=floattostr(x1); Panel41.Caption:=floattostr(x2); Panel42.Caption:=floattostr(x3); end; procedure TForm1.Button4Click(Sender: TObject); begin k1:=Strtofloat(Edit1.Text); k2:=Strtofloat(Edit5.Text); k3:=Strtofloat(Edit9.Text); s1:=Strtofloat(Edit2.Text)/k1; k4:=Strtofloat(Edit6.Text)-k2*s1; k5:=Strtofloat(Edit10.Text)-k3*s1; s2:=Strtofloat(Edit3.Text)/k1; s3:=(Strtofloat(Edit7.Text)-k2*s2)/k4; k6:=Strtofloat(Edit11.Text)-k3*s2-k5*s3; // Afisare matricea L Panel29.Caption:=floattostr(s1); Panel30.Caption:=floattostr(s2); Panel33.Caption:=floattostr(s3); // Afisare matricea U Panel19.Caption:=floattostr(k1); Panel22.Caption:=floattostr(k2); Panel25.Caption:=floattostr(k3); Panel23.Caption:=floattostr(k4); Panel26.Caption:=floattostr(k5); Panel27.Caption:=floattostr(k6); end; procedure TForm1.Button2Click(Sender: TObject); begin // Rezolvam sistemul: L*Y=B z1:=strtofloat(Edit4.Text)/k1; z2:=(strtofloat(Edit8.Text)-k2*z1)/k4;

99

z3:=(strtofloat(Edit12.Text)-k3*z1-k5*z2)/k6; // Afisare Y Panel43.Caption:=floattostr(z1); Panel44.Caption:=floattostr(z2); Panel45.Caption:=floattostr(z3); // Rezolvam sistemul: U*X=Y w3:=z3; w2:=z2-s3*w3; w1:=z1-s1*w2-s2*w3; // Afisare X Panel46.Caption:=floattostr(w1); Panel47.Caption:=floattostr(w2); Panel48.Caption:=floattostr(w3); end; end.

Aplicația 6: (Sisteme 30 x 30 ) Rezolvarea sistemelor de ecuații liniare utilizînd unit-ul UMnsistem: (Anexa 4)  Metoda Gauss de eliminare;  Metoda Gauss cu pivot parțial;  Metoda de factorizare LU;  Metoda Gauss – Seidel. Exemplu:

Realizarea: 1. File / New Application. 2. Plasăm pe formă componente conform imaginii de mai sus ( vom avea 3 etichete, 3 componente Memo și 2 butoane).

100

3. Stabilim pentru proprietatea Caption a componentelor Label și Button valori conform imaginii de mai sus. Pentru proprietatea Lines a primei componente Memo, stabilim textul din imagine. 4. Vom introduce în clauza Uses cuvîntul: UMnsistem. Astfel vom putea face trimitere la Unit-ul personalizat, de unde vom utiliza datele pentru metoda lui Gauss cu pivot partial. 5. Prelucrăm evenimentul OnClick pentru componentele Button1 (citirea datelor din fișier), Button2 (rezolvă sistemul de ecuații). Prelucrăm evenimentul OnActivate pentru Forma. 6. Lansăm aplicaţia la execuţie. Codul sursă: unit U_GaussianElim; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, UMnsistem, ShellAPI; type TForm1 = class(TForm) SolveBtn: TButton; OpenDialog1: TOpenDialog; Memo1: TMemo; Memo2: TMemo; Memo3: TMemo; Label1: TLabel; ReadBtn: TButton; Label2: TLabel; Label3: TLabel; procedure SolveBtnClick(Sender: TObject); procedure ReadBtnClick(Sender: TObject); procedure FormActivate(Sender: TObject); public fileloaded:Boolean; procedure GetDataFromFile(var Dimen : integer; var Coefficients : TNmatrix; var Constants : TNvector); procedure Results(Dimen : integer; var Coefficients : TNmatrix; var Constants : TNvector; var Solution : TNvector; Error : byte); end; var Form1: TForm1; implementation {$R *.DFM} var Dimen : integer; Coefficients : TNmatrix; Constants : TNvector; Solution : TNvector;

{ { { {

Dimensiunea matricii patrate } Matricea} Termenii liberi din ecuatie } Solutia sistemului de ecuatii}

101

Error : byte;

{ Semn de alarma daca ceva nu a mers corect}

procedure Initial(var Dimen : integer; var Coefficients : TNmatrix; var Constants : TNvector); begin Dimen := 0; FillChar(Coefficients, SizeOf(Coefficients), 0); FillChar(Constants, SizeOf(Constants), 0); end; procedure TForm1.GetDataFromFile(var Dimen : integer; var Coefficients : TNmatrix; var Constants : TNvector); var InFile : textfile; Row, Column : integer; begin if opendialog1.execute then begin fileloaded:=true; memo3.Clear; memo3.lines.loadfromfile(opendialog1.filename); assignfile(Infile,opendialog1.filename); reset(infile); Read(InFile, Dimen); Row := 0; while (not eof(Infile)) and (Row < Dimen) do begin Row := Succ(Row); Column := 0; while (not eof(Infile)) and (Column < Dimen) do begin Column := Succ(Column); Read(InFile, Coefficients[Row, Column]); end; end; if not eof(Infile) then begin Row := 0; while (not eof(infile)) and (Row < Dimen) do begin Row := Succ(Row); Read(InFile, Constants[Row]); end; end; Closefile(InFile); end; end; procedure TForm1.Results(Dimen var Coefficients var Constants var Solution Error var Column, Row : integer;

: : : :

: integer; TNmatrix; TNvector; TNvector; byte);

102

s:string; begin with memo1.lines do begin clear; add(''); add('Coeficientii: '); for Row := 1 to Dimen do begin s:=''; for Column := 1 to Dimen do s:=s+ format('%10.2f', [Coefficients[Row, Column]]); add(s); end; add(''); add('Termenii libei:'); for Row := 1 to Dimen do add(format('%10.2f',[Constants[Row]])); add(''); if Error >= 1 then add('ERROR: '); case Error of 0 : begin add('Solutia sistemului:'); for Row := 1 to Dimen do add(format('%10.6f',[Solution[Row]])); add(''); end; 1 : add('Dimensiunea matricei trebuie sa fie mai mare decit 1.'); 2 : Add('Nu exista nici o solu?ie la acest sistem de ecuatii.'); end; { case } end; end; procedure TForm1.SolveBtnClick(Sender: TObject); begin if fileLoaded then begin memo1.clear; Partial_Pivoting(Dimen, Coefficients, Constants, Solution, Error); Results(Dimen, Coefficients, Constants, Solution, Error); end; end; procedure TForm1.ReadBtnClick(Sender: TObject); begin Initial(Dimen, Coefficients, Constants); GetDataFromFile(Dimen, Coefficients, Constants); end; procedure TForm1.FormActivate(Sender: TObject); begin FileLoaded:=false; end; end.

103

Anexa 4: Rezultatele obținute în urma execuției aplicațiilor în mediul Delphi 7.0 Aplicația 1:

104

Aplicația 2:

Aplicația 3:

105

Aplicația 4:

Aplicația 5:

106

Aplicația 6:

107

Anexa 5: Unit-ul UMnsistem unit UMnsistem; interface type Float = extended; { 8 byte real, requires 8087 math chip } const TNNearlyZero = 1E-07; TNArraySize = 30; {Dimensiunea maximă a matricei} type TNvector = array[1..TNArraySize] of Float; TNmatrix = array[1..TNArraySize] of TNvector; procedure Determinant(Dimen : integer; Data : TNmatrix; var Det : Float; var Error : byte); procedure Inverse(Dimen : integer; Data : TNmatrix; var Inv : TNmatrix; var Error : byte); procedure Gaussian_Elimination(Dimen : integer; Coefficients : TNmatrix; Constants : TNvector; var Solution : TNvector; var Error : byte); procedure Partial_Pivoting(Dimen : integer; Coefficients : TNmatrix; Constants : TNvector; var Solution : TNvector; var Error : byte); procedure LU_Decompose(Dimen : integer; Coefficients : TNmatrix; var Decomp : TNmatrix; var Permute : TNmatrix; var Error : byte); procedure LU_Solve(Dimen : integer; var Decomp : TNmatrix; Constants : TNvector; var Permute : TNmatrix; var Solution : TNvector; var Error : byte); procedure Gauss_Seidel(Dimen : integer; Coefficients : TNmatrix; Constants : TNvector; Tol : Float; MaxIter : integer; var Solution : TNvector; var Iter : integer; var Error : byte); implementation //{$I Matrix.inc} procedure Determinant{(Dimen : integer; Data : TNmatrix; var Det : Float; var Error : byte)}; procedure Initial(Dimen : integer; var Data : TNmatrix; var Det : Float;

108

var Error : byte); begin Error := 0; if Dimen < 1 then Error := 1 else if Dimen = 1 then Det := Data[1, 1]; end; { procedure Initial } procedure EROswitch(var Row1 : TNvector; var Row2 : TNvector); var DummyRow : TNvector; begin DummyRow := Row1; Row1 := Row2; Row2 := DummyRow; end; { procedure EROswitch } procedure EROmultAdd(Multiplier : Float; Dimen : integer; var ReferenceRow : TNvector; var ChangingRow : TNvector); var Term : integer; begin for Term := 1 to Dimen do ChangingRow[Term] := ChangingRow[Term] + Multiplier * ReferenceRow[Term]; end; { procedure EROmultAdd } function Deter(Dimen : integer; var Data : TNmatrix) : Float; var PartialDeter, Multiplier : Float; Row, ReferenceRow : integer; DetEqualsZero : boolean; procedure Pivot(Dimen : integer; ReferenceRow : integer; var Data : TNmatrix; var PartialDeter : Float; var DetEqualsZero : boolean); var NewRow : integer; begin DetEqualsZero := true; NewRow := ReferenceRow; while DetEqualsZero and (NewRow < Dimen) do begin NewRow := Succ(NewRow); if ABS(Data[NewRow, ReferenceRow]) > TNNearlyZero then begin EROswitch(Data[NewRow], Data[ReferenceRow]); DetEqualsZero := false; PartialDeter := -PartialDeter; end; end; end; { procedure Pivot } begin { function Deter } DetEqualsZero := false; PartialDeter := 1; ReferenceRow := 0; while not(DetEqualsZero) and (ReferenceRow < Dimen - 1) do begin

109

ReferenceRow := Succ(ReferenceRow); if ABS(Data[ReferenceRow, ReferenceRow]) < TNNearlyZero then Pivot(Dimen, ReferenceRow, Data, PartialDeter, DetEqualsZero); if not(DetEqualsZero) then for Row := ReferenceRow + 1 to Dimen do if ABS(Data[Row, ReferenceRow]) > TNNearlyZero then begin Multiplier := -Data[Row, ReferenceRow] / Data[ReferenceRow, ReferenceRow]; EROmultAdd(Multiplier, Dimen, Data[ReferenceRow], Data[Row]); end; PartialDeter := PartialDeter * Data[ReferenceRow, ReferenceRow]; end; if DetEqualsZero then Deter := 0 else Deter := PartialDeter * Data[Dimen, Dimen]; end; { function Deter } begin { procedure Determinant } Initial(Dimen, Data, Det, Error); if Dimen > 1 then Det := Deter(Dimen, Data); end; { procedure Determinant } procedure Inverse{(Dimen : integer; Data : TNmatrix; var Inv : TNmatrix; var Error : byte)}; procedure Initial(Dimen : integer; var Data : TNmatrix; var Inv : TNmatrix; var Error : byte); var Row : integer; begin Error := 0; if Dimen < 1 then Error := 1 else begin FillChar(Inv, SizeOf(Inv), 0); for Row := 1 to Dimen do Inv[Row, Row] := 1; if Dimen = 1 then if ABS(Data[1, 1]) < TNNearlyZero then Error := 2 { Singular matrix } else Inv[1, 1] := 1 / Data[1, 1]; end; end; { procedure Initial } procedure EROdiv(Divisor : Float; Dimen : integer; var Row : TNvector); var Term : integer; begin for Term := 1 to Dimen do Row[Term] := Row[Term] / Divisor; end; { procedure EROdiv } procedure EROswitch(var Row1 : TNvector; var Row2 : TNvector); var

110

DummyRow : TNvector; begin DummyRow := Row1; Row1 := Row2; Row2 := DummyRow; end; { procedure EROswitch } procedure EROmultAdd(Multiplier : Float; Dimen : integer; var ReferenceRow : TNvector; var ChangingRow : TNvector); var Term : integer; begin for Term := 1 to Dimen do ChangingRow[Term] := ChangingRow[Term] + Multiplier*ReferenceRow[Term]; end; { procedure EROmultAdd } procedure Inver(Dimen : integer; var Data : TNmatrix; var Inv : TNmatrix; var Error : byte); var Divisor, Multiplier : Float; Row, ReferenceRow : integer; procedure Pivot(Dimen : integer; ReferenceRow : integer; var Data : TNmatrix; var Inv : TNmatrix; var Error : byte); var NewRow : integer; begin Error := 2; NewRow := ReferenceRow; while (Error > 0) and (NewRow < Dimen) do begin NewRow := Succ(NewRow); if ABS(Data[NewRow, ReferenceRow]) > TNNearlyZero then begin EROswitch(Data[NewRow], Data[ReferenceRow]); EROswitch(Inv[NewRow], Inv[ReferenceRow]); Error := 0; end; end; { while } end; { procedure Pivot } begin { procedure Inver } ReferenceRow := 0; while (Error = 0) and (ReferenceRow < Dimen) do begin ReferenceRow := Succ(ReferenceRow); if ABS(Data[ReferenceRow, ReferenceRow]) < TNNearlyZero then Pivot(Dimen, ReferenceRow, Data, Inv, Error); if Error = 0 then begin Divisor := Data[ReferenceRow, ReferenceRow]; EROdiv(Divisor, Dimen, Data[ReferenceRow]); EROdiv(Divisor, Dimen, Inv[ReferenceRow]); for Row := 1 to Dimen do if (Row <> ReferenceRow) and (ABS(Data[Row, ReferenceRow]) > TNNearlyZero) then begin Multiplier := -Data[Row, ReferenceRow] / Data[ReferenceRow, ReferenceRow];

111

EROmultAdd(Multiplier, Dimen, Data[ReferenceRow], Data[Row]); EROmultAdd(Multiplier, Dimen, Inv[ReferenceRow], Inv[Row]); end; end; end; end; { procedure Inver } begin { procedure Inverse } Initial(Dimen, Data, Inv, Error); if Dimen > 1 then Inver(Dimen, Data, Inv, Error); end; { procedure Inverse } procedure Gaussian_Elimination{(Dimen : integer; Coefficients : TNmatrix; Constants : TNvector; var Solution : TNvector; var Error : byte)}; procedure Initial(Dimen : integer; var Coefficients : TNmatrix; var Constants : TNvector; var Solution : TNvector; var Error : byte); begin Error := 0; if Dimen < 1 then Error := 1 else if Dimen = 1 then if ABS(Coefficients[1, 1]) < TNNearlyZero then Error := 2 else Solution[1] := Constants[1] / Coefficients[1, 1]; end; { procedure Initial } procedure EROswitch(var Row1 : TNvector; var Row2 : TNvector); var DummyRow : TNvector; begin DummyRow := Row1; Row1 := Row2; Row2 := DummyRow; end; { procedure EROswitch } procedure EROmultAdd(Multiplier : Float; Dimen : integer; var ReferenceRow : TNvector; var ChangingRow : TNvector); var Term : integer; begin for Term := 1 to Dimen do ChangingRow[Term] := ChangingRow[Term] + Multiplier*ReferenceRow[Term]; end; { procedure EROmultAdd } procedure UpperTriangular(Dimen : integer; var Coefficients : TNmatrix; var Constants : TNvector; var Error : byte); var Multiplier : Float; Row, ReferenceRow : integer; procedure Pivot(Dimen : integer; ReferenceRow : integer; var Coefficients : TNmatrix;

112

var Constants var Error

: TNvector; : byte);

var NewRow : integer; Dummy : Float; begin Error := 2; NewRow := ReferenceRow; while (Error > 0) and (NewRow < Dimen) do begin NewRow := Succ(NewRow); if ABS(Coefficients[NewRow, ReferenceRow]) > TNNearlyZero then begin EROswitch(Coefficients[NewRow], Coefficients[ReferenceRow]); Dummy := Constants[NewRow]; Constants[NewRow] := Constants[ReferenceRow]; Constants[ReferenceRow] := Dummy; Error := 0; end; end; end; { procedure Pivot } begin { procedure UpperTriangular } ReferenceRow := 0; while (Error = 0) and (ReferenceRow < Dimen - 1) do begin ReferenceRow := Succ(ReferenceRow); if ABS(Coefficients[ReferenceRow, ReferenceRow]) < TNNearlyZero then Pivot(Dimen, ReferenceRow, Coefficients, Constants, Error); if Error = 0 then for Row := ReferenceRow + 1 to Dimen do if ABS(Coefficients[Row, ReferenceRow]) > TNNearlyZero then begin Multiplier := -Coefficients[Row, ReferenceRow] / Coefficients[ReferenceRow,ReferenceRow]; EROmultAdd(Multiplier, Dimen, Coefficients[ReferenceRow], Coefficients[Row]); Constants[Row] := Constants[Row] + Multiplier * Constants[ReferenceRow]; end; end; { while } if ABS(Coefficients[Dimen, Dimen]) < TNNearlyZero then Error := 2; end; { procedure UpperTriangular } procedure BackwardsSub(Dimen : integer; var Coefficients : TNmatrix; var Constants : TNvector; var Solution : TNvector); var Term, Row : integer; Sum : Float; begin Term := Dimen; while Term >= 1 do begin Sum := 0; for Row := Term + 1 to Dimen do Sum := Sum + Coefficients[Term, Row] * Solution[Row]; Solution[Term] := (Constants[Term] - Sum) / Coefficients[Term, Term]; Term := Pred(Term); end; end; { procedure BackwardsSub }

113

begin { procedure Gaussian_Elimination } Initial(Dimen, Coefficients, Constants, Solution, Error); if Dimen > 1 then begin UpperTriangular(Dimen, Coefficients, Constants, Error); if Error = 0 then BackwardsSub(Dimen, Coefficients, Constants, Solution); end; end; { procedure Gaussian_Elimination } procedure Partial_Pivoting{(Dimen : integer; Coefficients : TNmatrix; Constants : TNvector; var Solution : TNvector; var Error : byte)}; procedure Initial(Dimen : integer; var Coefficients : TNmatrix; var Constants : TNvector; var Solution : TNvector; var Error : byte); begin Error := 0; if Dimen < 1 then Error := 1 else if Dimen = 1 then if ABS(Coefficients[1, 1]) < TNNearlyZero then Error := 2 else Solution[1] := Constants[1] / Coefficients[1, 1]; end; { procedure Initial } procedure EROswitch(var Row1 : TNvector; var Row2 : TNvector); var DummyRow : TNvector; begin DummyRow := Row1; Row1 := Row2; Row2 := DummyRow; end; { procedure EROswitch } procedure EROmultAdd(Multiplier : Float; Dimen : integer; var ReferenceRow : TNvector; var ChangingRow : TNvector); var Term : integer; begin for Term := 1 to Dimen do ChangingRow[Term] := ChangingRow[Term] + Multiplier*ReferenceRow[Term]; end; { procedure EROmultAdd } procedure UpperTriangular(Dimen : integer; var Coefficients : TNmatrix; var Constants : TNvector; var Error : byte); var Multiplier : Float; Row, ReferenceRow : integer; procedure Pivot(Dimen : integer; ReferenceRow : integer; var Coefficients : TNmatrix; var Constants : TNvector;

114

var Error : byte); var PivotRow, Row : integer; Dummy : Float; begin PivotRow := ReferenceRow; for Row := ReferenceRow + 1 to Dimen do if ABS(Coefficients[Row, ReferenceRow]) > ABS(Coefficients[PivotRow, ReferenceRow]) then PivotRow := Row; if PivotRow <> ReferenceRow then begin EROswitch(Coefficients[PivotRow], Coefficients[ReferenceRow]); Dummy := Constants[PivotRow]; Constants[PivotRow] := Constants[ReferenceRow]; Constants[ReferenceRow] := Dummy; end else { Dacă elementul diagonală este zero, nu există nici o soluție } if ABS(Coefficients[ReferenceRow, ReferenceRow]) < TNNearlyZero then Error := 2; end; { procedure Pivot } begin { procedure UpperTriangular } ReferenceRow := 0; while (Error = 0) and (ReferenceRow < Dimen - 1) do begin ReferenceRow := Succ(ReferenceRow); Pivot(Dimen, ReferenceRow, Coefficients, Constants, Error); if Error = 0 then for Row := ReferenceRow + 1 to Dimen do if ABS(Coefficients[Row, ReferenceRow]) > TNNearlyZero then begin Multiplier := -Coefficients[Row, ReferenceRow] / Coefficients[ReferenceRow,ReferenceRow]; EROmultAdd(Multiplier, Dimen, Coefficients[ReferenceRow], Coefficients[Row]); Constants[Row] := Constants[Row] + Multiplier * Constants[ReferenceRow]; end; end; if ABS(Coefficients[Dimen, Dimen]) < TNNearlyZero then Error := 2; end; { procedure UpperTriangular } procedure BackwardsSub(Dimen : integer; var Coefficients : TNmatrix; var Constants : TNvector; var Solution : TNvector); var Term, Row : integer; Sum : Float; begin Term := Dimen; while Term >= 1 do begin Sum := 0; for Row := Term + 1 to Dimen do Sum := Sum + Coefficients[Term, Row] * Solution[Row]; Solution[Term] := (Constants[Term] - Sum) / Coefficients[Term, Term]; Term := Pred(Term); end; end; { procedure BackwardsSub }

115

begin { procedure Partial_Pivoting } Initial(Dimen, Coefficients, Constants, Solution, Error); if Dimen > 1 then begin UpperTriangular(Dimen, Coefficients, Constants, Error); if Error = 0 then BackwardsSub(Dimen, Coefficients, Constants, Solution); end; end; { procedure Partial_Pivoting } procedure LU_Decompose{(Dimen : integer; Coefficients : TNmatrix; var Decomp : TNmatrix; var Permute : TNmatrix; var Error : byte)}; procedure TestInput(Dimen : integer; var Error : byte); begin Error := 0; if Dimen < 1 then Error := 1; end; { procedure TestInput } function RowColumnMult(Row : integer; var Lower : TNmatrix; Column : integer; var Upper : TNmatrix) : Float; var Term : integer; Sum : Float; begin Sum := 0; for Term := 1 to Row - 1 do Sum := Sum + Lower[Row, Term] * Upper[Term, Column]; RowColumnMult := Sum; end; { function RowColumnMult } procedure Pivot(Dimen : integer; ReferenceRow : integer; var Coefficients : TNmatrix; var Lower : TNmatrix; var Upper : TNmatrix; var Permute : TNmatrix; var Error : byte); var PivotRow, Row : integer; ColumnMax, TestMax : Float; procedure EROswitch(var Row1 : TNvector; var Row2 : TNvector); var DummyRow : TNvector; begin DummyRow := Row1; Row1 := Row2; Row2 := DummyRow; end; { procedure EROswitch } begin { procedure Pivot } PivotRow := ReferenceRow; ColumnMax := ABS(Coefficients[ReferenceRow, ReferenceRow] RowColumnMult(ReferenceRow, Lower, ReferenceRow, Upper)); for Row := ReferenceRow + 1 to Dimen do begin TestMax := ABS(Coefficients[Row, ReferenceRow] RowColumnMult(Row, Lower, ReferenceRow, Upper));

116

if TestMax > ColumnMax then begin PivotRow := Row; ColumnMax := TestMax; end; end; if PivotRow <> ReferenceRow then begin EROswitch(Coefficients[PivotRow], Coefficients[ReferenceRow]); EROswitch(Lower[PivotRow], Lower[ReferenceRow]); EROswitch(Permute[PivotRow], Permute[ReferenceRow]); end else if ColumnMax < TNNearlyZero then Error := 2; end; { procedure Pivot } procedure Decompose(Dimen : integer; var Coefficients : TNmatrix; var Decomp : TNmatrix; var Permute : TNmatrix; var Error : byte); var Upper, Lower : TNmatrix; Term, Index : integer; procedure Initialize(Dimen : integer; var Lower : TNmatrix; var Upper : TNmatrix; var Permute : TNmatrix); var Diag : integer; begin FillChar(Upper, SizeOf(Upper), 0); FillChar(Lower, SizeOf(Lower), 0); FillChar(Permute, SizeOf(Permute), 0); for Diag := 1 to Dimen do Permute[Diag, Diag] := 1; end; { procedure Initialize } begin { procedure Decompose } Initialize(Dimen, Lower, Upper, Permute); Pivot(Dimen, 1, Coefficients, Lower, Upper, Permute, Error); if Error = 0 then begin Lower[1, 1] := 1; Upper[1, 1] := Coefficients[1, 1]; for Term := 1 to Dimen do begin Lower[Term, 1] := Coefficients[Term, 1] / Upper[1, 1]; Upper[1, Term] := Coefficients[1, Term] / Lower[1, 1]; end; end; Term := 1; while (Error = 0) and (Term < Dimen - 1) do begin Term := Succ(Term); Pivot(Dimen, Term, Coefficients, Lower, Upper, Permute, Error); Lower[Term, Term] := 1; Upper[Term, Term] := Coefficients[Term, Term] RowColumnMult(Term, Lower, Term, Upper); if ABS(Upper[Term, Term]) < TNNearlyZero then Error := 2 else

117

for Index := Term + 1 to Dimen do begin Upper[Term, Index] := Coefficients[Term, Index] RowColumnMult(Term, Lower, Index, Upper); Lower[Index, Term] := (Coefficients[Index, Term] RowColumnMult(Index, Lower, Term, Upper)) / Upper[Term, Term]; end; end; Lower[Dimen, Dimen] := 1; Upper[Dimen, Dimen] := Coefficients[Dimen, Dimen] RowColumnMult(Dimen, Lower, Dimen, Upper); if ABS(Upper[Dimen, Dimen]) < TNNearlyZero then Error := 2; Decomp := Upper; for Term := 2 to Dimen do for Index := 1 to Term - 1 do Decomp[Term, Index] := Lower[Term, Index]; end; { procedure Decompose } begin { procedure LU_Decompose } TestInput(Dimen, Error); if Error = 0 then if Dimen = 1 then begin Decomp := Coefficients; Permute[1, 1] := 1; end else Decompose(Dimen, Coefficients, Decomp, Permute, Error); end; { procedure LU_Decompose } procedure LU_Solve{(Dimen : integer; var Decomp : TNmatrix; Constants : TNvector; var Permute : TNmatrix; var Solution : TNvector; var Error : byte)}; procedure Initial(Dimen : integer; var Solution : TNvector; var Error : byte); begin Error := 0; FillChar(Solution, SizeOf(Solution), 0); if Dimen < 1 then Error := 1; end; { procedure Initial } procedure FindSolution(Dimen : integer; var Decomp : TNmatrix; var Constants : TNvector; var Solution : TNvector); var PartialSolution : TNvector; Term, Index : integer; Sum : Float; begin { procedure FindSolution } PartialSolution[1] := Constants[1]; for Term := 2 to Dimen do begin Sum := 0; for Index := 1 to Term - 1 do if Term = Index then

118

Sum := Sum + PartialSolution[Index] else Sum := Sum + Decomp[Term, Index] * PartialSolution[Index]; PartialSolution[Term] := Constants[Term] - Sum; end; Solution[Dimen] := PartialSolution[Dimen] / Decomp[Dimen, Dimen]; for Term := Dimen - 1 downto 1 do begin Sum := 0; for Index := Term + 1 to Dimen do Sum := Sum + Decomp[Term, Index] * Solution[Index]; Solution[Term] := (PartialSolution[Term] - Sum)/Decomp[Term, Term]; end; end; { procedure FindSolution } procedure PermuteConstants(Dimen : integer; var Permute : TNmatrix; var Constants : TNvector); var Row, Column : integer; Entry : Float; TempConstants : TNvector; begin for Row := 1 to Dimen do begin Entry := 0; for Column := 1 to Dimen do Entry := Entry + Permute[Row, Column] * Constants[Column]; TempConstants[Row] := Entry; end; Constants := TempConstants; end; { procedure PermuteConstants } begin { procedure Solve_LU_Decompostion } Initial(Dimen, Solution, Error); if Error = 0 then PermuteConstants(Dimen, Permute, Constants); FindSolution(Dimen, Decomp, Constants, Solution); end; { procedure LU_Solve } procedure Gauss_Seidel{(Dimen : integer; Coefficients : TNmatrix; Constants : TNvector; Tol : Float; MaxIter : integer; var Solution : TNvector; var Iter : integer; var Error : byte)}; var Guess : TNvector; procedure TestInput(Dimen : integer; Tol : Float; MaxIter : integer; var Coefficients : TNmatrix; var Constants : TNvector; var Solution : TNvector; var Error : byte); begin Error := 0; if Dimen < 1 then Error := 3 else if Tol <= 0 then Error := 4

119

else if MaxIter < 0 then Error := 5; if (Error = 0) and (Dimen = 1) then begin if ABS(Coefficients[1, 1]) < TNNearlyZero then Error := 6 else Solution[1] := Constants[1] / Coefficients[1, 1]; end; end; { procedure TestInput } procedure TestForDiagDominance(Dimen : integer; var Coefficients : TNmatrix; var Error : byte); var Row, Column : integer; Sum : Float; begin Row := 0; while (Row < Dimen) and (Error < 2) do begin Row := Succ(Row); Sum := 0; for Column := 1 to Dimen do if Column <> Row then Sum := Sum + ABS(Coefficients[Row, Column]); if Sum > ABS(Coefficients[Row, Row]) then Error := 1; if ABS(Coefficients[Row, Row]) < TNNearlyZero then Error := 6; end; { while } end; { procedure TestForDiagDominance } procedure MakeInitialGuess(Dimen : integer; var Coefficients : TNmatrix; var Constants : TNvector; var Guess : TNvector); var Term : integer; begin FillChar(Guess, SizeOf(Guess), 0); for Term := 1 to Dimen do if ABS(Coefficients[Term, Term]) > TNNearlyZero then Guess[Term] := Constants[Term] / Coefficients[Term, Term]; end; { procedure MakeInitialGuess } procedure TestForConvergence(Dimen : integer; var OldApprox : TNvector; var NewApprox : TNvector; Tol : Float; var Done : boolean; var Product : Float; var Error : byte); var Term : integer; PartProd : Float; begin Done := true; PartProd := 0; for Term := 1 to Dimen do begin if ABS(OldApprox[Term] - NewApprox[Term]) > ABS(NewApprox[Term] * Tol) then Done := false;

120

if (ABS(OldApprox[Term]) > TNNearlyZero) and (Error = 1) then { This is part of the divergence test } PartProd := PartProd + ABS(NewApprox[Term] / OldApprox[Term]); end; Product := Product * PartProd / Dimen; if Product > 1E20 then Error := 7 { Sequence is diverging } end; { procedure TestForConvergence } procedure Iterate(Dimen : integer; var Coefficients : TNmatrix; var Constants : TNvector; var Guess : TNvector; Tol : Float; MaxIter : integer; var Solution : TNvector; var Iter : integer; var Error : byte); var Done : boolean; OldApprox, NewApprox : TNvector; Term, Loop : integer; FirstSum, SecondSum, Product : Float; begin { procedure Iterate } Product := 1; Done := false; Iter := 0; NewApprox := Guess; OldApprox := Guess; while (Iter < MaxIter) and not(Done) and (Error <= 1) do begin Iter := Succ(Iter); for Term := 1 to Dimen do begin FirstSum := 0; SecondSum := 0; for Loop := 1 to Term - 1 do FirstSum := FirstSum + Coefficients[Term, Loop] * NewApprox[Loop]; for Loop := Term + 1 to Dimen do SecondSum := SecondSum + Coefficients[Term, Loop] * OldApprox[Loop]; NewApprox[Term] := (Constants[Term] - FirstSum - SecondSum) / Coefficients[Term, Term]; end; TestForConvergence(Dimen, OldApprox, NewApprox, Tol, Done, Product, Error); OldApprox := NewApprox; end; { while } if (Iter < MaxIter) and (Error = 1) then Error := 0; if (Iter >= MaxIter) and (Error = 1) then Error := 1; if (Iter >= MaxIter) and (Error = 0) then Error := 2; Solution := NewApprox; end; { procedure Iterate } begin { procedure Gauss_Seidel } TestInput(Dimen, Tol, MaxIter, Coefficients, Constants, Solution, Error); if Dimen > 1 then begin TestForDiagDominance(Dimen, Coefficients, Error); if Error < 2 then begin

121

MakeInitialGuess(Dimen, Coefficients, Constants, Guess); Iterate(Dimen, Coefficients, Constants, Guess, Tol, MaxIter, Solution, Iter, Error); end; end; end; { procedure Gauss_Seidel } end. { Matrix }

122

Related Documents

Teza Licenta
January 2021 0
Metode Numerice
January 2021 2
Licenta
March 2021 0
Licenta
January 2021 1

More Documents from "Vladut"