tema 2 mn-anca
Post on 22-Nov-2014
132 Views
Preview:
TRANSCRIPT
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
METODE NUMERICE –TEMA 2 Cojocaru Anca (423C)
2
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
METODE NUMERICE –TEMA 2 Cojocaru Anca (423C)
} getch(); return 0;}
4
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
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
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
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
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
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
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
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
METODE NUMERICE –TEMA 2 Cojocaru Anca (423C)
13
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
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
top related