26
UNIVERSITATEA VALAHIA DIN TÂRGOVIŞTE FACULTATEA DE INGINERIE ELECTRICĂ Metode numerice Teme de casă Studenţi : Nistor F. Gabriel - Energetică Industrială Drăgnescu Bogdan - Energetică Industrială 2011

metode numerice

Embed Size (px)

Citation preview

Page 1: metode numerice

UNIVERSITATEA VALAHIA DIN TÂRGOVIŞTE

FACULTATEA DE INGINERIE ELECTRICĂ

Metode numerice

Teme de casă

Studenţi :

Nistor F. Gabriel - Energetică Industrială

Drăgnescu Bogdan - Energetică Industrială

Socoteanu Răzvan - Energetică Industrială

Crăciun Radu Ioan - Electrotehnică

Anul II

2011

Page 2: metode numerice

Propagarea erorilor

Operaţii aritmetice cu valori aproximative ¿>¿ necesitatea cunoaşterii efectului erorilor

operanzilor asupra erorii rezultatului şi asupra operaţiilor următoare.

Fie cei doi operanzi cu valorile exacte X şi Y şi valorile aproximative X , respectiv Y :

X=X+ε X; Y=Y +εY (1)

Operaţiile aritmetice elementare:

a) Adunarea.

X+Y =X+Y +ε X+εY din (1)

X+Y =X+Y +ε X+Y

ε X+ y=ε X +εY

Se aplică proprietăţile modulului

ε aX+ y ≤ ε aX+εaY .

Exprimarea erorii relative:

ε rX+ y=εaX+ y

|X+Y|≤εaX

|X+Y|+ε aY

|X+Y|=εaX

|X| ·X

|X+Y|+εaY

|Y| ·Y

|X+Y|=εrX ·X

|X+Y|+εrY ·Y

|X+Y|

Observaţii:

1. Eroarea absolută a sumei nu depăşeşte suma erorilor absolute ale termenilor.

2. Dacă operanzii sunt de acelaşi semn, eroarea relativă a sumei nu depăşeşte suma erorilor

relative ale termenilor.

b) Scăderea. Calcule similare adunării:

X−Y=X−Y +ε X−εY din (1)

X−Y=X−Y +ε X− y

ε X−Y=ε X−εY

Se aplică din nou proprietăţile modulului

ε aX−Y ≤ εaX+εaY

Exprimarea erorii relative:

ε rX− y=ε aX− y

|X−Y|≤ε aX

|X−Y|+εaY

|X−Y|=εaX

|X|·X

|X−Y|+εaY

|Y| ·Y

|X−Y|=ε rX ·X

|X−Y|+εrY ·Y

|X−Y|

Observaţii:

1. Eroarea absolută a diferenţei nu depăşeşte suma erorilor absolute ale termenilor.

2. Precizia este puternic afectată când cei doi operanzi au acelaşi semn şi sunt de valori

apropiate ¿>¿astfel de scăderi trebuie evitate.

c) Înmulţirea.

2

Page 3: metode numerice

XY =( X+ε X ) (Y +εY )=X ·Y +X εY +Y ε X+ε X εY

Termenul ε X εYeste neglijabil XY ≈ X ·Y + X εY +Y ε X,

ε XY=X εY+Y εX

Majorant al erorii absolute:

ε aXY ≤|X|εaY +|Y|εaX

Majorant al erorii relative:

ε rXY=εaXY

|X Y|≤|X|εaY+|Y|εaX

|X Y| =εaY

|Y|+εaX

|X|=εrX +εrY

Operanzi nenuli ! ¿>¿concluzie similară adunării.

d) Împărţirea. Calcule similare înmulţirii:

XY

=X+ε X

Y +εY

≤( X+ε X ) (Y−εY )

Y 2−εY2 =

X · Y +X ε Y+Y ε X−ε X εY

Y 2−εY2

Termenii ε X εYşi ε Y2sunt neglijabili¿>¿

XY

≈XY

+ε X

Y+

εY

Y 2

¿>ε X /Y=ε X

Y+

X εY

Y 2

Majorant al erorii absolute

ε aX /Y ≤ε aX

|Y|+|X|εaY

Y 2

Majorant al erorii relative

ε rX /Y ≤εaX /Y

|X /Y|≤

εaX

|Y|+εaY

|Y|2

|X|/|Y| =εaX

|X|+ε aY

|Y|=ε rX+εrY

Operanzi nenuli ! ¿>¿concluzie similară adunării.

Consideraţii teoretice:

Considerăm funcţia f :[a,b] R, x ε [a ,b] şi ecuaţia algebrică f(x) = 0 . (1)

Separarea rădăcinilor unei ecuaţii f (x) = 0 constă în determinarea unor intervale în

domeniul de definiţie al funcţiei, în care să existe o singură rădăcină reală. Pentru separarea

rădăcinilor reale există mai multe metode dintre care amintim: metoda şirului lui Rolle, metoda

şirului lui Şturm

3

Page 4: metode numerice

1. METODA ŞIRULUI LUI ROLLE

Această metodă se bazează pe o consecinţă a teoremei lui Rolle care afirmă că: între două

rădăcini consecutive ale derivatei f '(x) = 0 există cel mult o rădăcină reală a ecuaţiei f (x) = 0 .

Există cu siguranţă o soluţie între rădăcinile consecutive ale derivatei f '(x) = 0 , dacă produsul

valorilor funcţiei pentru cele două rădăcini consecutive ale derivatei este negativ .

Considerăm x1 < x2 < x3<……< xn, rădăcinile ecuaţiei f '(x) = 0 . Se construieşte şirul lui

Rolle:

f (a), f (x1), f (x2 ),….., f (xn ), f (b) (2)

Numărul de variaţii de semn din şirul lui Rolle reprezintă numărul de rădăcini reale ale

ecuaţiei f (x) = 0 , iar rădăcinile consecutive ale derivatei pentru care avem variaţia de semn a

şirului reprezintă intervalele în care există o rădăcină reală a ecuaţiei (1).

Dacă f (x) este definită pe întreaga axă reală, R , şirul lui Rolle conţine şi termenii cu

valorile funcţiei la + ∞ şi - ∞ :

f (+ ∞), f (x1), f (x2 ),….., f (xn ), f (- ∞) (3)

Observaţie.

Pentru aplicarea acestei metode trebuie să determinăm soluţiile ecuaţiei f 'x = 0 .

Pentru ecuaţii de grad mai mic metoda este avantajoasă, dar pentru ecuaţii de grad mare

rezolvarea ecuaţiei derivatei poate deveni tot atât de dificilă ca şi rezolvarea ecuaţiei date f (x) = 0

2. METODA ŞIRULUI LUI ŞTURM

Considerăm funcţia definită în (1) care îndeplineşte condiţiile de continuitate şi

derivabilitate pentru x ε[a , b] .

Definiţie. Şirul de funcţii f1 ,f2 ,f3,……., fm continue pe [a,b] care satisfac condiţiile:

1) f0(x) = f (x);

2) fm(x) = 0 pentru x ε [a,b] ;

3) dacă fi (x) = 0 , 1 ≤ i ≤m-1 şi x ε [a,b], atunci

fi-1 (x) * fi+1 (x) < 0 ;

4) dacă f0(x) = 0 pentru x ε (a , b) , atunci f0 `(x) *f1( x) > 0 se numeşte şir Şturm

asociat funcţiei f (x) .

3. Calculul rădăcinii reale prin metoda înjumătăţirii intervalului

Să considerăm ecuaţia f(x)=0,unde funcţia f(x) este continuă pe intervalul [a,b],are o

singură rădăcină reală în acest interval şi f(a)*f(b)<0. Calculăm c=(a+b)/2 – jumătatea intervalului

[a,b]. Dacă f(c)=0, atunci c este chiar rădăcina cautată, dacă nu, atunci rădăcina reală se găseşte

într-unul din intervalele [a,c] sau [c,b], acolo unde funcţia capătă valori de semne contrare la

4

Page 5: metode numerice

capetele intervalului (dacă f(a)*f(c)>0, atunci a=c, altfel b=c, atât cât |a-b|>eps, unde eps - o

eroare precizată).

Figura 1. Prima iteraţie în metoda înjumătăţirii intervalului

4. Metoda lui Newton(metoda tangentelor)

Fie o ecuaţie algebrică sau transcendentă f(x)=0 care admite o singură rădăcină reală în

intervalul [a,b]. Metoda lui Newton este definită după următoarea formulă: xk+1=xk-f(xk) / f’(xk),

k=1,2,…, unde punctul xk+1 este abscisa punctului de intersecţie a tangentei dusă la curba y=f(x) în

punctul xk cu axa ox. De aceea metoda aceasta se numeşte metoda tangentelor. Valoarea xk+1 se

calculează pînă cînd |xk+1-xk|<eps, unde eps – o eroare precizată.

Figura 2. Primele iteraţii în metoda Newton

5. Metoda secantelor (coardei)

Se consideră o funcţie f(x) continuă şi derivabilă pe intervalul [a, b] astfel încât îşi

modifică semnul, adică este îndeplinită condiţia f ( a ) ⋅ f ( b ) < 0 . Fără a limita generalitatea

5

Page 6: metode numerice

metodei presupunem că ecuaţia f(x)=0 are o singură rădăcină ξ ∈(a,b) ca în figura 1 (cu f(a)<0 şi

f(b)>0).

Figura 3 Primele iteraţii în metoda secantelor

În primă fază, se poate aproxima rădăcina ecuaţiei f(x)=0 cu puncul de intersecţie cu axa

Ox a dreptei care trece prin punctele A(a, f(a)) şi B(b, f(b)) de ecuaţie:

y−f (a)f (b )−f (a)

=x−ay−b

≤¿ y−f (a )=(x−a)f (b )−f (a)

b−a

Punctul de intersecţie al dreptei cu axa Ox se obţine introducând condiţia y=0 în ecuaţie.

Se obţine:

x1=a−f (a) b−af ( b )−f (a) (4)

Din figura 3 rezultă că noul subinterval al rădăcinii ξ este (a, x1) deoarece

f ( a ) * f ( x1 ) < 0 . În continuare algoritmul se repetă. Presupunem că ultimul subinterval pentru

care funcţia îşi modifică semnul este (xn-1, xn), adică este îndeplinită condiţia: f ( xn−1)* f ( xn ) < 0

Ţinând seama de relaţia (4) se poate scrie următoarea relaţie de recurenţă a metodei

coardei sau secantei:

xn+1=xn−f (xn)xn−xn−1

f ( xn )−f (xn−1)

Metoda înjumătăţirii intervalului (bisecţiei)

Folosind metoda bisecţiei să se afle rădăcina ecuaţiei algebrice transcendente:

6

Page 7: metode numerice

ln x + 3x2 − 4x −1 = 0 , cu o eroare ε<10-5 (cu cinci zecimale exacte), ştiind că această rădăcină se

află în intervalul [1, 2].

Rezolvare: Pentru determinarea soluţiei ecuaţiei date se aplică algoritmul prezentat mai sus

obţinându-se valorile din tabelul 1.

Tabelul 1

n an Cn bn f(a) f(c) f(b) Eroarea ε1 1 1,5 2 -2 0,155465 3,693 12 1 1,25 1,5 -2 -1,089 0,155465 0,253 1,25 1,375 1,5 -1,089 -0,50967 0,155465 0,1254 1,375 1,4375 1,5 -0,50967 -0,1878 0,155465 0,06255 1,4375 1,46875 1,5 -0,1878 -0,0189 0,155465 0,031256 1,46875 1,484375 1,5 -0,0189 0,0676 0,155465 0,0156257 1,46875 1,4765625 1,484375 -0,0189 0,0241772 0,0676 0,00781258 1,46875 1,472656 1,476562 -0,0189 0,002592 0,024177 0,00399 1,46875 1,470703 1,472656 -0,0189 -0,00817 0,002592 0,0019

10 1,470703 1,471680 1,472656 -0,008169 -0,00279 0,002592 -0,0009711 1,471680 1,472168 1,472656 -0,00279 -0,0001 0,002592 -0,0009812 1,472168 1,472412 1,472656 -0,0001 0,0012 0,002592 0,00024413 1,472168 1,472290 1,472412 -0,0001 0,0005 0,0012 0,0001214 1,472168 1,472229 1,472290 -0,0001 0,0002 0,0005 0,0000615 1,472168 1,472198 1,472229 -0,0001 0,00007 0,0002 0,0000316 1,472168 1,472183 1,472198 -0,0001 -0,00001 0,00007 0,000015

Metoda bisecţiei este slab convergentă. Soluţia aproximativă a ecuaţiei este

ξ=1,472183 calculată cu o eroare ε< 10-5 după şaisprezece paşi.

Metoda coardei (secantei)

Folosind metoda coardei să se determine rădăcina ecuaţiei algebrice: ln x + 3x2 − 4x −1 = 0

, cu o eroare ε < 10-5 (cu cinci zecimale exacte) ştiind că se află în intervalul [1, 2].

Rezolvare

Pentru calculul soluţiei ecuaţiei se aplică relaţia de recurenţă care conduce la obţinerea

valorilor din tabelul 2.

xn+1=xn−f ( xn )xn−xn−1

f ( xn )−f ( xn−1 )

Tabelul2

Pas xn-1 xn+1 xn f(xn-1 ) f(xn+1) f(xn) Eroarea ε

1 1.000000 1.351300 2 -2.000000 -0.626100 3.693147

7

Page 8: metode numerice

2 1.351300 1.445332 2 -0.626100 -0.146033 3.693147 0,09432

3 1.445332 1.466431 2 -0.146033 -0.031635 3.693147 0,021099

4 1.466431 1.470962 2 -0.031635 -0.006742 3.693147 0,004531

5 1.470962 1.471926 2 -0.006742 -0.001432 3.693147 0,000964

6 1.471926 1.472131 2 -0.001432 -0.000304 3.693147 0,000205

7 1.472131 1.472174 2 -0.000304 -0.000064 3.693147 0,000043

8 1.472174 1.472184 2 -0.000064 -0.000014 3.693147 0,000010

9 1.472184 1.472186 2 -0.000014 -0.0000007 3.693147 0,000002

10 1.472186 1.472188 2 -0.0000007 0,00001 3.693147 0,000002

Metoda coardei este slab convergentă. Soluţia aproximativă a ecuaţiei calculată cu o

eroare ε = 10-5 în zece paşi este: ξ=1,472188.

Metoda tangentelor de ordinul I a lui Newton

Folosind metoda tangentelor de ordinul I a lui Newton să se determine rădăcina ecuaţiei

algebrice: ln x + 3x2 − 4x −1 = 0 , cu o eroare ε<10-5 (cu şase zecimale, ultima fiind rotunjită)

ştiind că se află în intervalul [1, 2].

Rezolvare

Notând f ( x ) = ln x + 3x2 − 4x −1 , atunci derivatele lui f(x) sunt:

f (x )=1x+6 x−4 şi f =−1

x2+6

Se observă că în intervalul [1, 2] sunt îndeplinite condiţiile cerute:

f ‘( x ) > 0 si f’’( x ) ≠ 0

Pentru determinarea soluţiei aproximative se aplică relaţia de recurenţă luând ca punct de

start x=2 , obţinându-se valorile din tabelul 3.

xn+1=xn−f ( xn )f ' ( xn )

Tabelul 3

Pas xn f(xn) f'(xn) xn+1 f(xn+1) Eroarea ε1. 2 3.693147 8.5 1.565512 0.538649 0,4344882. 1.565512 0.538649 6.031841 1.476211 0.022232 0,0893013. 1.476211 0.022232 5.534677 1.472194 4.47E-05 0,0040174. 1.472194 4.47E-05 5.512424 1.472184 1.82E-10 0,000008

Se observă din tabelul 3 că această metodă este rapid convergentă.

Soluţia aproximativă a ecuaţiei calculată cu şase zecimale exacte este ξ=1,472184.

Metoda lui Gauss pentru rezolvarea ecuaţiilor

Să se rezolve sistemul cu metoda lui Gauss:

8

Page 9: metode numerice

{2x+4 y+3 z=1x−2 y−4 z=34 x− y−5 z=9

Sistemul se poate scrie sub forma: A⋅t=B , unde

A=[2 4 31 −2 −44 −1 −5 ]

t=[ xyz ]

B=[139 ]a31>a11⇒

P13=[0 0 10 1 00 0 1 ]

⇒ P13⋅A⋅t=P13⋅B⇒ A1⋅t=B1

[ A2 B2 ]=L1 [ A1 B1 ] , unde

L1=[ 1 0 0−0 ,25 1 0−0,5 0 1 ]

[ A2 B2 ]=[ 1 0 0−0 ,25 1 0−0,5 0 1 ]⋅[4 −1 −5 9

1 −2 −4 32 4 3 1 ]=[4 −1 −5 9

0 −1 ,75 −2 ,75 0 , 750 4,5 5,5 −3,5 ]

Deoarece |a22|<|a32| , se permută liniile 2 cu 3 şi devine:

[ A2¿ B2

¿ ]=[4 −1 −5 90 4,5 5,5 −3,50 −1 ,75 −2, 75 0 ,75 ]

Dar [ A3 B3 ]=L2⋅[ A2¿ B2

¿ ] , unde

L2=[1 0 00 1 0

01 .754,5

1 ]⇒

[ A3 B3 ]=[1 0 00 1 0

01, 754,5

1 ]⋅[4 −1 −5 90 4,5 5,5 −3,50 −1,75 −2 , 75 0 , 75 ]=[4 −1 −5 9

0 4,5 5,5 −3,50 0 −0 ,61 −0 , 61 ]

z=−0 ,61−0 ,61

=1

4,5 y+5,5 z=−3,5⇒ y=−2

4 x− y−5 z=9⇒4 x+2−5=9⇒ x=3 S: (3,-2,1)

Rezolvarea numerică a ecuaţiilor algebrice cu ajutorul programului “Visual C++”

9

Page 10: metode numerice

1. Metoda şirului lui Rolle

#include <stdafx.h>#include <stdio.h>#include <math.h>#include <conio.h>float f(float x){

return log(x)+3*x*x-4*x-1;;}void main (void){

float a,b;printf("Dati limita inferioara a intervalului in care cautam radacina: \

n");scanf("%f",&a);printf("Dati limita superioara a intervalului in care cautam radacina: \

n");scanf("%f",&b);

if(f(a)==0) { printf("%f este o radacina a ecuatiei f(x)=0.\n"); } else if(f(a)*f(b)<0) { printf("In intervalul (%f,%f) se gaseste o radacina a ecuatiei f(x)=0.\n",a,b); } else if(f(a)*f(b)>0) { printf("In intervalul (%f,%f) nu se gaseste o radacina a ecuatiei f(x)=0.\n",a,b); }getche();}

2. Metoda şirului lui Sturm

#include <stdafx.h>#include <stdio.h>#include <math.h>#include <conio.h>//functia de derivare a polinomuluivoid derivare(float v1[100], float v2[100], int gr, int& gr2){

int i;for(i=1;i<=gr;i++) v2[i-1]=v1[i]*i;gr2=gr-1;

}//functia de impartire a doua polinoamevoid imparte(int gr1, float v1[100], int gr2, float v2[100], int& gr5, float v5[100]){

float v11[100];float v3[100];float v4[100];int grc;int i;int a,b;

10

Page 11: metode numerice

int c;

for(i=0; i<=gr1; i++)v11[i]=v1[i];

grc=gr1-gr2;gr5=gr2+1;c=gr1-gr2;a=gr1;

b=gr2;

while(gr5>=gr2) {

v3[c]=v11[a]/v2[b]; for(i=0;i<c; i++) v4[i]=0;

for(i=c; i<=a; i++) v4[i]=-v3[c]*v2[i-c];

for(i=0; i<=gr1; i++) v5[i]=v11[i]+v4[i];gr5=a-1;

if(v5[gr5]==0) gr5--;

for(i=0; i<=gr5; i++) v11[i]=v5[i];a=gr5;

c--;}

};

//functia intoarce valoarea polinomului in punctul xfloat valoare_polinom(float x, float v[100], int grad){

int i;float val;val=0;for(i=0; i<=grad; i++)

val+=v[i]*pow(x,i);return val;

};

//programul principalvoid main(void){

int i;int gr1, gr2, gr3;float v1[100];float v2[100];float v3[100];float x,y, v_x1, v_x2, v_x3, v_y1, v_y2, v_y3;int nr_sch1, nr_sch2, nr_rad;printf("Dati gradul polinomului: \n");scanf("%d",&gr1);for(i=0;i<gr1+1;i++)

{ printf("Dati coeficientul lui x la puterea %d: \n",i); scanf("%f",&v1[i]);}

printf("Dati limita inferioara a intervalului in care cautam radacina: \n");

scanf("%f",&x);printf("Dati limita superioara a intervalului in care cautam radacina: \

n");scanf("%f",&y);nr_sch1=0;

11

Page 12: metode numerice

nr_sch2=0;v_x1=valoare_polinom(x,v1,gr1);v_y1=valoare_polinom(y,v1,gr1);derivare(v1,v2,gr1,gr2);v_x2=valoare_polinom(x,v2,gr2);v_y2=valoare_polinom(y,v2,gr2);if((v_x1==0)&&(v_x2<0))

nr_sch1++;if((v_x1<0)&&(v_x2==0))

nr_sch1++;if ((v_x1*v_x2)<0)

nr_sch1++;if((v_y1==0)&&(v_y2<0))

nr_sch2++;if((v_y1<0)&&(v_y2==0))

nr_sch2++;if ((v_y1*v_y2)<0)

nr_sch2++; gr3=2;

while(gr3>=1){ imparte(gr1, v1, gr2, v2, gr3, v3); for(i=0; i<=gr3; i++)

v3[i]=-v3[i]; v_x3=valoare_polinom(x,v3,gr3); v_y3=valoare_polinom(y,v3,gr3); if((v_x2==0)&&(v_x3<0))

nr_sch1++; if((v_x2<0)&&(v_x3==0))

nr_sch1++;if ((v_x2*v_x3)<0)

nr_sch1++; if((v_y2==0)&&(v_y3<0))

nr_sch2++; if((v_y2<0)&&(v_y3==0))

nr_sch2++; if ((v_y2*v_y3)<0)

nr_sch2++; v_x2=v_x3; v_y2=v_y3; for(i=0; i<=gr2; i++)

v1[i]=v2[i]; for(i=0; i<=gr3; i++)

v2[i]=v3[i]; gr1=gr2; gr2=gr3;}

nr_rad=abs(nr_sch2-nr_sch1);printf("Numarul de radacini reale in intervalul (%f , %f) este %d.\n",

x, y, nr_rad);getche();

}

3. Metoda înjumătăţirii intervalului

12

Page 13: metode numerice

Să se găsească soluţia ecuaţiei “ln x + 3x2 − 4x −1 = 0” cu o eroare ε<10-5

ştiind că se află în intervalul [1, 2].

#include <stdafx.h>#include <iostream>#include <stdio.h>#include <math.h>#include <conio.h>float functie(float x){return log(x)+3*x*x-4*x-1;}

void main(void){float a,b,c,eps,f;int done;

printf("Dati limita inferioara a intervalului in care calculam radacina: \n ");

scanf("%f",&a);printf("Dati limita superioara a intervalului in care calculam radacina: \n ");scanf("%f",&b);printf("Dati precizia: \n ");scanf("%f",&eps);done=0;while(!done)

{c=(a+b)/2;if(fabs(functie(c))<=eps)

{ printf("Radacina cautata este: %f", c); done=1;

} else

if((functie(a)*functie(c))<0) b=c; else

if((functie(c)*functie(b))<0) a=c; }getch();}

4. Metoda coardei sau a părţilor proporţionale

#include <stdafx.h>#include <iostream>#include <stdio.h>

13

Page 14: metode numerice

#include <math.h>#include <conio.h>double f(double x){ return log(x)+3*x*x-4*x-1;}void main(void){double a, b, c, d, eps;printf("Dati limita inferioara a intervalului in care cautam radacina: \n");scanf("%lf",&a);printf("Dati limita superioara a intervalului in care cautam radacina: \n");scanf("%lf",&b);printf("Dati precizia: \n");scanf("%lf",&eps);c=a;

do{

d=c; c=(a*f(b)-b*f(a))/(f(b)-f(a));

if(f(a)*f(c)<0) b=c;else a=c;

}while(fabs(d-c)>eps);

printf("Solutia este:%f\n ", c);getch();}

5. Metoda lui Newton

#include <stdafx.h>#include <iostream>#include <stdio.h>#include <math.h>#include <conio.h>double f(double x){ return log(x)+3*x*x-4*x-1;}double f_deriv(double x){ return 1/x+6*x-4;}void main (void){

double a, p, eps; int i; printf ("Introdu valoarea de plecare: \n"); scanf ("%le", &p); printf ("Introdu precizia valorii: \n"); scanf ("%le", &eps); i=0; do { p-=f(p)/f_deriv(p); i++; } while (fabs(f(p))>eps); printf ("Zeroul functiei este %f si eroarea %f\n", p, fabs(f(p))); getch();}

6. Metoda Lobacevski – Graeffe

#include <stdafx.h>

14

Page 15: metode numerice

#include "stdafx.h"#include <stdio.h>#include <math.h>#include <conio.h>int main(void){

int i, k, grad, etapa=0;double precizie;double coef[20];double rad[20];double eroare;double putere, s, b[20], rad_poz[20], rad_neg[20], a[20];

for(i=0;i<20;i++){

b[i]=0;rad_poz[i]=0;rad_neg[i]=0;a[i]=0;

}//lectura date de intrare si initializariprintf("Dati gradul polinomului: \n");scanf("%d", &grad);printf("Dati coeficientii polinomului in ordinea descrescatoare a

puterilor.\n");for(i=0; i<=grad; i++)

{printf("coef[%d]=", i);scanf("%lf", &coef[i]);

}printf("Dati precizia: \n");scanf("%lf", &precizie);for(i=0; i<=grad; i++)

{rad[i]=0;a[i]=coef[i];

}//algoritmul Lobatcevski - Graeffedo{

//calculam coeficinetii in etapa "etapa"for(i=0;i<=grad; i++){

s=0;for(k=1;k<=i;k++)

// if(i-k>-1)s+=pow(double(-1),double(k))*a[i-k]*a[i+k];

b[i]=pow(a[i],2)+2*s;}etapa++;//calculam radcinile in etapa "etapa"putere =1.0/pow(2.0,etapa);for(i=0; i<=grad-1; i++)

rad[i]= pow(b[i+1]/b[i], putere);//decidem semnul radacinii si eroarea prin introducere in ecuatia

initialafor(i=0; i<=grad-1; i++){

rad_poz[i]=0;rad_neg[i]=0;for(k=0;k<=grad; k++){

if(grad-k>-1)

15

Page 16: metode numerice

{rad_poz[i]+=coef[k]*pow(rad[i], grad-k);rad_neg[i]+=coef[k]*pow(-rad[i], grad-k);

}}if(fabs(rad_neg[i])<fabs(rad_poz[i])){

rad[i]=-rad[i];rad_poz[i]=rad_neg[i];

}}//cautam eroarea maxima din vectorul rad_pozeroare=fabs(rad_poz[0]);for(i=1; i<=grad-1; i++)

if(fabs(rad_poz[i])>eroare)eroare=fabs(rad_poz[i]);

for(i=0; i<=grad; i++)a[i]=b[i];

}while(eroare>precizie);

//afisamfor(i=0; i<=grad-1; i++)

printf("x[%d]= %f \n", i+1, rad[i]);getch();return 0;

}

7. Rezolvarea ecuaţiilor algebrice

Să se determine o rădăcină reală a ecuaţiei x3 - x2- 15x + 19 = 0 în intervalul [-1,1] cu

ajutorul programului „visual C++” cu o eroare mai mică decât ε = 10-4 prin:

metodei înjumătăţirii intervalului.

metoda aproximaţiilor succesive;

metoda tangentelor (Newton);

metoda secantelor.

Să se compare rezultatele luînd în consideraţie numărul de iteraţii.

#include <stdafx.h>#include<iostream>#include<stdlib.h>#include<dos.h>#include<math.h>#include<conio.h>#define eps1 0.01#define eps2 0.01#include<conio.h>#include<STDLIB.H>#include<math.h>using namespace std;float f(float a,float b,float c,float d,float x) { float f; f=a*x*x*x+b*x*x+c*x+d; return f; }float F1(float a,float b,float c,float d,float x) // derivata lui F { float F1; F1=a*x*x+b*x+c; return F1; }void Binary (float A,float B,float eps,float a,float b, float c,float d)

16

Page 17: metode numerice

{ float S,D,fx,x; int k;

S=A;if (f(a,b,c,d,A)<0) S=B; D=A+B-S; k=0;

do { x=S+(D-S)/2; k++; fx=f(a,b,c,d,x); if (fx==0) exit(1);

if (fx>0) S=x; else D=x; } while((fabs(S-D))>eps);cout<<"Metoda Injumatatirii Intervalului"<<endl;cout<<"Solutia = ";cout<<x<<endl;cout<<"Numar de iteratii= ";cout<<k<<endl<<endl;

}

float radical(float x,float a,float b, float c){ float r=(float)1/3;float p=a*x*x+b*x+c;return exp(r*log(p)); }void Aprox_succesive(float x0,float eps,int Nmax,float a,float b,float c,float d) { float x1,y,x,h; double u; int k=0;

u=1/3;y=x0;do { x=y; h=a*x*x+b*x+c; y=pow(h,1/3) ; k++;

} while(fabs(y-x)>eps&&k<Nmax);x1=x;

cout<<"Metoda Aproximatiilor succesive"<<endl;cout<<"Solutia = ";cout<<x1<<endl; cout<<"Nr de iteratii= "<<k<<endl<<endl; }

void Newton(float x0,float eps,int Nmax,float a,float b,float c,float d) { float x1,x,y,d0=1e30,d1; int k,Ier; x=x0; k=0; Et: ; x1=x-f(a,b,c,d,x)/F1(a,b,c,d,x); d1=fabs(x1-x); if (d1<eps) {Ier=0; } else { if (d1<d0) {

if (k>Nmax) {Ier=2; } else k++;

x=x1; d0=d1; goto Et; }

else { Ier=1; } } cout<<"Metoda Newton "<<endl; cout<<"Solutia= "<<x<<endl; cout<<"Ier= "<<Ier<<endl<<endl; }void Tang_Secant(float A,float B,float eps,int Nmax,float a,float b,float c,float d) { float FA,FB,FX,x,xt; int Num=0;

FA=f(a,b,c,d,A);

17

Page 18: metode numerice

FB=F1(a,b,c,d,B); x=A-(B-A)*FA/(FB-FA); //calculul solutiei initiale FX=f(a,b,c,d,x); if (FA*FX<=0) {

xt=A; do { x=x-(x-A)*FX/(FX-FA); // calculul dupa form coardelor FX=f(a,b,c,d,x); xt=xt-f(a,b,c,d,xt)/F1(a,b,c,d,xt); // calc dupa form

tangentelor Num++; } while(fabs(x-xt)>eps&&Num<Nmax); }

else { xt=B; do {

x=x-(B-x)*FX/(FB-FX); // dupa form Coardelor FX=f(a,b,c,d,x); xt=xt-f(a,b,c,d,xt)/F1(a,b,c,d,xt); //dupa form Tangentelor Num++; } while(fabs(x-xt)<eps&&Num<Nmax);

} cout<<"Metoda Coardelor si Secantelor"<<endl; cout<<"Solutia= "<<x<<endl; cout<<" Nr de iteratii= "<<Num<<endl;}void main (void) { float A,B,eps,x,a,b,c,d; int Nmax,temp; cout<<"Introduce-ti coeficientii ecuatiei"<<endl; cout<<"a="; cin>>a; cout<<"b="; cin>>b; cout<<"c="; cin>>c; cout<<"d="; cin>>d; cout<<"introduce-ti intervalul [A,B]"<<endl; cout<<"A= "; cin>>A; cout<<"B= "; cin>>B; cout<<"introduce-ti eroarea "; cout<<"eps= "; cin>>eps; cout<<"Introduce-ti numarul maxim de iteratii "; cout<<"Nmax= "; cin>>Nmax; cout<<endl; Binary(A,B,eps,a,b,c,d); Aprox_succesive(A,eps,Nmax,a,b,c,d); Newton(A,eps,Nmax,a,b,c,d); Tang_Secant(A,B,eps,Nmax,a,b,c,d); getch(); }

8. Metoda lui Gauss pentru rezolvarea sistemelor liniare de ecuaţii

#include <stdafx.h>

18

Page 19: metode numerice

#include<iostream>#include<fstream>#include<math.h>#include<conio.h>using namespace std;double A[100][100];double B[100];double X[100];int n;

int main(){

int i,j,k;double m,temp,max;int lp;int option;ifstream fin;char chFichier[1024];i=1;

cout.precision(3);{

cout<<"numarul de necunoscute =";cin>>n;

for(i=0;i<n;i++) for(j=0;j<n;j++)

{ cout<<"A["<<i+1<<","<<j+1<<"]=";

cin>>A[i][j]; }

for(i=0;i<n;i++) {

cout<<"B["<<i+1<<"]="; cin>>B[i];

} }i=0; j=0;for(i=0;i<n;i++) { max=fabs(A[i][i]); lp=i; for(k=i+1;k<n;k++)

if(max<fabs(A[k][i])) {

max=A[k][i]; lp=k; }

if(max==0) return 0;

if(lp!=i) {

for(j=i;j<n;j++) {

temp=A[i][j]; A[i][j]=A[lp][j];

A[lp][j]=temp; }

temp=B[i]; B[i]=B[lp];

B[lp]=temp; }

k=i+1;

19

Page 20: metode numerice

for(k=i+1;k<n;k++)

{ m=A[k][i]/A[i][i]; for(j=i;j<n;j++)

A[k][j]=A[k][j]-m*A[i][j]; B[k]=B[k]-m*B[i];

} }

X[n-1]=B[n-1]/A[n-1][n-1]; for(i=n-2;i>-1;i--)

{ X[i]=B[i];

for(j=n-1;j>i;j--) X[i]=X[i]-A[i][j]*X[j];

X[i]=X[i]/A[i][j]; }

cout<<"Solutiile sunt: "<<endl; for(i=0;i<n;i++)

cout<<"X["<<i+1<<"]="<<X[i]<<endl; getch();return 0;

}

20