Sunteți pe pagina 1din 7

Universitatea Romano-Americana Facultatea Informatica-Manageriala

Metode numerice
Proiect Visual Studio C++

Student:Dragusanu Anca Grupa 613, an II

1.Interpolare prin metoda lui Newton


Prezentare: Metoda lui Newton rezulta in modul cel mai natural dintr-un procedeu de linializare, in care se retin din dezvoltarea in serie Taylor a functiei , , continua pe [a,b] si cu derivate continua pe [a,b], in jurul puntului , doar primii doi termini. Astfel ecuatia neliniara initiala a carei solutie este .

Din punct de vedere geometric in metoda lui Newton reprezinta abcisa punctului de intersectie a tangentei dusa la graficul functiei in punctul de coordinate ( cu axa . Rezulta relatia recursive pentru aproximatia solutiei in pasul k+1:

Convergenta metodei lui Newton depinde de alegerea punctului de plecare . Pentru ca algoritmul Newton sa fie convergent catre Solutia este necesar ca punctul de pornire sa verifice conditia , ceea ce conduce la necesitatea determinarii derivatei de ordinal doi a functiei. In plus, la fiecare pas a iteratiei trebuie evaluate derivate de ordinal unu a functiei, ceea ce necesita un efort mare de calcul. Codul sursa: #include <stdio.h> #include <math.h> #include <conio.h> double f(double x) { return x*x*x+6*x*x+11*x+6; } double f_deriv(double x) { return 3*x*x+12*x+11; } 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))); getche(); } Afisare:

2. Sirul lui Sturm

Prezentare: Un sir ordonat si finit de polinoame reale , 1. Polinoamele vecine nu au radacini commune; 2. nu are radacini reale; 3. Daca 4. Daca ,., , se numeste sir Sturm, daca:

este o radaciana a unuia dintre polinoamele intermediare .

, i=

Fie , ,., , un sir Sturm de polinoame. Daca numerele reale a si b, a<b, nu sunt radacini ale polinomului si daca polinomul nu are radacini multiple, atunci schimbarea de semn a numarului a este mai mare sau egala cu schimbarea de semn a numarului b si diferenta lor este egala cu numarul radacinilor reale ale polinomului din intervalul (a,b). Codul sursa:
#include <stdio.h> #include <math.h> #include <conio.h> void 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;} void 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; 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--;} }; float 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; }; void 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; 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(); }

Afisare:

Bibliografie
1. V. Iorga, Programare numerica, Ed. Teora, Bucuresti, 1996 2. Curs Metode numerice in ingineria electrica, www.scribd.com

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