tehnici de programare master

Upload: teofil-galatanu

Post on 28-Feb-2018

245 views

Category:

Documents


2 download

TRANSCRIPT

  • 7/25/2019 Tehnici de Programare Master

    1/131

    3

    TEHNICI DE PROGRAMARE N C

    3.2 Structura programului. Functii

    Un program C colectie de functii.

    Functiamaineste obligatorie controleaza ntreaga executie a programului.

    Conceptede construire a aplicatiilorstiintifice:

    modularizarea descompunerea programului n unitati de program (functii sau

    subrutine), care interactioneaz

    a doar prin intermediul unor interfete clar defi

    nite(liste de argumente).

    ncapsularea controlul domeniului de vizibilitate al obiectelor n afara unitatilorde program n care acestea sunt declarate.

    Modularizare judicioasa creste lizibilitatea programului, simplifica depanarea simodificarea, face posibila reutilizarea functiilor de interes general n alte programe (con-struirea bibliotecilor de subrutine).

    Modularizare excesiva programe disfunctionalesi ine

    fi

    ciente.

  • 7/25/2019 Tehnici de Programare Master

    2/131

    Exemplu factorialul unui numar naturalCodificare cu variabile globale:

    #include

    float f; /* variabile globale */int n;

    /*=========================================================================*/void Factorial(void){

    int i;

    f = 1.0;for (i=2; i

  • 7/25/2019 Tehnici de Programare Master

    3/131

    Implementare folosind recursivitatea:

    /*=========================================================================*/float Fact(int n)/*---------------------------------------------------------------------------Returneaza factorialul numarului intreg n utilizand recursivitatea

    ---------------------------------------------------------------------------*/{

    return ((n > 1) ? n * Fact(n-1) : 1.0);}

    Orice autoapel provoaca stocarea n heap(pe stiva) a unui nou set al variabilelor locale.Trebuie asigurata iesirea din recursivitate n ordine inversa a nivelelor.Eficienta scazuta.

    3

  • 7/25/2019 Tehnici de Programare Master

    4/131

    3.4 Pointerisi liste de argumente

    Pointer tip special de variabila, care are ca valori adrese.

    p

    &x

    &x

    x

    FIGURA 3.1. Pointerii contin adresele variabilelor catre care pointeaza.

    Pointerii pot fiutilizati pentru a face referire la variabile prin intermediul adreselor.

    Operatorul adresa& adresa unui obiect din memorie:

    p = &x;

    atribuie pointerului padresa variabilei x p pointeaz acatre x.

    Operatorul de indirectare * acceseaza obiectul catre care pointeaza pointerul *preprezintavaloareavariabilei x.

    Sintaxa declaratieiunui pointer: tip *nume .tip indica tipul de variabile catre care poate sa pointeze pointerul respectiv (informatieesentiala n procesul de indirectare).

    int *p;

    pointerul ppointeaza catre variabile de tip int.

    Operatii cu pointeri:Incrementarea unui pointer (p++) adresa urmatoarei locatii de memorie.Decrementare (p--) adresa locatiei de memorie anterioare.Incrementarea variabileicatre care pointeaza pointerul: ++(*p).

    Utilizari importanteale pointerilor n programareastiintifica:

    mecanismul returnarii variabilelor din functii prin lista de argumente

    alocarea dinamica de memorie pentru tablouri.

    4

  • 7/25/2019 Tehnici de Programare Master

    5/131

    Returnarea variabilelor din functii prin lista de argumente

    n C argumentele functiilor sunt transmiseprin valoarenumaicatre functia apelata.:

    Functie apelanta date Functie apelata

    Functia apelata nu poate modifi

    ca direct variabile din functia apelanta si deci sa returnezevalori.

    Exemplu: functiaSwapar trebui sa interschimbe valorile celor doua argumente:

    /*=========================================================================*/void Swap(float x, float y) /* nu returneaza nimic */{

    float temp;

    temp = x;x = y ;y = temp;

    }/*=========================================================================*/void main(){

    float a, b;

    ...........

    Swap(a,b);

    ...........}

    La intrare nSwap a

    x sib

    y se interschimb

    a ns

    a doarcopiiale lui asi b.Pentru ca Swapsa opereze direct asupra variabilelor asi b, trebuie sa primeascaadreselelor,&a si&b:

    /*=========================================================================*/void Swap(float *x, float *y){

    float temp;

    temp = *x;*x = *y;*y = temp;

    }

    /*=========================================================================*/void main(){

    float a, b;

    ...........

    Swap(&a,&b);

    ...........}

    n Swap se opereaza asupra valorilor variabilelor a si b din programul principal prinindirectarea pointerilor xsi y.

    5

  • 7/25/2019 Tehnici de Programare Master

    6/131

    3.5 Alocarea dinamica a tablourilor

    Strnsa legatura ntre tablourisi pointeri orice operatie asupra elementelor unui tabloupoate firealizatasi cu ajutorul unui pointer.

    int a[10];

    defineste un tablou 10locatii consecutive de memorie a[0],a[1],... ,a[9](offsetnul).

    Tabloul aeste alocat static, n faza de compilare a programului.

    Prin definitie:

    a

    &a[0]&a[0]

    a[0] a[1] a[9]

    FIGURA 3.2. Numele unui tablou este un pointer care contine adresa primului element altabloului.

    Conform aritmeticii pointerilor:a+1echivalent cu &a[1] *(a+1)echivalent cu a[1]a+iechivalent cu &a[i] *(a+i)echivalent cu a[i](compilatorul C face intern automat conversia).

    Alocarea dinamica a tablourilorde offset arbitrarsi lungime arbitrara:

    W.H. Press, S.A. Teukolsky, W.T. Vetterling si B.P. Flannery, Numerical Recipes in C:The Art of Scientific Computing(Cambridge University Press, Cambridge, 1992).

    Functiamallocdefinita nstdlib.h

    void *malloc((size_t) n)

    returneaz

    a un pointer c

    atre un bloc contiguu neinitializat de nocteti din heap, sau NULLdaca cererea nu poate fisatisfacuta datorita indisponibilitatii nheapa unui bloc contiguude dimensiunea ceruta.size_t tipul utilizat de limbajul C pentru dimensiunea obiectelor din memorie(size_t) n conversia lui nla tipul size_t.

    Pentru a returna un pointer catre un bloc de ncomponente de tipul float:

    (float*) malloc((size_t) (n*sizeof(float)));

    sizeof(tip)returneaza lungimea n octeti a reprezentarii interne a tipului tip .(float*) conversia pointerul ntr-un pointer catre locatii de tip real.

    6

  • 7/25/2019 Tehnici de Programare Master

    7/131

    Alocarea dinamica nheapa unui bloc de nlocatii reale:

    float *Vector(int n){

    float *p;

    p = (float*) malloc((size_t) (n*sizeof(float)));if (!p) {printf("Vector: eroare de alocare !\n");exit(1);

    }return p;

    }

    Context tipic de utilizare:

    int i, n;float *a; /* numele matricii este declarat ca pointer */

    n = . . . ;a = Vector(n); /* a devine pointer catre blocul alocat */

    for (i=0; i

  • 7/25/2019 Tehnici de Programare Master

    8/131

    Context tipic de utilizare (nu trebuie folosite componentele a[0],...,a[imin-1]):

    int i, imin, imax;float *a;

    i m i n = . . . ;

    i m a x = . . . ;a = Vector(imin,imax);

    for (i=imin; i

  • 7/25/2019 Tehnici de Programare Master

    9/131

    FunctiaMatrix aloca un tablou bidimensional cu elemente reale:

    /*=========================================================================*/float **Matrix(int imin, int imax, int jmin, int jmax)/*---------------------------------------------------------------------------Aloca memorie pentru o matrice cu componente de tip float, cu indicii de

    linie in intervalul [imin,imax] si indicii de coloana in intervalul[jmin,jmax]---------------------------------------------------------------------------*/{

    int i, ni = imax-imin+1, nj = jmax-jmin+1;float **p;

    /* aloca pointerul catre pointerii de linie */p = (float**) malloc((size_t)(ni*sizeof(float*)));if (!p) {

    printf("Matrix: eroare de alocare de nivel 1 !\n");exit(1);

    }p -= imin;

    /* aloca pointerul pentru prima linie */

    p[imin] = (float*) malloc((size_t)(ni*nj*sizeof(float)));if (!p[imin]) {

    printf("Matrix: eroare de alocare de nivel 2 !\n");exit(2);

    }p[imin] -= jmin;

    /* aloca pointerii pentru restul liniilor */for (i = imin+1; i

  • 7/25/2019 Tehnici de Programare Master

    10/131

    3.6 Operatii simple cu matrici

    (A B)T BT AT = 0,

    #include

    #include "memalloc.h"

    /*=========================================================================*/void MatRead(float **a, int n, int m)/*---------------------------------------------------------------------------Citeste de la tastatura componentele matricii a[][], cu n linii si m coloane---------------------------------------------------------------------------*/{

    int i, j;

    for (i = 1; i

  • 7/25/2019 Tehnici de Programare Master

    11/131

    /*---------------------------------------------------------------------------Calculeaza produsul dintre matricea a[][] cu l linii si m coloane si matriceab[][] cu m linii si n coloane, si returneaza rezultatul in matricea c[][]---------------------------------------------------------------------------*/{

    float t;int i, j, k;

    for (i = 1; i

  • 7/25/2019 Tehnici de Programare Master

    12/131

    Bibliography

    [1] W.H. Press, S.A. Teukolsky, W.T. Vetterling si B.P. Flannery, Numerical Recipes inC: The Art of Scientific Computing, Second Edition (Cambridge University Press,Cambridge, 1992).

    [2] B.W. Kernighan si D.M. Ritchie, The C Programming Language, Second Edition(Prentice-Hall, Englewood Cliffs, NJ, 1988).

    [3] E. Yourdon, Techniques of Program Structure and Design(Prentice-Hall, EnglewoodCliffs, NJ, 1975).

  • 7/25/2019 Tehnici de Programare Master

    13/131

    5ELEMENTE DE GRAFICA STIINTIFICA

    5.1 Dispozitive grafice

    dispozitive cureprezentare discret a(prin puncte) monitoare si imprimante

    dispozitive cureprezentare continu aplotter.

    Monitoare

    Pixel(picture element) elementul grafic de baza.Imagine raster senzatia vizuala de ansamblu creata de pixeli reprezentarea des-fasurata (maparea) memoriei grafice.Imagine monocrom starea 1/0 a unui bit starea aprins/stins a unui pixel.Imagine color 8, 16, 24, 32 biti/pixel informatia de culoare, luminozitate etc.Rezolutia m n nr. maxim de pixeli pe directia orizontala verticalaRezolutia marimea memoriei grafice (640 480, 800 600, 1024 768, 1200 1024,1600 1200).

    Imprimante

    Imprimante cu jet de cerneala imprimare (lenta) linie-cu-linie, memorie proprie mica.

    Imprimante laser imprimare (rapida) pe ntregul suport, memorie mare, limbajul PS.Rezolutia n dpi nr. maxim de puncte pe inch (dots per inch).Rezolutii tipice: 300, 600, 1200 dpi (Hewlett-Packard) sau 360, 720, 1440 dpi (Cannon).

    Plotter

    Sistem de motoare pas-cu-pas care realizeaza deplasarea pe directiilex siy.Sistem electric care comanda ridicarea/coborrea/schimbarea penitelor.Avantajos reprezentari color de dimensiuni mari la rezolutii foarte mari.

  • 7/25/2019 Tehnici de Programare Master

    14/131

    5.2 Functii grafice ale mediului Borland C++

    Fisierul header GRAPHICS.H biblioteca cu peste 80 de functii grafice elementare utilizare simpla n aplicatii DOS.Interfata grafica BGI (Borland Graphics Interface); driver grafic uzual EGAVGA.BGI.

    (0,0) (getmaxx(),0)

    (getmaxx(),getmaxy())(0,getmaxy())

    (x,y)

    FIGURA 5.1. Sistemul coordonatelor ecran al interfetei grafice BGI.

    Coordonatele ecran

    Ecranul grafic zona dreptunghiulara cu originea n coltul stnga-sus.Valoarea coordonatei ecranx (pe directia orizontala) creste spre dreapta.Valoarea coordonatei ecrany (pe directia verticala) creste de sus n jos.Valorile maxime ale coordonatelor ecran functiilegetmaxx() sigetmaxy().Functiunile grafice deplasareacursorului graficpe ecran analog unui creion pe hrtie.

    void far cleardevice(void);

    void far closegraph(void);

    int far getmaxx(void);

    int far getmaxx(void);

    void far initgraph(int far *driver, int far *mode, char far *path);

    void far line(int x1, int y1, int x2, int y2);

    void far lineto(int x, int y);

    void far moveto(int x, int y);

    void far outtextxy(int x,int y,char far *textstring);

    void far rectangle(int left, int top, int right, int bottom);

    void far settextjustify(int horiz, int vert);

    void far settextstyle(int font, int direction, int charsize);

    2

  • 7/25/2019 Tehnici de Programare Master

    15/131

    5.3 Reprezentarea functiilor de o variabilaSe cere reprezentarea grafica a unei functii:

    f : [xmin, xmax] [ymin, ymax],

    data sub forma tabelara:f(xi) =yi, i= 1, 2,...,n.

    y

    x

    ymax

    ymin

    xmin xmax

    y1

    yn

    (xi i,y) (xi )i,y

    xmaxxmin

    ymin

    ymax

    FIGURA 5.2. Corespondenta dintre coordonatele utilizator(xi, yi) si coordonatele ecran(xi,yi)este liniara.

    Nu pot fi utilizate direct coordonate utilizator, (xi, yi), ca argumente pt. functiile

    grafice.Trebuie transformate n coordonate ecran, (xi,yi), prin scalare cu o relatie liniara(reprezentare proportionata):

    x = Axx+Bx,

    y = Ayy+By.

    Coeficientii de scalare(Ax,Bx,Ay,By):

    xmin=Axxmin+Bx,xmax=Axxmax+Bx,

    Ax = (xmax xmin)/(xmax xmin)Bx = xminAxxmax.

    ymin=Ayymin+By,ymax=Ayymax+By,

    Ay = (ymax ymin)/(ymax ymin)By = yminAyymin.

    Asimetrie n tratarea axelor x siy coordonateleyi nu sunt ordonate.Coordonatele ecran corespunzatoare celorn puncte de tabelare:

    xi = Axxi+Bx, i= 1, 2,...,n

    yi = Ayyi+By.

    3

  • 7/25/2019 Tehnici de Programare Master

    16/131

    /*------------------------------- graphlib.h ------------------------------*//*---------------------------------------------------------------------------Contine rutine pentru realizarea pe display a graficelor functiilor deo variabila utilizand biblioteca grafica BGI a mediului Borland C++---------------------------------------------------------------------------*/#ifndef GRAPHLIB#define GRAPHLIB#include

    /*=========================================================================*/void InitGraph(void)/*---------------------------------------------------------------------------Initializeaza modul grafic---------------------------------------------------------------------------*/{

    int gdriver = DETECT, gmode;

    initgraph(&gdriver,&gmode,"c:/progra~1/borlandc/bgi");}

    /*=========================================================================*/

    void Plot0(float x[], float y[], int n,float fxmin, float fxmax, float fymin, float fymax)/*---------------------------------------------------------------------------Realizeaza reprezentarea grafica a unei functii tabelate de o variabila si oincadreaza in fereastra [fxmin,fxmax] x [fymin,fymax], specificata princoordonate fractionare din intervalul [0,1]x[] - abscisele punctelory[] - ordonatele punctelorn - numarul punctelorfxmin - abscisa relativa minima a ferestrei (0 < fxmin < fxmax< 1)fxmax - abscisa relativa maxima a ferestreifymin - ordonata relativa minima a ferestrei (0 < fymin < fymax < 1)fymax - ordonata relativa maxima a ferestrei---------------------------------------------------------------------------*/

    {#define Nint(x) (int)floor(x + 0.5)float ax, bx, ay, by, xmin, xmax, ymin, ymax;int i, ixmin, ixmax, iymin, iymax;

    /* coordonatele ferestrei */ixmin = Nint(fxmin*getmaxx()); iymin = Nint((1.0-fymin)*getmaxy());ixmax = Nint(fxmax*getmaxx()); iymax = Nint((1.0-fymax)*getmaxy());rectangle(ixmin,iymax,ixmax,iymin); /* chenarul */

    xmin = x[1]; xmax = x[n]; /* AXA X */ax = (ixmax-ixmin)/(xmax-xmin); /* coeficienti de scalare */bx = ixmin - ax*xmin;

    ymin = y[1]; ymax = y[1]; /* AXA Y */for (i=2; i y[i]) ymin = y[i];if (ymax < y[i]) ymax = y[i];

    }if (ymin == ymax) { ymin *= 0.9; ymax *= 1.1; }ay = (iymax-iymin)/(ymax-ymin); /* coeficienti de scalare */by = iymin - ay*ymin;

    /* traseaza axele */if (xmin*xmax < 0) line(Nint(bx),iymin,Nint(bx),iymax);if (ymin*ymax < 0) line(ixmin,Nint(by),ixmax,Nint(by));

    /* uneste punctele reprezentarii */moveto(Nint(ax*x[1]+bx),Nint(ay*y[1]+by)); /* primul punct */for (i=2; i

  • 7/25/2019 Tehnici de Programare Master

    17/131

    Functiei Plot0i se transmit coordonatele relativeale colturilor ferestrei de desenare.Coordonatele ecran absolute cu ajutorul functiilorgetmaxx() sigetmaxy().Directiva#ifndef GRAPHLIBpermite includerea fisierului o singura data ntr-o aplicatie.

    Exemplu de utilizare a functiei Plot0:

    /*---------------------------------------------------------------------------Reprezentarea grafica a unei functii de o variabila---------------------------------------------------------------------------*/

    #include #include #include #include "memalloc.h"#include "graphlib.h"

    /*=========================================================================*/float Func(float x){

    return pow(x,3) * exp(-x);}

    /*=========================================================================*/void main(){

    float h, xmin, xmax, *x, *y;int i, n;

    printf("xmin = "); scanf("%f",&xmin);printf("xmax = "); scanf("%f",&xmax);printf("n = "); scanf("%i",&n);

    x = Vector(1,n);y = Vector(1,n);

    h = (xmax-xmin)/(n-1);for (i=1; i

  • 7/25/2019 Tehnici de Programare Master

    18/131

    FIGURA 5.3. Reprezentarea grafica a functiei x3ex cu ajutorul functiei Plot0 (xmin=-0.8,

    xmax=7.8 si n=51).

    Functie mai elaborata n fisierulGRAPHLIB.H:

    /*=========================================================================*/void Plot(float x[], float y[], int n, int style,

    float fxmin, float fxmax, float fymin, float fymax,char xtext[], char ytext[], char title[])

    /*---------------------------------------------------------------------------

    Apelul concret:

    Plot(x,y,n,1,0.2,0.8,0.2,0.8,"x","x^3 * exp(-x)","2D Plot");

    FIGURA 5.4. Reprezentarea grafica a functiei x3ex cu ajutorul functiei Plot.

    6

  • 7/25/2019 Tehnici de Programare Master

    19/131

    Bibliography

    [1] Borland International, Inc.,Borland C++ 3.1 Programming Guide(Borland Interna-tional, Scotts Valley, CA, 1992).

    [2] Microsoft Corporation, Microsoft Visual C++ 1.0 Programmers Guide (MicrosoftCorporation, 1993).

    [3] T.A. Beu,Analiz a numeric a n Turbo Pascal(Microinformatica, Cluj-Napoca, 1992).

  • 7/25/2019 Tehnici de Programare Master

    20/131

    7ECUATII ALGEBRICE SI TRANSCENDENTE

    7.1 Separarea radacinilor

    f(x) = 0

    Ecuatie algebrica dacaf(x)este polinom.Ecuatia transcendenta n caz contrar.

    Radacina aproximativa valoare 0 apropiata de valoarea exacta.Definitii neechivalente:

    numarul 0 cu proprietatea|0 |< ( >0)

    numarul 0 cu proprietatea|f(0)|< .

    (a) (b)

    y

    x0

    0

    f( )

    0f( )

    y

    x0

    FIGURA 7.1. Cazuri de radacini aproximative care nu satisfac simultan criteriile |0 |< si|f(0)|< .

  • 7/25/2019 Tehnici de Programare Master

    21/131

    Determinarea radacinilor reale:

    1. separarea radacinilor stabilirea unei partitiixmin=x1, x2, . . . , xM =xmaxorice[xm, xm+1]sa contina cel mult o radacina;

    2. calculul radacinilor separate prin procedee iterative de rafinare.

    Teorema 7.1 Dac a o functie continu af(x) admite valori de semn opus la capetele unuiinterval [a, b], adic a f(a)f(b) < 0, atunci acel interval contine cel putin o r ad acin a aecuatieif(x) = 0.

    (a) (b)

    y

    x

    f( )a

    f( )b

    a

    b

    y

    x

    f( )a

    f( )b

    a b

    FIGURA 7.2. Exemple de radacini neseparate.

    Separarea radacinilor:

    Determinarea semnelor functiei f(x)n punctele unei partitii{xm}.

    Daca [xm, xm+1] sunt suficient de mici, fiecare subinterval va contine cel mult oradacina.

    n intervalele cu f(xm)f(xm+1)> 0 nu va exista nici o radacina.

    n intervalele cu f(xm)f(xm+1) 0va exista o singura radacina.

    2

  • 7/25/2019 Tehnici de Programare Master

    22/131

    7.2 Metoda bisectiei (metoda njumatatirii)

    Fief(x)continua pe[a, b] si fie ecuatia:

    f(x) = 0.

    Presupunem ca n urma separarii radacinilor exista cel mult o radacina [a, b].

    mpartim [a, b]n mod repetat n parti egale, pastrnd semiintervalul [ai, bi] la capetelecaruia functia are semne opuse.

    y

    x

    x

    x

    x0

    b1

    b2

    b=b0

    a =a0

    f( )a0

    f( )a1

    f( )b1

    f( )b2

    f( )a2

    a1

    a2

    x1

    FIGURA 7.3. Procesul de njumatatire a intervalului de cautare n cazul metodei bisectiei.

    Dupai pasi rezulta[ai, bi]astfel nct

    f(ai)f(bi)< 0.

    Lungimea intervalului[ai, bi]este:

    bi ai=b a

    2i .

    njumatatind[ai, bi]prin

    xi =ai+bi

    2

    rezulta fie radacina exacta=xi, fie un nou interval[ai+1, bi+1].

    Procesul se ncheie, considernd ca radacina aproximativa0 =xi, cnd

    bi aixi

    sau |f(xi)| .

    3

  • 7/25/2019 Tehnici de Programare Master

    23/131

    /*---------------------------- Metoda bisectiei ---------------------------*/

    #include #include

    /*=========================================================================*/float func(float x){

    return (x+2)*(x+1)*x*(x-1)*(x-2);}

    /*=========================================================================*/int Bisect(float Func(float), float a, float b, float *x)/*---------------------------------------------------------------------------Determina un zero real al unei functii reale prin metoda bisectiei

    Func - functia utilizatora, b - limitele intervalului de cautare*x - zeroul gasit (iesire)Returneaza indicele de eroare: 0 - executie normala

    1 - nr. maxim de iteratii depasit2 - intervalul nu contine o radacina

    ---------------------------------------------------------------------------*/{

    const float eps = 1e-6; /* criteriu relativ de precizie */const int itmax = 100; /* nr. maxim de iteratii */float fa, fx;int it;

    /* zeroul este unul din capete ? */fa = Func(*x=a); if (fabs(fa)

  • 7/25/2019 Tehnici de Programare Master

    24/131

    7.3 Metoda pozitiei false (metoda corzii)

    n general mai eficienta dect metoda bisectiei.Avantajoasa nsa tot numai pentru determinarea grosiera a radacinilor reale.

    y

    x

    y f x= ( )

    bi

    ai xi

    f( )ai

    f( )bi

    FIGURA 7.4. mpartirea intervalului de cautare prin intermediul corzii care uneste punctele(ai, f(ai)) si(bi, f(bi))n cazul metodei pozitiei false.

    Se nlocuieste functia cu coarda punctul de intersectiexicu axa absciselor:

    xi aibi ai

    = f(ai)

    f(bi) f(ai) xi=

    aif(bi) bif(ai)

    f(bi) f(ai) .

    Dupa un anumit numar de pasi:

    fie o radacina exacta=xi, astfel nctf(xi) = 0

    fie o secventa de intervale[a0, b0], [a1, b1], . . . , [ai, bi], . . .cu

    ai+1= ai, bi+1=xi, dacaf(ai)f(xi)< 0ai+1= xi, bi+1=bi, dacaf(ai)f(xi)> 0,

    astfel nct

    f(ai+1)f(bi+1)< 0.

    5

  • 7/25/2019 Tehnici de Programare Master

    25/131

    /*=========================================================================*/int FalsPos(float Func(float), float a, float b, float *x)/*---------------------------------------------------------------------------Determina un zero real al unei functii reale prin metoda pozitiei false

    Func - functia utilizatora, b - limitele intervalului de cautare*x - zeroul gasit (iesire)Returneaza indicele de eroare: 0 - executie normala

    1 - nr. maxim de iteratii depasit2 - intervalul nu contine o radacina

    ---------------------------------------------------------------------------*/{

    const float eps = 1e-6; /* criteriu relativ de precizie */const int itmax = 100; /* nr. maxim de iteratii */float dx, fa, fb, fx;int it;

    /* zeroul este unul din capete ? */fa = Func(*x=a); if (fabs(fa)

  • 7/25/2019 Tehnici de Programare Master

    26/131

    7.4 Metoda aproximatiilor succesiveUna dintre metode numerice foarte importante utilizabila pt. rafinarea radacinilor.

    Presupunem caf(x)este continua pe[a, b] si se cere rezolvarea ecuatiei:

    f(x) = 0,Se pune sub forma echivalenta:

    x= (x).

    Pornind de la aproximatia initialax0pentru radacina sirul de aproximatii succesive:

    xi+1=(xi), i= 0, 1, 2, . . .

    Dacasirul este convergent = lim xi.Daca(x)este continua =() radacina ecuatiei

    y

    x

    (a)

    x1x2 x3x0

    = ( )y x

    y

    x

    (b)

    x1 x2x0

    = ( )y x

    y

    x

    (c)

    x1x2 x3x0

    = ( )y xy

    x

    (d)

    x1x2 x3x0

    = ( )y x

    FIGURA 7.5. Procese iterative n metoda aproximatiilor succesive aplicata ecuatieix =(x)pentru: a) 1< 0(x)

  • 7/25/2019 Tehnici de Programare Master

    27/131

    Teorema 7.2 Fie ecuatiax= (x),

    cu functia(x) definit asi derivabil a pe [a, b]. Dac a este satisf acut a inegalitatea

    |

    0

    (x)|

  • 7/25/2019 Tehnici de Programare Master

    28/131

    /*-------------------- Metoda aproximatiilor succesive --------------------*/#include #include

    /*=========================================================================*/float func(float x){

    return x - exp(-x);}

    /*=========================================================================*/int Iter(float Func(float), float *x)/*---------------------------------------------------------------------------Determina un zero real al unei functii reale prin metoda aproximatiilorsuccesive

    Func - functia utilizator*x - aproximatie initiala (la intrare), zeroul gasit (la iesire)Returneaza indicele de eroare: 0 - executie normala

    1 - nr. maxim de iteratii depasit2 - proces divergent

    ---------------------------------------------------------------------------*/{const float eps = 1e-6; /* criteriu relativ de precizie */const int itmax = 100; /* nr. maxim de iteratii */float dx, f;int it;

    dx = -Func(*x); /* initializeaza corectia */for (it=1; it fabs(dx)) goto divergent; /* compara noua corectie */dx = -f; /* actualizeaza corectia */*x += dx; /* noua aproximatie */if (fabs(dx)

  • 7/25/2019 Tehnici de Programare Master

    29/131

    7.5 Metoda lui Newton

    Metoda Newton-Raphsonsau metoda tangentei eficienta deosebita.Presupunem f(x) continuape [a, b] si

    f(x) = 0

    are o radacina reala [a, b], iarf0(x) sif00(x)sunt continue sipastreaza semnul.

    (a) (b)

    y

    x

    a

    x1x2

    = ( )y f x

    bx0 =

    y

    x

    b

    x1

    = ( )y f x

    ax0 =

    FIGURA 7.6. Determinarea aproximatiilor succesive n metoda Newton-Raphson. n cazul (b)f(x0)f

    00(x0)

  • 7/25/2019 Tehnici de Programare Master

    30/131

    /*=========================================================================*/int Newton(float Func(float,float *), float *x)/*---------------------------------------------------------------------------Determina un zero real al unei functii reale prin metoda Newton-Raphsonutilizand derivata analitica---------------------------------------------------------------------------*/{

    const float eps = 1e-6; /* criteriu relativ de precizie */const int itmax = 100; /* nr. maxim de iteratii */float df, dx, f;int it;

    for (it=1; it eps) ? -f/df : -f; /* corectia radacinii */*x += dx; /* noua aproximatie */if (fabs(dx)

  • 7/25/2019 Tehnici de Programare Master

    31/131

    7.6 Metoda secanteiAsemanatoare metodei Newton-Raphson nu necesita evaluarea derivatei functiei.

    y

    x

    a

    x1x2

    = ( )y f x

    bx0 =

    FIGURA 7.7. Determinarea aproximatiilor succesive n metoda secantei.

    Tangenta este aproximata de coarda care uneste punctele pt. doua estimari anterioare.Dezavantaj radacina nu ramne izolata. Nu este garantata convergenta.

    Din formula metodei Newton-Raphson:

    xi+1= xi f(xi)

    f0(xi), f0(xi)

    f(xi) f(xi1)

    xi xi1

    Relatia de recurenta(implica trei aproximatii succesive ale radacinii):

    xi+1=xi f(xi) xi xi1

    f(xi) f(xi1),

    x1se poate obtine dinx0aplicnd metoda aproximatiilor succesive:

    x1= x0 f(x0),

    /*=========================================================================*/int Secant(float Func(float), float *x){

    const float eps = 1e-6; /* criteriu relativ de precizie */const int itmax = 100; /* nr. maxim de iteratii */float df, dx, f, f0, x0;

    int it;x0 = *x; f0 = Func(x0);*x = x0 - f0; /* prima aproximatie */for (it=1; it eps) ? -f/df : -f; /* corectia radacinii */*x += dx; /* noua aproximatie */if (fabs(dx)

  • 7/25/2019 Tehnici de Programare Master

    32/131

    Bibliography

    [1] J. Ortegasi W. Rheinboldt,Iterative Solution of Nonlinear Equations in Several Vari-ables(Academic Press, New York, 1970).

    [2] N.S. Bakhvalov,Numerical Methods(MIR Publishers, Moskow, 1977).

    [3] Gh. Dodescu, Metode numerice n algebr a, Editura tehnica, Bucuresti, 1979).

    [4] M. Tomasi I. Odagescu,Metode numericesi subroutine, Editura tehnica, Bucuresti,1980).

    [5] B.P. Demidovich si I.A. Maron, Computational Mathematics (MIR Publishers,Moskow, 1981).

    [6] R.L. Burden si J.D. Faires, Numerical Analysis, Third Edition (Prindle, Weber &Schmidt, Boston, 1985).

    [7] W.H. Press, S.A. Teukolsky, W.T. Vetterling si B.P. Flannery, Numerical Recipes inC: The Art of Scientific Computing, Second Edition (Cambridge University Press,Cambridge, 1992).

  • 7/25/2019 Tehnici de Programare Master

    33/131

    6EVALUAREA FUNCTIILOR

    6.1 Evaluarea polinoamelor. Schema lui Horner

    Polinom de gradn :

    P(x) =a0xn +a1x

    n1 + +an1x+an.

    Valoarea pentrux = :

    P() = ( ((a0+a1)+a2)+ +an1)+an.

    Schema lui Horner:

    p0 = a0pi = pi1+ai, i= 1, 2, . . . , n

    P() = pn.

    Orice fractie rationala,R(x) =P(x)/Q(x), poate fi evaluata utiliznd schema lui Horner.

    /*=========================================================================*/

    float Polinom(float x, float a[], int n)/*---------------------------------------------------------------------------Evalueaza un polinom de ordinul n cu coeficienti reali a[] in punctul x---------------------------------------------------------------------------*/{

    float p;int i;

    p = a[0];for (i=1; i

  • 7/25/2019 Tehnici de Programare Master

    34/131

    6.2 Evaluarea functiilor analitice

    f(x) analitic andaca ntr-o vecinatate|x | < R

    f(x) =f() +f()

    1!

    (x

    ) +

    f()

    2!

    (x

    )2 +

    Suma partiala (polinomul Taylor) de ordinul n:

    Fn(x) =ni=0

    f(i)()

    i! (x )i =

    ni=0

    ti(x).

    Estimari practice pentru eroarea absoluta(n) si cea relativa(n):

    (n) = |tn(x)|, (n) =

    tn(x)

    Fn(x)

    .

    Exemplu functia exponentiala:

    ex = 1 +x+x2

    2! + =

    i=0

    xi

    i!,

    Polinomul Taylor de ordinul n:

    Fn(x) =ni=0

    ti(x), ti(x) =xi

    i!.

    Schema recurent

    a:

    t0= 1, F0= 1ti = (x/i) ti1, Fi = Fi1+ti, i= 1, 2, . . . , n , . . .

    Criteriu de oprire:|tn/Fn| sau |tn| |Fn|.

    /*=========================================================================*/float Exp0(float x)/*---------------------------------------------------------------------------Evalueaza exponentiala in punctul x din dezvoltarea ei in serie---------------------------------------------------------------------------*/{

    const float eps = 1e-6;float f, t;int i;

    i = 1 ;f = t = 1 . 0 ;while (fabs(t/f) > eps) {

    t *= x/(i++);f += t;

    }return f;

    }

    2

  • 7/25/2019 Tehnici de Programare Master

    35/131

    Pt.x = 0.0 ? f : 1.0/f);

    }

    3

  • 7/25/2019 Tehnici de Programare Master

    36/131

    6.3 Fractii continue

    a0+ b1

    a1+ b2

    a2+

    a0;b1a1

    ,b2a2

    , . . . ,biai

    , . . .

    ai sibi numere reale, complexe, sau functii.

    Convergentiifractiei continue:

    R1= a0+b1a1

    , R2= a0+ b1

    a1+b2a2

    , . . .

    Fractia continua este convergentadaca exista limita

    A= limi

    Ri.

    Teorema 6.1 (Legea form arii convergentilor) Numerele

    Pi = aiPi1+biPi2, i= 1, 2, . . .

    Qi = aiQi1+biQi2,

    cuP0= a0, P1= 1Q0= 1, Q1= 0

    sunt respectiv num ar atoriisi numitorii convergentilorRi ai fractiei continue

    Ri= PiQi

    , i= 1, 2, 3, . . .

    Demonstratie(metoda inductiei). Pentru i = 1:

    R1= P1Q1

    = a1P0+b1P1a1Q0+b1Q1

    =a0+b1a1

    Din ipoteza:

    Ri = PiQi

    = aiPi1+biPi2aiQi1+biQi2

    .

    Ri+1rezulta dinRinlocuindai ai+bi+1/ai+1:

    Ri+1= ai+1Pi+bi+1Pi1ai+1Qi+bi+1Qi1

    = Pi+1Qi+1

    Fractiile continue mai rapid convergente dect orice reprezentare infinita a functiilor.

    4

  • 7/25/2019 Tehnici de Programare Master

    37/131

    Exemplu:

    tan x=

    0;

    x

    1,x2

    3 ,

    x25

    , . . . ,x22i 1 , . . .

    .

    Elementele fractiei:a0= 0, a1= 1, ai= ai1+ 2

    b1= x, bi= x2, i= 2, 3, . . .Valorile initiale:

    P0= 0, P1= x, a1= 1Q0= 1, Q1= 1, b= x2.

    Relatii de recurenta:

    ai = ai1+ 2, i= 2, 3, . . .

    Pi = aiPi1+bPi2

    Qi = aiQi1+bQi2.

    Conditie de convergenta: 1 Ri1Ri =

    1 Pi1Qi1 QiPi .

    /*=========================================================================*/float Tan(float x)/*---------------------------------------------------------------------------Evalueaza tangenta in punctul x utilizand reprezentarea cu fractii continue---------------------------------------------------------------------------*/{

    const float eps = 1e-6;float a, b, p, pm, pp, q, qm, qp;

    if (x == 0.0) return 0.0;pm = 0 .0; p = x ; a = 1.0;qm = 1.0; q = 1.0; b = -x*x;while (fabs(1.0 - (pm*q)/(p*qm)) > eps) {

    a += 2.0;pp = a*p + b*pm; pm = p; p = pp;qp = a*q + b*qm; qm = q; q = qp;

    }return p/q;

    }

    5

  • 7/25/2019 Tehnici de Programare Master

    38/131

    6.4 Polinoame ortogonale

    {fn(x)} sistem ortogonalpe [a, b]n raport cu functia de ponderew(x)> 0 daca

    b

    a

    w(x)fn(x)fm(x)dx= Nnnm (n, m= 0, 1, 2, . . .).

    Relatii generale

    ecuatia diferentiala de ordinul doi:g2(x)f

    n(x) +g1(x)f

    n(x) +hnfn(x) = 0.

    relatia de recurenta n raport cu ordinul n:

    anfn(x) = (bn+cnx)fn1(x) dnfn2(x).

    prima derivata:g2(x)f

    n(x) =g1(x)fn(x) +g0(x)fn1(x).

    TABELUL 6.1.

    fn(x) nume a b w(x) Nn

    Tn(x) Cebsev

    de speta I 1 1 (1 x2)1/2

    dacan = 0/2 dacan = 0

    Pn(x) Legendre 1 1 1 2/(2n+ 1)Ln(x) Laguerre 0 ex 1Hn(x) Hermite ex

    2

    2nn!

    TABELUL 6.2.

    fn(x) an bn cn dn f0(x) f1(x)Tn(x) 1 0 2 1 1 xPn(x) n 0 2n 1 n 1 1 xLn(x) n 2n 1 1 n 1 1 1 xHn(x) 1 0 2 2(n 1) 1 2x

    TABELUL 6.3.

    fn(x) g2(x) g1(x) g0(x)Tn(x) 1 x2 nx nPn(x) 1 x2 nx nLn(x) x n nHn(x) 1 0 2n

    6

  • 7/25/2019 Tehnici de Programare Master

    39/131

    Evaluareapolinomului ortogonal fn(x)pentrux = :

    1. se evalueazaf0() sif1()

    2. se aplica pentrui = 2, 3, . . . , nrelatia de recurenta

    fi() =

    1

    ai [(bi+ci)fi1() difi2()].

    Polinoamele Cebsev de speta ntia

    Convergenta rapida a dezvoltarilor n serie pe [1, 1].Relatii de recurenta:

    Ti(x) = 2xTi1(x) Ti2(x), i= 2, 3, . . . , nTn(x) = n [xTn(x) Tn1(x)] /(x2 1),T0(x) = 1, T1(x) =x

    /*=========================================================================*/float Cebisev(int n, float x, float *d)/*---------------------------------------------------------------------------Evalueaza polinomul Cebisev de ordinul n in punctul x, returnand derivatain *d---------------------------------------------------------------------------*/{

    float f, fm1, fm2, x2;int i;

    if (n == 0) {f = 1.0; *d = 0.0;

    } else {f = x; fm1 = 1.0; x2 = 2*x;for (i=2; i

  • 7/25/2019 Tehnici de Programare Master

    40/131

    /*=========================================================================*/float Legendre(int n, float x, float *d)/*-------------------------------------------------------------------------*/{

    float f, fm1, fm2;int i;

    if (n == 0) {f = 1.0; *d = 0.0;} else {

    f = x; fm1 = 1.0;for (i=2; i

  • 7/25/2019 Tehnici de Programare Master

    41/131

    Armonice sferice. Functii Legendre asociate

    Metoda separarii variabilelor n coordonate sferice pentru anumite ecuatii diferentiale:ecuatia undelor, ecuatia lui Schrdinger, ecuatia lui Laplace.

    Ecuatia armonicelor sferice:1

    sin

    sin

    Ylm

    +

    1

    sin2

    2Ylm2

    +l(l+ 1)Ylm= 0,

    l= 0, 1, 2, . . . , l m l

    Armonicele sferice:

    Ylm(, ) =

    2l+ 1

    4

    (l m)!(l+m)!

    Pml (cos )eim

    Yl,m(, ) = (

    1)mYlm(, ), m

    0

    Relatia de ortonormare: 20

    d

    0

    Ylm(, )Ylm(, )sin d = llmm

    {Ylm(, )} sistem ortonormat completpe sfera de raza unitate L2(S1).Oricef L2(S1) dezvoltare unica n serie Fourier:

    f(, ) =

    l=0l

    m=lalmYlm(, )

    Ecuatia functiilor Legendre asociate:

    (1 x2)d2Pmldx2

    2xdPml

    dx +

    l(l+ 1) m

    2

    1 x2

    Pml = 0

    Functiile Legendre asociate(Pl(x) polinoame Legendre):

    Pml (x) = (1)m(1 x2)m/2 dm

    dxmPl(x).

    Relatia de ortonormare: 11

    Pml (x)Pml (x)dx=

    2

    (2l+ 1)

    (l+m)!

    (l m)!ll.

    {Pml (x)} sistem ortonormat completpe L2[1, 1]Oricef L2[1, 1] dezvoltare unica n serie Fourier:

    f(x) =l=0

    lm=l

    almPml (x).

    9

  • 7/25/2019 Tehnici de Programare Master

    42/131

    x

    -1.0 -0.5 0.0 0.5 1.0

    Plm

    (x)

    -20

    -15

    -10

    -5

    0

    5

    10

    P

    0

    P1

    P

    2

    P

    3

    FIGURA 6.2. Functiile Legendre asociate P03 (x), P13 (x), P

    23 (x) si P

    33 (x) calculate cu ajutorul

    rutinei FLegendre.

    Relatia de recurentan raport cu ordinul inferior:

    (i m)Pmi (x) = (2i 1)xPmi1(x) (i+m 1)Pmi2(x),i= m+ 1, . . . , l

    Valori de pornire:

    Pmm1 = 0

    Pmm (x) = (1)m(2m 1)!!(1 x2)m/2

    =mi=1

    (2i 1)

    1 x2

    /*=========================================================================*/float FLegendre(int l, int m, float x)/*---------------------------------------------------------------------------Evalueaza functia Legendre asociata de ordine l si m in punctul x---------------------------------------------------------------------------*/{

    float p, pm1, pm2, sqx;int i;

    if (l < m) return 0.0;p = 1.0; pm1 = 0.0; /* P(m,m,x), P(m-1,m,x) */if (m) {

    sqx = -sqrt(1.0-x*x);for (i=1; i

  • 7/25/2019 Tehnici de Programare Master

    43/131

    Functiile Bessel sferice

    Solutii ale ecuatiei cuantice radiale a mprastierii.

    Ecuatia functiilor Bessel sferice:

    x2fn(x) + 2xfn(x) +

    x2 n(n+ 1) fn(x) = 0, n= 0, 1, 2, . . .

    Solutia regulata functia Bessel sfericajn(x)Solutia neregulata functia Neumann sfericayn(x).

    Relatia de recurenta:

    fi(x) =2i 1

    x fi1(x) fi2(x)

    Functiile Neumann sfericeyn(x) recurenta ascendenta stabila:

    y0(x) = cos xx

    , y1(x) =1

    x[y0(x) sin x]

    /*=========================================================================*/float SBessy(int n, float x)/*---------------------------------------------------------------------------Evalueaza functia Neumann sferica y_n(x) de ordinul n in punctul x---------------------------------------------------------------------------*/{

    float y, y0, y1;int i;

    y0 = -cos(x)/x; if (n == 0) return y0;y1 = (y0 - sin(x))/x; if (n == 1) return y1;

    for (i=2; i

  • 7/25/2019 Tehnici de Programare Master

    44/131

    Functiile Bessel sfericejn(x) recurenta ascendenta conditional stabila.Daca n > |x|se acumuleaza erorile de trunchiere la recurenta ascendenta.

    Algoritmului lui Miller recurenta descendenta cu valori de pornire arbitrare:

    ji(x) = 2i+ 3

    x ji+1(x) ji+2(x)jN+2 = 0, jN+1= 1, N > n

    Rezulta functiile corecte nmultite cu un factor necunoscut

    jn= kjn

    Factorul se determina din:k=j0/j0

    Functia Bessel sfericajn:

    jn= (j0/j0)jn

    Recurenta ascendenta este ntotdeauna stabila pentru n < |x|.n ce conditii trebuie aplicata recurenta descendenta?Care este ordinulNde la care trebuie nceputa recurenta?Pentru n > |x| se retine doar primul termen n relatia de recurenta

    ji(x) 2i 1x

    ji1(x), i= n, n+ 1, . . . , N

    Factorul net de crestere a functieijN fata dejn:

    f=Ni=n

    2i 1x

    Daca f >108 recurenta ascendenta este instabila se aplica recurenta descendenta.

    x

    0 2 4 6 8 10 12 14

    jn(

    x)

    -0.4

    -0.2

    0.0

    0.2

    0.4

    0.6

    0.8

    1.0

    j0

    j1

    j2j3

    FIGURA 6.4. Functiile Bessel sferice jn(x)pentru ordinele n = 0, 1, 2 si3, calculate cu ajutorulrutineiSBessj.

    12

  • 7/25/2019 Tehnici de Programare Master

    45/131

    /*=========================================================================*/float SBessj(int n, float x)/*---------------------------------------------------------------------------Evalueaza functia Bessel sferica j_n(x) de ordinul n in punctul x---------------------------------------------------------------------------*/{

    float j, j0, j1, j2, jn;

    int i, nmax;

    if (x == 0.0) return (n == 0 ? 1.0 : 0.0);j0 = sin(x)/x; if (n == 0) return j0;j1 = (j0 - cos(x))/x; if (n == 1) return j1;

    nmax = 0; /* determina sensul recurentei stabile */if ((float)n >= fabs(x)) {

    jn = 1.;for (i=n; i= 1e8) {nmax = i + 10; break;}

    }}

    if (nmax == 0) { /* recurenta ascendenta */for (i=2; i=0; i--) {

    j = (2*i+3)/x*j1 - j2;j2 = j1; j1 = j;if (i == n) jn = j; /* memoreaza jn nenormat */

    }return (j0/j)*jn; /* normeaza jn */

    }}

    13

  • 7/25/2019 Tehnici de Programare Master

    46/131

    Bibliography

    [1] M. Abramowitz si I. Stegun, Handbook of Mathematical Functions(Dover Publica-tions, New York, 1972).

    [2] D.E. Knuth, The Art of Computer Programming, vol. 2: Seminumerical Algorithms(Addison-Wesley, Reading, MA, 1981).

    [3] F.S. Acton, Numerical Methods That Work (Mathematical Association of America,Washington, 1990).

  • 7/25/2019 Tehnici de Programare Master

    47/131

    8

    SISTEME DE ECUATII ALGEBRICE LINIARE

    8.1 Introducere

    Rezolvarea sistemelor de ecuatii liniare joaca un rol central n analiza numerica.

    Metode directe algoritmi finiti, erori de rotunjire Gauss, Crout, Choleski,

    Metode iterative procese infinite, erori de trunchiere Jacobi, Gauss-Seidel.

    8.2 Metoda de eliminare a lui Gauss

    Ideea de baza aducerea sistemului prin transformari elementare la o forma echivalenta,cu matrice superior triunghiulara.Transformarea sistemului faza eliminarii.Rezolvarea sistemului cu matrice triunghiulara faza substitutiei inverse.

    Exemplificare:

    a11x1+a12x2+a13x3 = b1a21x1+a22x2+a23x3 = b2

    a31x1+a32x2+a33x3 = b3,

    sau

    a11 a12 a13a21 a22 a23

    a31 a32 a33

    x1x2

    x3

    =

    b1b2

    b3

    Faza eliminarii:Pasul 1: Eliminamx1 din toate ecuatiile sistemului, cu exceptia primei ecuatii.mpartim prima linie la elementul pivot a11.Scadem prima ecuatie nmultita cu primul coeficient din celelalte ecuatii:

    x1+a(1)12x2+a

    (1)13x3 = b

    (1)1

    a(1)22x2+a(1)23x3 = b

    (1)2

    a(1)32x2+a

    (1)33x3 = b

    (1)3 ,

    sau

    1 a(1)12 a

    (1)13

    0 a(1)22 a(1)23

    0 a(1)32 a

    (1)33

    x1x2x3

    =

    b(1)1

    b(1)2b(1)3

    .

  • 7/25/2019 Tehnici de Programare Master

    48/131

    cu

    a(1)1j = a1j/a11, j = 1, 2, 3

    b(1)1 = b1/a11

    a(1)ij = aij ai1a(1)1j, j = 1, 2, 3, i= 2, 3

    b

    (1)

    i = bi

    ai1b

    (1)

    1 .

    Pasul 2: Eliminamx2 din ultima ecuatie.mpartim a doua ecuatie la elementul pivot a(1)22 si o scadem nmultita cua

    (1)32 din ecuatia

    a treia:

    1 a(1)12 a

    (1)13

    0 1 a(2)23

    0 0 a(2)33

    x1x2x3

    =

    b(1)1

    b(2)2

    b(2)3

    ,

    cu

    a(2)2j = a

    (1)2j/a

    (1)22, j = 2, 3

    b(2)2 = b(1)2 /a

    (1)22

    a(2)ij = a

    (1)ij a

    (1)i2 a

    (2)2j, j = 2, 3, i= 3

    b(2)i = b(1)i a

    (1)i2 b

    (2)2 .

    Pasul 3: mpartim cea de a treia ecuatie la elementul pivot a(2)33:

    1 a(1)12 a(1)13

    0 1 a(2)230 0 1

    x1x2x3

    =

    b(1)1b(2)2b(3)3

    ,

    cub(3)3 =b

    (2)3 /a

    (2)33.

    Faza substitutiei inverse:

    x3 = b(3)3

    x2 = b(2)2 a

    (2)23x3

    x1 = b(1)1 (a

    (1)12x2+a

    (1)13x3).

    Calculul determinantului:Datorita mpartirii succesive cu elementele pivot:

    detA(3) = detA

    a11a(1)22a

    (2)33

    = 1,

    rezulta:detA= a11a

    (1)22a

    (2)33.

    2

  • 7/25/2019 Tehnici de Programare Master

    49/131

    Generalizare sistem de n ecuatii cu n necunoscute A = [aij]nn, b = [bi]n six= [xi]n:

    A x= b.

    Faza eliminarii:

    naintea pasuluik (k= 1, 2, . . . n 1):

    1 a(1)12 a

    (1)1k a

    (1)1k+1 a

    (1)1n

    0 1 a(2)2k a

    (2)2k+1 a

    (2)2n

    ... ... . . .

    ... ...

    ...0 0 a

    (k1)kk a

    (k1)kk+1 a

    (k1)kn

    0 0 a(k1)k+1k a

    (k1)k+1k+1 a

    (k1)k+1n

    ... ...

    ... ...

    . . . ...

    0 0 a(k1)nk a

    (k1)nk+1 a

    (k1)nn

    x1x2...

    xkxk+1

    ...xn

    =

    b(1)1

    b(2)2...

    b(k1)k

    b(k1)k+1

    ...b(k1)n

    .

    La pasulkse eliminaxk din ecuatiile de sub ecuatiak :

    1 a(1)12 a(1)1k a

    (1)1k+1 a

    (1)1n

    0 1 a(2)2k a(2)2k+1 a

    (2)2n

    ... ... . . .

    ... ...

    ...0 0 1 a

    (k)kk+1 a

    (k)kn

    0 0 0 a(k)k+1k+1 a

    (k)k+1n

    ... ...

    ... ...

    . . . ...0 0 0 a(

    k)nk+1 a

    (k)nn

    x1x2...

    xkxk+1

    ...xn

    =

    b(1)1b(2)2

    ...b(k)k

    b(k)k+1...

    b(k)n

    .

    Noile elemente ale liniei pivot k:

    a(k)kk = 1

    a(k)kj = a

    (k1)kj /a

    (k1)kk , j =k+ 1, . . . , n

    b(k)k = b

    (k1)k /a

    (k1)kk .

    Noile elemente ale liniilor de sub linia pivot:

    a(k)ik = 0

    a(k)ij = a

    (k1)ij a

    (k1)ik a

    (k)kj , j =k+ 1, . . . , n , i= k+ 1, . . . , n

    b(k)i = b

    (k1)i a

    (k1)ik b

    (k)k .

    La pasulkse modifica doar elementele delimitate de liniasi coloanak.Nu trebuie consideratj =k, deoarece pe coloana pivot kse genereaza numai1sau 0.

    3

  • 7/25/2019 Tehnici de Programare Master

    50/131

    La pasulk= n se mparte ultima ecuatie la ultimul pivot,a(n1)nn :

    1 a(1)12 a(1)1k a

    (1)1k+1 a

    (1)1n

    0 1 a(2)2k a(2)2k+1 a

    (2)2n

    ... ...

    . . . ...

    ... ...

    0 0 1 a(k)kk+1 a

    (k)kn

    0 0 0 1 a(k+1)k+1n

    ... ...

    ... ...

    . . . ...

    0 0 0 0 1

    x1x2...

    xkxk+1

    ...xn

    =

    b(1)1

    b(2)2...

    b(k)k

    b(k+1)k+1

    ...b(n)n

    ,

    sauA(n) x= b(n).

    Faza substitutiei inverse:

    xn = b(n)n

    xk = b(k)k

    nXi=k+1

    a(k)ki xi, k= n 1, . . . , 1.

    Calculul determinantului:Datorita mpartirii succesive cu elementele pivot:

    detA(n) = detA

    a11a(1)22 a

    (n1)nn

    = 1

    rezulta:

    detA= a11a

    (1)

    22 a

    (n1)

    nn .

    Generalizare ecuatie matriciala B = [bij]nm siX= [xij]nm:

    A X = B

    Faza eliminarii (k= 1, . . . , n):

    a(k)kj = a

    (k1)kj /a

    (k1)kk , j =k+ 1, . . . , n

    b(k)kj = b

    (k1)kj /a

    (k1)kk , j= 1, . . . , m

    a(k)ij = a

    (k1)ij a

    (k1)

    ik

    a(k)

    kj

    , j =k+ 1, . . . , n, i= k + 1, . . . , n ,

    b(k)ij = b

    (k1)

    ij a(k1)

    ik b(k)kj , j = 1, . . . , m .

    Faza substitutiei inverse:

    xnj = b(n)nj, j = 1, . . . , m

    xkj = b(k)kj

    nXi=k+1

    a(k)ki xij, j = 1, . . . , m, k= n 1, . . . , 1.

    Inversarea matricilor ca matrice a termenilor liberi se ia matricea unitate:

    B= En

    [ij]nn

    X= A

    1

    .

    4

  • 7/25/2019 Tehnici de Programare Master

    51/131

    Pivotarea rearanjarea liniilor pt. a avea la fiecare pas al eliminarii unpivot maxim.Se minimizeaza erorile de rotunjiresi se evita mpartirile cu0

    pivotarea partial a pe coloane la pasul k se cauta elementul maxim a(k1)lk pecoloanak si liniilel k si se interschimba liniilel sik.

    metoda elementului principal se cauta elementul pivot pe toate liniilesi coloanelematricii A(k1) pe care nu s-a pivotat.

    /*=========================================================================*/int Gauss(float **a, float **b, int n, int m, float *det)/*---------------------------------------------------------------------------Rezolva ecuatia matriciala a x = b prin metoda Gauss, inlocuind la iesire bcu x (utilizeaza pivotarea partiala pe coloane).

    a - matricea (n x n) a sistemuluib - matricea (n x m) a termenilor liberi; solutia x la iesire*det - determinantul matricii sistemului (iesire)

    Returneaza indicele de eroare: 0 - executie normala1 - matrice a singulara---------------------------------------------------------------------------*/{#define Swap(a,b) { t = a; a = b; b = t; }

    float amax, sum, t;int i, imax, j, k;

    /* ELIMINARE */*det = 1.0;for (k=1; k

  • 7/25/2019 Tehnici de Programare Master

    52/131

    8.7 Sisteme de ecuatii liniare cu matrice tridiagonala

    Matrici tridiagonale matrici rare cu majoritatea elementelor extradiagonale 0.Metodele generale nu sunt eficiente.n mod tipic prin discretizarea ecuatiilor diferentiale prin scheme cu diferente finite.

    Fie sistemul:A x= d,

    sau

    b1 c1a2 b2 c2 0

    . . . . . . . . .ai1 bi1 ci1

    ai bi ci. . . . . . . . .

    0 an1 bn1 cn1an bn

    x1x2...

    xi1xi..

    .xn1xn

    =

    d1d2...

    di1di..

    .dn1dn

    .

    Se factorizeaza A:A= L U,

    cu

    L U =

    12 2 0

    . . . . . .

    i1 i1i i

    . . . . . .0 n1 n1

    n n

    1 11 2 0

    . . . . . .

    1 i11 i

    . . . . . .0 1 n1

    1

    Prin identificare:

    b1 = 1, c1 = 11

    ai = i, bi = ii1+i, ci = ii, i= 2, 3, . . . , n 1

    an = n, bn = nn1+n.

    Elementele matricilor L si U (presupunndi 6= 0):

    i= ai, i= 2, 3, . . . , n ,

    1 = b1, 1 = c1/1i = bi aii1, i = ci/i, i= 2, 3, . . . , n 1n = bn ann1.

    Diagonala matricii Lestei identic

    a cu diagonala matricii A.

    6

  • 7/25/2019 Tehnici de Programare Master

    53/131

    Sistemul initial devine :

    L (U x) = d

    L y = dU x = y.

    sau

    1a2 2 0

    . . . . . .ai1 i1

    ai i. . . . . .

    0 an1 n1an n

    y1y2...

    yi1yi...

    yn1yn

    =

    d1d2...

    di1di...

    dn1dn

    si

    1 11 2 0

    . . . . . .1 i1

    1 i. . . . . .

    0 1 n11

    x1x2...

    xi1xi...

    xn1xn

    =

    y1y2...

    yi1yi...

    yn1yn

    .

    Prin identifi

    carea elementelor: y1 = d1/1

    yi = (di aiyi1)/i, i= 2, 3, . . . , n

    xn = yn

    xi = yi ixi+1, i= n 1, . . . , 1.

    Faza factorizarii:

    1 = b1, 1 = c1/1, y1 = d1/1

    i = bi aii1, i = ci/i, yi = (di aiyi1)/ii= 2, 3, . . . , n 1.

    Faza substitutiei inverse:

    xn = (dn anyn1)/(bn ann1)xi = yi ixi+1, i= n 1, . . . , 1.

    n implementare sunt suficiente patru tablouri a, b, c si d, asociate cu ai,bi,ci sidi.Elementelei pot fistocate n tabloul c, peste marimileci.

    Pentrudi,yi six se poate utiliza acelasi tablou,d, care nfi

    nal contine solutia sistemului.

    7

  • 7/25/2019 Tehnici de Programare Master

    54/131

    /*=========================================================================*/void TriDiag(float a[], float b[], float c[], float d[], int n)/*---------------------------------------------------------------------------Rezolva un sistem liniar cu matrice tridiagonala prin factorizare

    a[] - codiagonala inferioara (i=2..n)b[] - diagonala principalac[] - codiagonala superioara (i=1..n-1)d[] - vectorul termenilor liberi; la iesire contine solutia xn - ordinul sistemului---------------------------------------------------------------------------*/{

    float beta;int i; /* factorizare */

    c[1] /= b[1]; d[1] /= b[1];for (i=2; i=1; i--) d[i] -= c[i]*d[i+1];

    }

    Nu se efectueaza pivotare dominanta diagonal aa matricii sistemului asigura succesul.

    8

  • 7/25/2019 Tehnici de Programare Master

    55/131

    Bibliography

    [1] Gh. Dodescu, Metode numerice n algebr a, Editura tehnica, Bucuresti, 1979).

    [2] B.P. Demidovich si I.A. Maron, Computational Mathematics (MIR Publishers,Moskow, 1981).

    [3] R.L. Burden si J.D. Faires, Numerical Analysis, Third Edition (Prindle, Weber &Schmidt, Boston, 1985).

    [4] W.H. Press, S.A. Teukolsky, W.T. Vetterling si B.P. Flannery, Numerical Recipes inC: The Art of Scientific Computing, Second Edition (Cambridge University Press,Cambridge, 1992).

  • 7/25/2019 Tehnici de Programare Master

    56/131

    9

    PROBLEME DE VALORI SI VECTORI PROPRII

    8.1 Introducere

    Problema de valori proprii a unui operator liniar A:

    Ax =x

    x vector propriu, valoare proprie.

    n reprezentarea unei baze din

  • 7/25/2019 Tehnici de Programare Master

    57/131

    8.2 Diagonalizarea matricilor prin transformari similare

    Fie X matricea avnd pe coloane vectorii proprii x(j) matrice modala.Celen ecuatii de valori proprii sub forma matriciala ecuatie modala:

    A X = X

    unde

    X =

    x(1)1 x

    (2)1 x

    (n)1

    x(1)2 x

    (2)2 x

    (n)2

    x(1)n x

    (2)n x

    (n)n

    , =

    1 0 00 2 0

    0 0 n

    Teorema 9.1 Dac a matricea modal aX corespunz atoare unei matriciA este format a din

    n coloane liniar independente (vectorii proprii ai matriciiA

    sunt liniar independenti),atunci exist aX1 si ecuatia modal a se scrie sub forma

    X1 A X = .

    Matricile asociate aceluiasi operator relativ la doua baze diferite matrici similare.

    Teorema 9.2 Dou a matrici cu elemente reale, A,B Mnn< , sunt similare dac asi nu-mai dac a exist a o matrice nesingular aS Mnn< , astfel ca

    B = S

    1 A S,

    operatie care se numestetransformare similaraa matriciiA.

    Teorema 9.3 Dou a matrici similare au aceleasi valori proprii. Vectorii proprii corespun-zatori rezult a unii din altii cu ajutorul matricii transform arii.

    Ecuatia modala X1 A X = A si suntsimilare.

    Matricile similare cu o matrice diagonala se numesc matrici diagonalizabile.

    Importanta procesului de diagonalizareDaca se poate gasi o transformare care diagonalizeaza matricea:

    valorile proprii se afla pe diagonala principala a matricii transformate

    vectorii proprii corespunzatori sunt coloanele matricii transformarii.

    2

  • 7/25/2019 Tehnici de Programare Master

    58/131

    8.3 Metoda lui JacobiProbleme de valorisi vectori proprii pentrumatrici reale simetrice.Vectorii proprii realisi ortogonali diagonalizare cu ajutorul unei matrici ortogonale:

    R RT = RT R = E sau R1 = RT

    Diagonalizarea prin transformarea de similitudine:

    RT A R =

    Ideea:

    Transformari similare ortogonale succesive anuleaza cte doua elemente simetrice.

    Transformarile distrug zerourile anterioare, dar diagonalizeaza treptat matricea.

    Produsul transformarilor matricea modala pe coloane vectorii proprii.

    Cazul 22 transformare ortogonala matrice de rotatie plana:

    R =

    cos sin sin cos

    Rotire de unghi a sistemului vectorilor de baza.rezulta din conditia ca R sa diagonalizeze matricea A.

    Transformarea ortogonala:A0 = RT A R

    Elementele:

    a011 = a11cos2 + 2a21sin cos +a22sin2 a022 = a11sin

    2 2a21sin cos +a22cos2

    a021 = a21(cos2 sin2 ) + (a22 a11)sin cos = a012,

    Transformarea conserva caracterul simetric al matricii.

    Conditia de anulare a elementelor nediagonale ale matricii A0:

    cot2 +a22 a11

    a21cot 1 = 0

    Rezolvare n raport cucot :

    tan =

    a11 a222a21

    sa11 a22

    2a21

    2

    + 1

    1

    Se determinacos = (1 + tan )1/2 sisin = tan cos .

    Valorilesi vectorii proprii:

    1 = a011, x

    (1) =

    cos sin

    2 = a022, x

    (2) =

    sin

    cos Diagonalizare exactaprintr-o singura transformare ortogonala.

    3

  • 7/25/2019 Tehnici de Programare Master

    59/131

    Cazul n n

    R(i, j) =

    1 ...

    ... 0 cos sin

    ... . . . ...

    sin cos

    0 ...

    ... 1

    liniai

    liniaj

    coloana i coloanaj

    Transformarea ortogonala anuleaza elementele extradiagonale a0ij sia0ji:

    A0 = RT(i, j) A R(i, j)

    Singurele elemente diferite de ale matricii A pe liniilesi coloanelei sij .

    Rescriem:

    A = A R(i, j), A0 = RT(i, j) ADetaliat:

    a1i a1j...

    ... aki akj

    ... ...

    ani anj

    =

    a1i a1j...

    ... aki akj

    ... ...

    ani anj

    1 ...

    ... 0 cos sin

    ... . . . ...

    sin cos

    0 ...

    ... 1

    Elementele relevante de pe coloanele i sij : aki = akicos +akjsin , k= 1, 2,...,nakj = akisin +akjcos .

    ...a0i1 a

    0ik a

    0in

    ...a0j1 a

    0jk a

    0jn

    ...

    =

    1 ...

    ... 0 cos sin

    ... . . .

    ... sin cos

    0 ...

    ... 1

    ...ai1 aik ain

    ...aj1 ajk ajn

    ...

    Elementele relevante de pe liniilei sij :a0ik= aikcos + ajksin , k= 1, 2,...,na0jk = aiksin + ajkcos .

    Elementele modificate ale matricii A0

    a0ik =a0ki = aikcos +ajksin , k= 1, 2,...,n

    a0jk =a0kj = aiksin +ajkcos , k6=i, j

    a0ii=aiicos2 + 2ajisin cos +ajj sin

    2 a0jj =aiisin

    2 2ajisin cos +ajj cos2

    a

    0

    ij =a

    0

    ji = aji(cos

    2

    sin

    2

    ) + (ajj

    aii)sin cos .

    4

  • 7/25/2019 Tehnici de Programare Master

    60/131

    Conditia de anulare a elementelor nediagonale ale matricii A0:

    cot2 +ajj aii

    ajicot 1 = 0

    Rezolvare n raport cucot :

    tan =

    aii ajj

    2aji

    saii ajj

    2aji

    2+ 1

    1

    Se determina:cos =

    1p1 + tan2

    , sin = cos tan

    Sir de matrici similare avnd acelasi sistem de valori proprii:

    A0 = A, Al = RTl Al1 Rl, l= 0, 1, 2, . . .

    Sir de matrici ortogonale

    X0 R0 E, Xl = R0R1 Rl, l= 0, 1, 2, . . .

    Sirul de matrici similare:

    A0 = A, Al = XTl A Xl, l= 0, 1, 2, . . .

    La limit

    a: liml

    Al = , liml

    Xl = X

    Relatie de recurenta:Xl = Xl1Rl(i, j)

    Elementele modificate ale matricii Xl: x0ki = xkicos +xkjsin , k= 1, 2,...,n,x0kj = xkisin +xkjcos .

    Criteriu de convergenta:maxi6=j

    |a0ij|

    Diagonala lui Al valorile proprii, coloanele lui Xl vectorii proprii.

    Stabilitatea metodei rotatie a vectorilor de baza de unghi minim ( /4).Maximizarea valorii absolute a numitorului expresieitan :

    tan =sign

    aii ajj2aji

    aii ajj2aji

    +

    saii ajj

    2aji

    2+ 1

    1

    5

  • 7/25/2019 Tehnici de Programare Master

    61/131

    /*=========================================================================*/int Jacobi(float **a, float **x, float d[], int n)/*---------------------------------------------------------------------------Rezolva problema de valori si vectori proprii pt. o matrice reala simetrica

    a - matricea reala simetrica (jumatatea inferioara este distrusa)x - matricea modala: coloanele sunt vectorii proprii (iesire)d - tabloul valorilor propriin - ordinul matricii aReturneaza indicele de eroare: 0 - executie normala

    1 - nr. maxim de iteratii depasit---------------------------------------------------------------------------*/{

    const float eps = 1e-30; /* criteriu de precizie */const int itmax = 50; /* nr. maxim de iteratii */float aii, aji, ajj, amax, c, s, t;int i, it, j, k;

    for (i=1; i

  • 7/25/2019 Tehnici de Programare Master

    62/131

    11INTEGRAREA FUNCTIILOR

    11.1 Introducere

    Daca pt.f(x)continua pe[a, b]este cunoscuta primitiva F(x) formula Newton-Leibnitz:

    I=

    Z ba

    f(x)dx= F(b) F(a).

    Calculul numeric al integralelor simple cuadratura.

    Aproximarea integralei printr-o sum

    a ponderat

    a de valorif(xi)pt. anumite argumentexidin domeniul de integrare: Z ba

    f(x)dx nX

    i=1

    wif(xi).

    Calculul numeric al integralelor duble cubatura.

  • 7/25/2019 Tehnici de Programare Master

    63/131

    11.2 Formulele de cuadratura Newton-CotesSe cere:

    I=

    Z ba

    f(x)dx.

    Fie nodurile echidistantexi [a, b]:xi=a+ (i 1)h, i= 1, 2, . . . , n

    h= (b a)/(n 1).

    Aproximam functiaf(x)prin polinomul de interpolare Lagrange (fi f(xi)):

    Pn1(x) =nX

    i=1

    Qnj6=i(x xj)Qnj6=i(xi xj)

    fi.

    Definim variabila adimensionala:

    q= (x

    a)/h, q

    [0, n

    1].

    Variabila initiala se scriex= a+qh.

    Produsele din expresia polinomului de interpolare Lagrange:nY

    j6=i

    (x xj) = hn1nY

    j6=i

    [q (j 1)]

    nYj6=i

    (xi xj) = hn1nY

    j6=i

    (ij) = (1)nihn1i1Yj=1

    (ij)nY

    j=i+1

    (j i) = (1)nihn1(i 1)!(n i)!

    Polinomul Lagrange:

    Pn1(x) =nX

    i=1

    Qnj6=i[q (j 1)]

    (1)ni(i 1)!(n i)! fi

    Aproximatie a integralei:Z ba

    f(x)dx Z ba

    Pn1(x)dx=nX

    i=1

    Aifi,

    Ai =

    Z ba

    Qnj6=i[q (j 1)]dx

    (1)ni(i 1)!(n i)! =hRn10

    Qnj6=i[q (j 1)]dq

    (1)ni(i 1)!(n i)! .

    PunemAi= (b a)Hi formula de cuadratura Newton-Cotes:Z ba

    f(x)dx (b a)nX

    i=1

    Hifi,

    Coeficientii Cotes:

    Hi=

    Rn10

    Qnj6=i[q (j 1)]dq

    (1)ni(i 1)!(n i)!(n 1) , i= 1, 2, . . . , n .

    Proprietati:n

    Xi=1

    Hi = 1, Hi= Hni+1.

    2

  • 7/25/2019 Tehnici de Programare Master

    64/131

    11.3 Formula trapezelor

    Coeficientii Cotes pt. n= 2:

    H1 =Z

    1

    0

    (q

    1)dq=1

    2

    , H2= Z 1

    0

    qdq=1

    2

    .

    Formula trapezului: Z x2x1

    f(x)dx h2

    (f1+f2).

    y

    xx1 x2

    f1

    f2

    h

    = ( )y f x

    = ( )y xP1

    FIGURA 11.1. Formula trapezului aproximeaza functia prin dreapta care trece prin punctele(x1, f1) si(x2, f2).

    Restul formulei trapezului presupunnd f(x) C(2)[a, b]:

    R(h) =

    Z x1+hx1

    f(x)dx h2

    [f(x1) +f(x1+h)].

    Derivam de doua ori n raport cu h:

    R0(h) = 1

    2[f(x1+h) f(x1)]

    h

    2f0(x1+h)

    R00

    (h) = h

    2 f00

    (x1+h).

    Integram de doua ori n raport cuh (R(0) =R0(0) = 0)si utilizamteorema mediei:

    R0(h) =R0(0) +

    Z h0

    R00(t)dt= 12

    f00(1)

    Z h0

    tdt= h2

    4f00(1), 1 (x1, x1+h)

    R(h) =R(0) +

    Z h0

    R0(t)dt= 14

    f00()

    Z h0

    t2dt= h3

    12f00(), (x1, x1+h)

    Restul:

    R=

    h3

    12f00(),

    (x1, x2).

    3

  • 7/25/2019 Tehnici de Programare Master

    65/131

    Generalizare formula de interes practic.Utilizamaditivitateaintegralei fata de intervalul de integrare.

    y

    xx1 x2 x3 xi xn

    f1

    fnfi

    h h h

    FIGURA 11.2. Formula trapezelor aproximeaza integrandul cu linia poligonala definita de ab-scisele echidistantesi valorile corespunzatoare ale functiei.

    Divizam[a, b]prin punctele echidistante:

    xi= a+ (i 1)h, i= 1, 2, . . . , n .

    h= (b a)/(n 1)Aplicam formula trapezului fiecarui subinterval[x1, x2],...,[xn1, xn]:Z b

    a

    f(x)dx h2

    (f1+f2) +h

    2(f2+f3) +. . .+

    h

    2(fn1+fn).

    Formula trapezelor:

    Z ba

    f(x)dx h"

    f12

    +n1Xi=2

    fi+fn

    2

    #.

    Restul:

    R= (n 1)h312

    f00() = (b a)h212

    f00(), [a, b].

    /*=========================================================================*/float Trapez(float Func(float), float a, float b, int n)/*---------------------------------------------------------------------------Calculeaza integrala functiei Func pe intervalul [a,b] utilizand formulatrapezelor cu n puncte de integrare---------------------------------------------------------------------------*/{

    float h, s;

    int i;

    4

  • 7/25/2019 Tehnici de Programare Master

    66/131

    h = (b-a)/(n-1);s = 0.5*(Func(a) + Func(b));for (i=1; i

  • 7/25/2019 Tehnici de Programare Master

    67/131

    Controlul automat al preciziei de integrare.

    Calculul integralei pt. un pas h (nde puncte de integrare).

    Compararea cu valoarea integralei pt. h/2((2n 1)puncte de integrare).

    njumatatirea luih pna cnd eroarea relativa a integralei scade sub un .

    h0

    h1

    h2

    h3

    n0=1

    n1=2

    n2=4

    n3=8

    a b

    FIGURA 11.3. Schema de njumatatire a intervalelor n metoda trapezelor cu control automatal pasului. Prin cerculete sunt figurate valorile care trebuie calculate n fiecare etapa.

    Primele aproximatii ale formulei trapezelor:

    T0 = h0

    f(a)

    2 +

    f(b)

    2

    , h0 = b a

    T1 = h1

    f(a)2

    +f(a+h1) + f(b)2

    , h1=h0/2

    T2 = h2

    f(a)

    2 +f(a+h2) +f(a+ 2h2) +f(a+ 3h2) +

    f(b)

    2

    , h2= h1/2

    Proces recurent:

    T0 = h0

    2[f(a) +f(b)], h0=b a, n0 = 1

    Tk = 1

    2

    "Tk1+hk1

    nk1Xi=1

    f(a+ (i 1/2)hk1)#

    ,

    hk =hk1/2, nk= 2nk1, k= 1, 2, . . .

    hk = (b a)/nk lungimea subintervalelor dupa etapaknk = 2k numarul de subintervale dupa etapak (numarul noilor puncte de integrare).

    Criteriu de convergenta:|Tk Tk1| |Tk| .

    6

  • 7/25/2019 Tehnici de Programare Master

    68/131

    /*=========================================================================*/float TrapezControl(float Func(float), float a, float b)/*---------------------------------------------------------------------------Calculeaza integrala functiei Func pe intervalul [a,b] utilizand formulatrapezelor cu controlul automat al pasului de integrare---------------------------------------------------------------------------*/{

    const float eps = 1e-6; /* precizia relativa a integralei */const int kmax = 30; /* numar maxim de injumatatiri */float h, sum, t, t0;long i, n;int k;

    h = b-a; n = 1;t0 = 0.5*h*(Func(a) + Func(b)); /* aproximatie initiala */

    for (k=1; k

  • 7/25/2019 Tehnici de Programare Master

    69/131

    11.4 Formula lui Simpson

    Coeficientii Cotes pentrun= 3:

    H1 = 1

    4Z 2

    0

    (q

    1)(q

    2)dq=1

    6,

    H2 = 1

    2

    Z 20

    q(q 2)dq= 23

    ,

    H3 = 1

    4

    Z 20

    q(q 1)dq= 16

    .

    Formula lui Simpson(x3 x1 = 2h):Z x3x1

    f(x)dx h3

    (f1+ 4f2+f3).

    nlocuirea curbeiy= f(x)cu parabola y= P2(x)definita de(x1, f1),(x2, f2) si(x3, f3).

    Restul:

    R= h5

    90f(4)(), [a, b]

    Generalizare formula de interes practic.Utilizamaditivitateaintegralei fata de intervalul de integrare.Divizam[a, b]printr-un numarimpar,n= 2m+ 1, de puncte echidistante:

    xi= a+ (i

    1)h, i= 1, 2, . . . , n ,

    h= b an 1=

    b a2m

    ,

    Aplicam formula trapezului fiecarui subinterval[x1, x2],...,[xn1, xn]:Z ba

    f(x)dx h3

    (f1+ 4f2+f3) +h

    3(f3+ 4f4+f5) +. . .+

    h

    3(fn2+ 4fn1+fn).

    Formula lui Simpson generalizata,

    Z b

    a

    f(x)dx h3

    (f1+ 42+ 21+fn) ,

    1=

    (n3)/2Xi=1

    f2i+1, 2=

    (n1)/2Xi=1

    f2i.

    Restul admitnd caf(x) C(4)[a, b]:

    R=

    mh5

    90

    f(4)() =

    (b a)h4

    180

    f(4)(),

    [a, b].

    8

  • 7/25/2019 Tehnici de Programare Master

    70/131

    /*=========================================================================*/float Simpson0(float Func(float), float a, float b, int n)/*---------------------------------------------------------------------------Calculeaza integrala functiei Func pe intervalul [a,b] utilizand formula luiSimpson cu n puncte de integrare---------------------------------------------------------------------------*/{

    float h, s1, s2;int i, par = 0;

    if ((n/2)*2 == n) n++; /* incrementeaza n daca este par */

    h = (b-a)/(n-1);s1 = s2 = 0.0;for (i=1; i

  • 7/25/2019 Tehnici de Programare Master

    71/131

    Controlul automat al preciziei de integrare.Primele aproximatii ale formulei lui Simpson:

    S1 = h1

    3[f(a) + 4f(a+h1) +f(b)] =

    4T1 T03

    S2 = h23

    [f(a) + 4f(a+h2) + 2f(a+ 2h2) + 4f(a+ 3h2) +f(b)] =4T2 T13

    Generaliznd:Sk =

    4Tk Tk13

    .

    Proces recurent:

    T0 = h0

    2[f(a) +f(b)], h0 = b a, n0= 1

    Tk = 1

    2

    "Tk1+hk1

    nk1Xi=1

    f(a+ (i 1/2)hk1)#

    , k= 1, 2, . . .

    Sk = 4Tk Tk1

    3 , hk =hk1/2, nk= 2nk1.

    Criteriu de convergenta:|Sk Sk1| |Sk| .

    /*=========================================================================*/float SimpsonControl(float Func(float), float a, float b)/*---------------------------------------------------------------------------Calculeaza integrala functiei Func pe intervalul [a,b] utilizand formula luiSimpson cu controlul automat al pasului de integrare---------------------------------------------------------------------------*/{

    const float eps = 1e-6; /* precizia relativa a integralei */const int kmax = 30; /* numar maxim de injumatatiri */float h, s, s0, sum, t, t0;long i, n;int k;

    h = b-a; n = 1;

    s0 = t0 = 0.5*h*(Func(a) + Func(b)); /* aproximatie initiala */for (k=1; k

  • 7/25/2019 Tehnici de Programare Master

    72/131

    11.8 Integrale multidimensionale

    Complicatii:

    cresterea rapida a numarului de evaluari ale functiei nd

    n nr. de evaluari pt. o schema unidimensionala,d dimensiunea integralei dificultatea descrierii frontierei (d 1)-dimensionale a domeniului de integrare.

    Optiuni pt. integranzi netezi:

    frontiere complicate, precizie redus a metoda Monte Carlo(lent convergenta n raport cu numarul de puncte de integrare).

    frontiere simple, precizie ridicat a descompunerea n integrale 1D repetate

    aplicarea unui integrator 1D cu control automat al pasului pt.fi

    ecare dimensiune.

    Integrala bidimensionala:Z xmaxxmin

    Z ymax(x)ymin(x)

    f(x, y)dxdy=

    Z xmaxxmin

    Fx(x)dx, F x(x) =

    Z ymax(x)ymin(x)

    f(x, y)dy,

    integrala exterioara n raport cux, al carei integrand este integrala n raport cu y pe oanumita linie cux fixat.

    y

    xxi xmaxxmin

    xiymax( )

    xiymin( )

    FIGURA 11.4. n metoda descompunerii n integrale unidimensionale, integrarea interioaradupa y are loc pe o retea de puncte independenta pentru fiecare argument xi al integrariiexterioare.

    Pt. fiecare xise calculeaza

    Fx(xi) =

    Z ymax(xi)ymin(xi)

    f(xi, y)dy

    pe o retea determinata de particularitatile locale ale integrandului.

    11

  • 7/25/2019 Tehnici de Programare Master

    73/131

    Exemplu:

    I=

    Z 10

    dx

    Z1x20

    p1 x2 y2 dy=

    6 0.523599.

    Domeniul de integrare primul cadran al cercului de raza1.

    Rezultatul volumul primului octant al sferei de raz

    a1.

    #include #include

    float xconst;

    /*=========================================================================*/float func(float x, float y){

    return sqrt(fabs(1. - x*x - y*y));}

    /*=========================================================================*/

    float ymin(float x) { return 0.0; }

    /*=========================================================================*/float ymax(float x) { return sqrt(1. - x*x); }

    /*=========================================================================*/float SimpsonControl(float Func(float), float a, float b){. . . . . . . . . .}

    /*=========================================================================*/float Fy(float y) /* functie interfata de o variabila */{ /* pt. functia utilizator func(x,y) */

    return func(xconst,y); /* xconst este variabila globala */}

    /*=========================================================================*/float Fx(float x){

    xconst = x;return SimpsonControl(Fy,ymin(x),ymax(x));

    }

    /*=========================================================================*/void main(){

    float xmin = 0.0, xmax = 1.0;

    printf("Integrala = %f\n",SimpsonControl(Fx,xmin,xmax));}

    Pt. a fiintegrata n raport cu y, funceste apelata prin functia interfataFy.Parametrul global xconstsi primeste valoarea n functiaFx.

    Integrala tripla:Z xmaxxmin

    Z ymax(x)ymin(x)

    Z zmax(x,y)zmin(x,y)

    f(x,y,z)dxdydz=

    Z xmaxxmin

    Fx(x)dx,

    Fx(x) = Z ymax(x)

    ymin(x)

    Fy(x, y)dy, F y(x, y) = Z zmax(x,y)

    zmin(x,y)

    f(x,y,z)dz.

    12

  • 7/25/2019 Tehnici de Programare Master

    74/131

    Exemplu:

    I=

    Z 10

    dx

    Z1x20

    dy

    Z1x2y20

    dz=

    6 0.523599,

    #include #include

    float xconst, yconst;

    /*=========================================================================*/float func(float x, float y, float z){

    return 1.0;}

    /*=========================================================================*/float ymin(float x) { return 0.0; }

    /*=========================================================================*/float ymax(float x) { return sqrt(1. - x*x); }

    /*=========================================================================*/float zmin(float x, float y) { return 0.0; }

    /*=========================================================================*/float zmax(float x, float y) { return sqrt(fabs(1. - x*x - y*y)); }

    /*=========================================================================*/float SimpsonControl(float Func(float), float a, float b){. . . . . . . . . .}

    /*=========================================================================*/float Fz(float z) /* functie interfata de o variabila */{ /* pt. functia utilizator func(x,y,z) */

    return func(xconst,yconst,z); /* xconst, yconst - variabile globale */}

    /*=========================================================================*/float Fy(float y){

    yconst = y;return SimpsonControl(Fz,zmin(xconst,y),zmax(xconst,y));

    }

    /*=========================================================================*/float Fx(float x){

    xconst = x;return SimpsonControl(Fy,ymin(x),ymax(x));

    }

    /*=========================================================================*/void main(){

    float xmin = 0.0, xmax = 1.0;

    printf("Integrala = %f\n",SimpsonControl(Fx,xmin,xmax));}

    Pt. a fiintegrata n raport cu z, funceste apelata prin functia interfataFz.Parametrii globali xconst siyconstsi primesc valorile n functiaFx, respectiv Fy.

    13

  • 7/25/2019 Tehnici de Programare Master

    75/131

    Bibliography

    [1] M. Abramowitz si I. Stegun, Handbook of Mathematical Functions(Dover Publica-tions, New York, 1972).

    [2] A.H. Stroudsi D. Secrest, Gaussian Cuadrature Formulas(Prentice-Hall, EnglewoodCliffs, 1966).

    [3] A.H. Stroud,Approximate Calculation of Multiple Integrals(Prentice-Hall, EnglewoodCliffs, 1971).

    [4] A. Ralston si P. Rabinowitz, A First Course in Numerical Analysis (McGraw-Hill,New York, 1978).

    [5] B.P. Demidovich si I.A. Maron, Computational Mathematics (MIR Publishers,Moskow, 1981).

    [6] R.L. Burden si J.D. Faires, Numerical Analysis, Third Edition (Prindle, Weber &Schmidt, Boston, 1985).

    [7] W.H. Press, S.A. Teukolsky, W.T. Vetterling si B.P. Flannery, Numerical Recipes inC: The Art of Scientific Computing, Second Edition (Cambridge University Press,Cambridge, 1992).

  • 7/25/2019 Tehnici de Programare Master

    76/131

    13ECUATII DIFERENTIALE ORDINARE

    11.1 Introducere

    Importanta multe legi ale fizicii au formulari diferentiale.Ecuatiile de miscare ale mecanicii clasice, ecuatiile difuziei si transportului de caldura,ecuatia lui Schrdinger etc.

    Exemplu: ecuatia de miscare a unei particule de masam ntr-un cmp de forteF(x):

    md2x

    dt2

    =F(x).

    Definind impulsul particulei

    p= mdx

    dt,

    ecuatia de miscare doua ecuatii de ordinul nti (ecuatiile lui Hamilton):

    dx

    dt =

    p

    m,

    dp

    dt =F(x).

    Este suficienta considerarea metodelor de rezolvare pt. ecuatii sau sisteme de ecuatii deordinul nti.

  • 7/25/2019 Tehnici de Programare Master

    77/131

    Sistem de ecuatii diferentiale de ordinul nti:

    y0i(x) =fi(x, y1(x), y2(x), . . . , yn(x)), i= 1, 2, . . . , n .

    Ecuatie diferentiala de ordinuln,y(n) =f(x,y,y0, . . . , y(n1)),

    Considernd ca necunoscute

    y1 y(x), y2 y0(x), . . . yn y

    (n1)(x)

    sistem denecuatii diferentiale de ordinul nti:

    y0i(x) =yi+1(x), i= 1, 2, . . . , n 1y0n

    (x) =f(x, y1(x), y

    2(x), . . . , y

    n(x)).

    Sistemul sub forma matricialay0(x) =f(x, y),

    cu

    y=

    y1(x)y2(x)

    ...yn(x)

    , f(x, y) =

    f1(x, y1(x), . . . , yn(x))f2(x, y1(x), . . . , yn(x))

    ...fn(x, y1(x), . . . , yn(x))

    .

    Tipuri de probleme:

    probleme cu conditii initialesauprobleme Cauchy conditii suplimentare ntr-unpunct initialx0,

    y(x0) =y0.

    Rezolvarea determinarea progresiva a solutiei pe o retea de punctex0,x1,x2, . . .,xmax.

    Tipuri de metode:

    metode directe(pas cu pas, sauunipas) solutia la un pas xmnumai pe bazainformatiilor din nodul anterior, xm1, si, eventual, din intervalul [xm1, xm].metodele Eulersi Runge-Kutta

    metode indirecte (sau multipas) solutia la un pas xm pe baza informatiilorde la mai multi pasi anteriorixm1,xm2, . . .metodele Adams-Moulton, Milne, Fox-Goodwinsi Numerov.

    probleme cu conditii la limit a bilocale sau problemele de tip Dirichlet conditiiasupra valorilor solutieisi derivatelor la capetele unui interval [xmin, xmax].

    2

  • 7/25/2019 Tehnici de Programare Master

    78/131

    13.2 Metoda dezvoltarii n serie Taylor

    Importanta furnizeaza criterii pentru evaluarea preciziei metodelor de interes practic.

    Fie problema Cauchy:

    y0 =f(x, y),

    y(x0) =y0.

    Dezvoltarea solutiei n serie Taylor n vecinatatea luix0:

    y(x) =y(x0) +x x0

    1! y0(x0) +

    (x x0)2

    2! y00(x0) +. . .

    Propagarea solutiei de la punctul de reteaxm la punctul xm+1:

    ym+1=ym+hy0

    m+h2

    2y00m+. . . ,

    cuh= xm+1 xm.

    Cu ct heste mai mic, seria converge mai rapid siym+1 aproximeaza mai bine valoareaexactay(xm+1)a solutiei.

    Din ecuatia diferentialay0m=f(xm, ym).

    Derivnd ambii membri ai ecuatiei diferentiale

    y00m=

    f

    x+

    f

    y

    y

    x

    xm,ym

    =

    f

    x+f

    f

    y

    xm,ym

    .

    Rezulta formula de propagare

    ym+1=ym+hf(xm, ym) +h2

    2

    f

    x+f

    f

    y

    xm,ym

    +O(h3).

    Metod a direct a, de tip explicit.

    Definitia 13.1 O metod a estede ordinul p dac a furnizeaz a o solutie echivalent a cu dez-voltarea Taylor a solutiei exacte pn a la termeni de ordinulhp.

    3

  • 7/25/2019 Tehnici de Programare Master

    79/131

    13.3 Metoda lui Euler (metoda liniilor poligonale)

    Aproximatia liniara a metodei dezvoltarii n serie Taylor:

    ym+1 = ym+hf(xm, ym), m= 0, 1, 2, . . . ,

    cuh= xm+1 xm.

    Metod a direct ade ordinul1, de tipexplicit

    y

    xxmx0 x1

    ymy0 y1

    xm+1

    ym+1

    y y x= ( )

    h

    . . .

    FIGURA 13.1. n metoda Euler se aproximeaza solutia exacta cu o linie poligonala.

    Erorile de trunchieresi de rotunjire se propaga de la un pas la altul.

    Algoritmul predictor-corector al lui Euler (metoda de ordinul 2):

    1. se calculeaza valoarea predictorypm+1dinformula predictor:

    ypm+1=ym+hf(xm, ym),

    2. se calculeaza recurent valoarea corectorycm+1din formula corector

    y

    c

    m+1=ym+

    h

    2

    f(xm, ym) +f(xm+1, y

    p

    m+1)

    .

    nlocuind de fiecare data ypm+1 cu valoarea anterioara ycm+1, pna cnd se obtine

    precizia dorita ycm+1 y

    pm+1

    , >0.

    4

  • 7/25/2019 Tehnici de Programare Master

    80/131

    13.4 Metodele Runge-Kutta

    Proprietati:

    metode directe (pas cu pas) posibilitatea autopornirii.

    solutia prin metoda Runge-Kutta de ordinul p este echivalenta cu dezvoltarea nserie Taylor pna nhp.

    necesita numai evaluarea functieif(x, y), nusi a derivatelor.

    Fie ecuatia:y0 =f(x, y).

    Propagarea solutiei prin metoda dezvoltarii n serie Taylor:

    ym+1=ym+hf(xm, ym) +h2

    2

    f

    x+f

    f

    y

    xm,ym

    +. . .

    Se cauta o formula de propagare care sa depinda def(x, y), dar nusi de derivatele sale:

    ym+1 = ym+

    pXi=1

    wiki,

    ki = hf(i

    , i

    )i= xm+ih

    i = ym+i1Xj=1

    ijkj.

    Se alege:1= 0, 11= 0, 1 = xm, 1 = ym.

    Rezulta:

    k1 = hf(xm, ym)k2 = hf(xm+2h, ym+

    21

    k1)k3 = hf(xm+3h, ym+31k1+32k2)

    Metoda Runge-Kutta p= 1:

    ym+1=ym+hf(xm, ym)

    metoda lui Euler.

    5

  • 7/25/2019 Tehnici de Programare Master

    81/131

    Metoda Runge-Kutta p= 2:

    ym+1=ym+w1k1+w2k2,

    k1 = hf(xm, ym)

    k2 = hf(xm+2h, ym+21k1),sau

    ym+1=ym+w1hf(xm, ym) +w2hf(xm+2h, ym+21hf(xm, ym)).

    Dezvoltam dupa puterile luih:

    ym+1 = ym+ (w1+w2)hf(xm, ym) +h2

    w22

    f

    x+w221f

    f

    y

    xm,ym

    .

    Comparnd cu dezvoltarea n serie rezulta:

    w1+w2 = 1w22= 1/2

    w221= 1/2.

    Nu are solutie unica solutie posibilia:

    2 = 21 = 1

    w1=w2 = 1/2.

    Formulele metodei Runge-Kutta de ordinul doi:

    ym+1= ym+12(k1+k2),

    unde k1=hf(xm, ym)k2=hf(xm+h, ym+k1),

    sauym+1=ym+

    h

    2[f(xm, ym) +f(xm+h, ym+hf(xm, ym))].

    algoritmul predictor-corector al lui Euler (formula predictor nlocuita n cea corector).

    Metoda Runge-Kutta p= 4(varianta cea mai importanta):

    ym+1 = ym+1

    6(k1+ 2k2+ 2k3+k4), m= 0, 1, 2, . . . ,

    cu

    k1=hf(xm, ym)k2=hf(xm+h/2, ym+k1/2)k3=hf(xm+h/2, ym+k2/2)k4=hf(xm+h, ym+k3).

    Eroarea de trunchiere:

    T =Kh5

    .

    6

  • 7/25/2019 Tehnici de Programare Master

    82/131

    Sisteme de ecuatiidiferentiale de ordinul nti:

    y0i(x) =fi(x, y1(x), y2(x), . . . , yn(x)), i= 1, 2, . . . , n ,

    Formulele Runge-Kuttap = 4:

    ym+1,i=ym,i+ h6

    hf1,i+ 2(f2,i+ f3,i) + f4,i

    i, i= 1, 2, . . . , n ,

    cu

    f1,i= fi(xm, {ym,i})

    f2,i= fi(xm+h/2, {ym,i+ (h/2)f1,i})

    f3,i= fi(xm+h/2, {ym,i+ (h/2)f2,i})

    f4,i= fi(xm+h, {ym,i+hf3,i}).

    #include "memalloc.h"

    /*=========================================================================*/

    void RungeKutta(float x, float h, float y0[], float y[], int n,void Func(float,float[],float[]))

    /*---------------------------------------------------------------------------Utilizeaza metoda Runge-Kutta de ordinul 4 pentru a propaga solutia unuisistem de ecuatii diferentiale ordinare de ordinul 1

    y[i] = f[i](x,y[1],...,y[n]), i = 1..n

    x - punctul initialh - distanta pe care este propagata solutiay0[] - valorile componentelor solutiei in punctul initial xy[] - valorile solutiei propagate in punctul x + hn - numarul ecuatiilor diferentialeFunc - rutina utilizator care returneaza membrii drepti f[i](...) ai

    ecuatiilor; definitie:void Func(float x, float y[], float f[]);---------------------------------------------------------------------------*/{

    int i;float h2, h6;float *f1, *f2, *f3, *f4;

    f1 = Vector(1,n);f2 = Vector(1,n);f3 = Vector(1,n);f4 = Vector(1,n);

    h2 = 0.5*h;Func(x,y0,f1);

    for (i=1; i

  • 7/25/2019 Tehnici de Programare Master

    83/131

    Exemplu:y00 +y = 0

    cu conditiile initiale:

    y(x0) =y0

    y0

    (x0) =y0

    0.Solutia generala:y(x) =A sin x+Bcos x.

    Forma echivalenta a ecuatiei sistem de doua ecuatii de ordinul nti:

    y01= y2y02= y1,

    cu conditiile initiale: y1(x0) =y0y2(x0) =y

    0

    0.

    Caz particular:

    y1(0) = 0,

    y2(0) = 1,

    solutia

    y1(x) = sin x,

    y2(x) = cos x.

    8

  • 7/25/2019 Tehnici de Programare Master

    84/131

    /*---------------------------------------------------------------------------Rezolva un sistem de ecuatii diferentiale ordinare de ordinul 1 prin metodaRunge-Kutta de ordinul 4---------------------------------------------------------------------------*/

    #include #include "memalloc.h"

    /*=========================================================================*/void Func1(float x, float y[], float f[])/*---------------------------------------------------------------------------Returneaza membrii drepti ai sistemului de ecuatii diferentiale---------------------------------------------------------------------------*/{

    f[1] = y[2];f[2] = -y[1];

    }

    /*=========================================================================*/void RungeKutta(float x, float h, float y0[], float y[], int n,

    void Func(float,float[],float[]))

    { . . . . . . . . . .}

    /*=========================================================================*/void main(){

    int i, n;float h, x, xmin, xmax;float *y, *y0;

    printf("n = "); scanf("%i",&n); /* ordinul sistemului */

    y0 = Vector(1,n);y = Vector(1,n);

    printf("xmin = "); scanf("%f",&xmin); /* domeniul de integrare */printf("xmax = "); scanf("%f",&xmax);for (i=1; i

  • 7/25/2019 Tehnici de Programare Master

    85/131

    Bibliography

    [1] C.W. Gear, Numerical Initial Value Problems in Ordinary Differential Equations(Prentice-Hall, Englewood Cliffs, NJ, 1971).

    [2] L.Gr. Ixaru, Metode numerice pentru ecuatii diferentiale cu aplicatii(Editura Acad-emiei, Bucuresti, 1979).

    [3] J. Stoer si R. Bulirsch, Introduction to Numerical Analysis(Springer-Verlag, NewYork, 1980).

    [4] M. Tomasi I. Odagescu, Metode numericesi subroutine, Editura tehnica, Bucuresti,1980).

    [5] W.H. Press, S.A. Teukolsky, W.T. Vetterling si B.P. Fl