+ All Categories
Home > Documents > Tema 2 MN-anca

Tema 2 MN-anca

Date post: 22-Nov-2014
Category:
Upload: popamarian
View: 130 times
Download: 0 times
Share this document with a friend
17
METODE NUMERICE –TEMA 2 Cojocaru Anca (423C) Se da o dioda descrisa de ec. I=I0(exp(U/UT)-1), cu I0=1 pA, UT=25 mV, E=10 V (sursa) si R=10K ohmi (rezistor in serie cu dioda). Se cere tensiunea prin dioda, U, si curentul prin dioda, I. /* METODA BISECTIEI*/ #include <stdio.h> #include <conio.h> #include <math.h> #define R 10000 // ohmi #define I0 1e-12 // A #define UT 0.025 // V #define E 10 // V double radacina; double f(double x) { return E-R*I0*(exp(x/UT)-1)-x; } int bf(double ls, double ld, double eroare) { double xm; if (f(ls)*f(ld)>0) return 0; if (f(ls)==0) { radacina=ls; return 1; } if (f(ld)==0) { radacina=ld; return 1; } xm=0.5*(ld+ls); while ((fabs(ld-ls)>eroare) && (f(xm)!=0)) { xm=0.5*(ld+ls); if (f(ls)*f(xm)<0) ld=xm; else ls=xm; } radacina=xm; return 1; } int main() { double ld,ls,I; clrscr(); printf("limita la stanga: "); scanf("%lf",&ls); printf("limita la dreapta: "); scanf("%lf",&ld); if (bf(ls,ld,0.01)==0) printf("Tensiunea nu poate fi determinata!"); else { printf("Caderea de tensiune pe dioda este %lf V",radacina); I=(E-radacina)/R; printf("\nCurentul prin dioda este %lf A",I); } getch(); return 0; 1
Transcript
Page 1: Tema 2 MN-anca

METODE NUMERICE –TEMA 2 Cojocaru Anca (423C)

Se da o dioda descrisa de ec. I=I0(exp(U/UT)-1), cu I0=1 pA, UT=25 mV, E=10 V (sursa) si R=10K ohmi (rezistor in serie cu dioda).Se cere tensiunea prin dioda, U, si curentul prin dioda, I.

/* METODA BISECTIEI*/

#include <stdio.h>#include <conio.h>#include <math.h>#define R 10000 // ohmi#define I0 1e-12 // A#define UT 0.025 // V#define E 10 // V

double radacina;

double f(double x) { return E-R*I0*(exp(x/UT)-1)-x; }

int bf(double ls, double ld, double eroare){ double xm; if (f(ls)*f(ld)>0) return 0; if (f(ls)==0) { radacina=ls; return 1; } if (f(ld)==0) { radacina=ld; return 1; } xm=0.5*(ld+ls); while ((fabs(ld-ls)>eroare) && (f(xm)!=0)) { xm=0.5*(ld+ls); if (f(ls)*f(xm)<0) ld=xm; else ls=xm; } radacina=xm; return 1;}

int main(){ double ld,ls,I; clrscr(); printf("limita la stanga: "); scanf("%lf",&ls); printf("limita la dreapta: "); scanf("%lf",&ld); if (bf(ls,ld,0.01)==0) printf("Tensiunea nu poate fi determinata!"); else {

printf("Caderea de tensiune pe dioda este %lf V",radacina); I=(E-radacina)/R;

printf("\nCurentul prin dioda este %lf A",I); } getch(); return 0;}

1

Page 2: Tema 2 MN-anca

METODE NUMERICE –TEMA 2 Cojocaru Anca (423C)

2

Page 3: Tema 2 MN-anca

METODE NUMERICE –TEMA 2 Cojocaru Anca (423C)

/* METODA NEWTON-RAPHSON */

#include <stdio.h>#include <conio.h>#include <math.h>#define R 10000 // ohmi#define I0 1e-12 // A#define UT 0.025 // V#define E 10 // V

double sol;

double f(double x) { return E-R*I0*(exp(x/UT)-1)-x; }

double Derf(double x) { return ((-(R*I0))/UT)*exp(x/UT)-1; }

int NRF(double x0, double niter, double err){ double xn,xn_1; int cont=1; xn=x0; do { xn_1=xn;

if (Derf(xn_1)==0) return 2; xn=xn_1-f(xn_1)/Derf(xn_1);

cont++; }

while ((fabs(xn-xn_1)>err) && (cont<=niter)); if (fabs(xn-xn_1)<err) return 1; sol=xn; return 0;}

int main(){ int NMax; double I,err,x0; clrscr(); printf("Introduceti eroarea maxima dorita: "); scanf("%lf",&err); printf("Introduceti valoarea de start pt aproximatii: "); scanf("%lf",&x0); printf("Introduceti nr maxim de iteratii: "); scanf("%d",&NMax); if (NRF(x0,NMax,err)==1 || NRF(x0,NMax,err)==2) printf("Tensiunea nu poate fi determinata!"); else {

printf("Tensiunea pe dioda este %lf",sol); I=(E-sol)/R;

printf("\nCurentul prin dioda este %lf A",I);

3

Page 4: Tema 2 MN-anca

METODE NUMERICE –TEMA 2 Cojocaru Anca (423C)

} getch(); return 0;}

4

Page 5: Tema 2 MN-anca

METODE NUMERICE –TEMA 2 Cojocaru Anca (423C)

/* Bisectie pt ecuatii transcendente */

#include <stdio.h>#include <conio.h>#include <math.h>

double radacina;

double f(double x) { return x*x-2*x-3; }

int bf(double ls, double ld, double eroare){ double xm; if (f(ls)*f(ld)>0) return 0; if (f(ls)==0) { radacina=ls; return 1; } if (f(ld)==0) { radacina=ld; return 1; } xm=0.5*(ld+ls); while ((fabs(ld-ls)>eroare) && (f(xm)!=0)) { xm=0.5*(ld+ls); if (f(ls)*f(xm)<0) ld=xm; else ls=xm; } radacina=xm; return 1;}

int main(){ int n,i; double ld,ls,er,rad; clrscr();

5

Page 6: Tema 2 MN-anca

METODE NUMERICE –TEMA 2 Cojocaru Anca (423C)

printf("limita la stanga: "); scanf("%lf",&ls); printf("limita la dreapta: "); scanf("%lf",&ld); if (bf(ls,ld,0.01)==0) printf("Fct nu are solutii!"); else printf("Radacina este %lf",radacina); getch(); return 0;}

6

Page 7: Tema 2 MN-anca

METODE NUMERICE –TEMA 2 Cojocaru Anca (423C)

/* Bisectie pt polinoame */

#include <stdio.h>#include <math.h>#include <conio.h>#define NRMAX 10

double VALPOL(int grad, double coef[NRMAX], double point){ int i; double aux; aux=coef[grad]; for (i=grad-1; i>=0; i--) aux=coef[i]+point*aux; return aux;}

int BISECTIEP(int grad, double coef[NRMAX], double ls, double ld, double eroare, double *radacina){ double xm; if (VALPOL(grad,coef,ls)*VALPOL(grad,coef,ld)>0) return 0; if (VALPOL(grad,coef,ls)==0) { *radacina=ls; return 1; } if (VALPOL(grad,coef,ld)==0) { *radacina=ld; return 1; } xm=0.5*(ls+ld); while ( (fabs(ld-ls)>eroare) && (VALPOL(grad,coef,xm)!=0) ) { xm=0.5*(ld+ls); if (VALPOL(grad,coef,ls)*VALPOL(grad,coef,xm)<0) ld=xm; else ls=xm; } *radacina=xm; return 1;}

int main(){ int n,i; double A[NRMAX],pct,er,*sol,ls,ld; clrscr(); printf("Dati gradul polinomului: "); scanf("%d",&n);

7

Page 8: Tema 2 MN-anca

METODE NUMERICE –TEMA 2 Cojocaru Anca (423C)

printf("Dati coeficientii polinomului: "); for (i=n; i>=0; i--) { printf("A[%d]=",i); scanf("%lf",&A[i]); } printf("Dati pct de calcul: "); scanf("%lf",&pct); printf("Dati limita stanga: "); scanf("%lf",&ls); printf("Dati limita dreapta: "); scanf("%lf",&ld); printf("Dati eroarea: "); scanf("%lf",&er); printf("Valoarea pol este %6.5lf\n",VALPOL(n,A,pct)); if (BISECTIEP(n,A,ls,ld,er,sol)==0) printf("Ec nu are solutie!"); else printf("Solutia este %lf",*sol); getche(); return 0;}

8

Page 9: Tema 2 MN-anca

METODE NUMERICE –TEMA 2 Cojocaru Anca (423C)

/* Metoda aproximatiilor succesive */

#include <conio.h>#include <math.h>#include <stdio.h>

double *sol;

double fi(double x) { return exp(-x); }

double Derfi(double x) { return -exp(-x); }

int AproxSuc(double ls, double ld, double x0, double err, double NMax, double *sol){ double xn, xn_1, pct, pas=0.001; int iter, sem=1; pct=ls; do {

xn=Derfi(pct);

9

Page 10: Tema 2 MN-anca

METODE NUMERICE –TEMA 2 Cojocaru Anca (423C)

if (Derfi(pct)>=1) sem=0; else pct+=pas; } while ( (sem==1) && (pct<=ld) ); if (sem==0) return 1; else xn=x0;

iter=1; do { xn_1=xn; xn=fi(xn_1); iter++; } while ((fabs(xn-xn_1)>err) && (iter<=NMax)); if (iter>NMax) return 2; else { *sol=xn; return 0; }}

main(){ int i, NMax; double ls, ld, err, x0; clrscr(); printf("Introduceti eroarea maxima dorita: "); scanf("%lf",&err); printf("Introduceti val de start pt aproximatii x0: "); scanf("%lf",&x0); printf("Limitele intervalului in care se cauta solutia:\n"); printf("Stanga: "); scanf("%lf",&ls); printf("Dreapta: "); scanf("%lf",&ld); printf("Numarul de iteratii: "); scanf("%d",&NMax); printf("\n%d)",AproxSuc(ls,ld,x0,err,NMax,sol)); printf(" Radacina ecuatiei este: %6.5lf",*sol); getch()

10

Page 11: Tema 2 MN-anca

METODE NUMERICE –TEMA 2 Cojocaru Anca (423C)

/* Newton-Raphson pt ecuatii transcendente */

#include <stdio.h>#include <conio.h>#include <math.h>

double sol;

double f(double x) { return (-x)*x+2; }

double Derf(double x) { return (-2)*x; }

int NRF(double x0, double niter, double err){ double xn,xn_1; int cont=1;

11

Page 12: Tema 2 MN-anca

METODE NUMERICE –TEMA 2 Cojocaru Anca (423C)

xn=x0; do { xn_1=xn;

if (Derf(xn_1)==0) return 2;xn=xn_1-f(xn_1)/Derf(xn_1);

cont++; }

while ((fabs(xn-xn_1)>err) && (cont<=niter)); if (fabs(xn-xn_1)<err) return 1; sol=xn; return 0;}

int main(){ int i,NMax; double err,x0; clrscr(); printf("Introduceti eroarea maxima dorita: "); scanf("%lf",&err); printf("Introduceti valoarea de start pt aproximatii: "); scanf("%lf",&x0); printf("Introduceti nr maxim de iteratii: "); scanf("%d",&NMax); printf("%d) ",NRF(x0,NMax,err)); printf("Rad ecuatiei este %lf",sol); getch(); return 0;}

12

Page 13: Tema 2 MN-anca

METODE NUMERICE –TEMA 2 Cojocaru Anca (423C)

13

Page 14: Tema 2 MN-anca

METODE NUMERICE –TEMA 2 Cojocaru Anca (423C)

/* Newton-Raphson pt ec polinomiale */

#include <stdio.h>#include <conio.h>#include <math.h>double sol;

double VALPOL(int grad, double coef[], double point){ int i; double aux; aux=coef[grad]; for (i=grad-1;i>=0;i--) aux=coef[i]+point*aux; return aux;}

double DERPOL(int grad, double coef[], double point){ int i; double aux; static double B[10]; B[grad]=aux=coef[grad]; for (i=grad-1;i>=0;i--) { B[i]=coef[i]+point*B[i+1]; aux=B[i]+point*aux; } return aux;}

int NRP(int grad, double coef[], double x0, double niter, double err){ double xn,xn_1,aux; int cont=1; xn=x0; do { xn_1=xn; if ((aux=DERPOL(grad,coef,xn_1))==0) return 2; xn=xn_1-VALPOL(grad,coef,xn_1)/aux; cont++; } while ((fabs(xn-xn_1)>err) && (cont<=niter)); if (cont>=niter) return 1; sol=xn; return 0;}

void main(){ int i,NMax,grad; double coef[10],err,x0; clrscr(); printf("Introduceti gradul polinomului: "); scanf("%d",&grad); printf("Introduceti coeficientii polinomului: "); for (i=grad;i>=0;i--) { printf("c[%d]=",i); scanf("%lf",&coef[i]); } printf("Introduceti eroarea maxima dorita: "); scanf("%lf",&err);

14

Page 15: Tema 2 MN-anca

METODE NUMERICE –TEMA 2 Cojocaru Anca (423C)

printf("Introduceti valoarea de start: "); scanf("%lf",&x0); printf("Introduceti nr maxim de iteratii: "); scanf("%d",&NMax); switch (NRP(grad,coef,x0,NMax,err)) { case 0: printf("Radacina ec este %lf",sol); break; case 1: printf("Nu se poate afla radacina cu precizia dorita"); break; case 2: printf("Derivata este nula"); break; } getch();}

15


Recommended