Documente Academic
Documente Profesional
Documente Cultură
Introducere In viitor sursa de energie petroliera se va termina si in acel moment marii producatori de autovehicule vor fi nevoiti sa dezvolte vehicule bazate pe surse alternative de energie cum ar fi hidrogen , energie electrica, energie solara. Vehiculele care sunt puse in miscare pe baza de energie electrica, au la baza o baterie ce are o putere mare de ordinul kW-lor, ce stocheaza energia necesara alimentarii motorului electric ce pune in miscare autovehiculul.
O solutie in acest sens se obtine utilizand logica fuzzy. Spre deosebire de logica clasica care utlizeaza valori logice exacte (1 pentru adevarat si 0 pentru fals), logica fuzzy foloseste o plaja continua de valori cuprinse intre 0 si 1, astfel incat 0 indica falsitatea completa iar 1 adevarul complet.
II DESCRIEREA SISREMULUI FUZZY Pentru realizarea acestui sistem avem nevoie ca date de intrare de nivelul de incarcare al bateriei si folosim ca variabile de intrare urmatoarele: 1) tensiune de pe baterie
Aceasta intrare are 5 grade de apartenenta (Vmin1, Vmin, Vnom, Vmax, Vmax1)
2) curentul din baterie Curentul va fi codificat in curent minim (Imin), curent nominal (Inom) si curent maxim (Imax)
Iesirea sistemului este tot curentul ce trebuie injectat in baterie dar in momentul urmator de timp, deci acest sistem este cu bucla de reglaj. Acest curent este reprezentata de functiile singleton B0, B1, B2, B3, B4 ce reprezinta (curent foarte mic, curent mediu, curent nominal, curent mare, curent foarte mare)
Descrierea sistemului: in momentul in care baterie este descarcata vom folosi un control in curent, adica vom injecta un curent mare pentru a incarca bateria cat mai repede, in acelasi moment va creste si tensiunea pe baterie si se va face un control si in functie de tensiune. Cu cat creste puterea din baterie (tensiunea si curentul), in momentul in care vom ajunge la o tensiune fixata, putin mai mare decat tensiunea nominala ce trebuie sa fie in momentul in care vom deconecta bateria de la incarcator, convertor. In momentul in care vom ajunge cu tensiunea la valoare maxima curentul care intra in baterie va incepe sa scada pana cand puterea va fi cat mai aproape de valoarea dorita (3kW)
Imin B4 B4 B2 B2 B2
Inom B3 B2 B2 B1 B1
Imax B1 B1 B0 B0 B0
Prezentare algoritm sistem Fuzzy Algoritmul pentru realizarea sistemului de fuzzificare, implementarea regulilor si defuzzificare va fi prezentat mai jos.
START Intializare: Vin, Iin, iesire, reguli, contori; definire functie_apartenenta1(x); definire functie_apartenenta2(x); program principal: fuzzificare: pentru i=1 la nr.multimi.intrare1
miux1(i)=functie_apartenenta1(i) pentru i=1 la nr.multimi.intrare2 miux2(i)=functie_apartenenta2(i) implem.reguli: pentru i=1 la nr.multimi.intrare1 pentru j=1 la nr.multimi.intrare2 { x=minim(miux1(i),miux2(i)) miuy(i+j)=max(miuy(i+j),x) } defuzzificare: s1=0, s2=0 pentru i=1 la nr multimi iesire { s1=s1+miuy(i)*iesire(i) s2=s2+ miuy(i)} yc=s1/s2 STOP
Simulare sistem Simularea sistemului a fost facuta cu ajutorul mediului de programare C++ si a toolboxu-lui fuzzy din Mathlab Pentru urmatoarele valori crisp ale intrarilor am obtinut urmatoarele rezultate prezentate mai jos.
Anexa #include <stdio.h> #include <conio.h> float Ax[5][4]={{0,100,260,270},{250, 270, 290,300},{270, 290, 320,350},{290, 320, 350,360},{310, 350, 375, 383}}; float Ay[5][4]={{0,1,1,0},{0,1,0,0},{0,1,0,0},{0,1,0,0},{0,1,1,0}}; float Bx[3][3]={{0, 3, 6},{4, 5, 6},{4, 7, 10}}; float By[3][3]={{0,1,0},{0,1,0},{0,1,0}}; float c[5]={1,4.5,6,7.5,10}; int nmx1=5,nmx2=3,npx1=4,npx2=3; //int R[5][3]={{ -1,-0.5,-0.5},{-0.5,-0.5,0},{0.5,0,0.5},{0,0.5,0.5},{0.5,0.5,1}}; int R[5][3]={{4,3,1},{4,2,1},{2,2,0},{2,1,0},{2,1,0}}; int i,k,j,nmy=5; float s1=0,s2=0,yc,miur,x1c=200,x2c=0.1,miux1[5],miux2[3],miuy[5]; float faA(float x,int lin) {float x1,x2,y1,y2; x1=Ax[lin][0]; y1=Ay[lin][0]; if(x<x1) return y1;
for(i=1;i<3;i++) { x2=Ax[lin][i]; y2=Ay[lin][i]; if(x>=x1&&x<=x2) {if(y1<y2) return (x-x1)/(x2-x1)*(y2-y1)+y1; if(y1==y2) return y1; if(y1>y2) return (x2-x)/(x2-x1)*(y1-y2)+y2;} x1=x2; y1=y2; } return y2;}
float faB(float x,int lin) {float x1,x2,y1,y2; x1=Bx[lin][0]; y1=By[lin][0]; if(x<x1) return y1;
if(x>=x1&&x<=x2) {if(y1<y2) return (x-x1)/(x2-x1)*(y2-y1)+y1; if(y1==y2) return y1; if(y1>y2) return (x2-x)/(x2-x1)*(y1-y2)+y2; } x1=x2; y1=y2; } return y2;} float min(float a,float b) {if(a<b) return a; else return b;} float max(float a,float b) {if(a>b) return a; else return b;}
void main (void) { //clrscr(); int count=0; FILE *pfile; pfile = fopen("myfile.txt","w"); float pas1=400.0/200.0, pas2=10.0/20.0; float lim1=383, lim2=10.0;
for(k=0;k<nmx1;k++) miux1[k]=faA(x1c,k); for(k=0;k<nmx2;k++) miux2[k]=faB(x2c,k); for(k=0;k<nmy;k++) miuy[k]=0; for(k=0;k<nmx1;k++) for(j=0;j<nmx2;j++) { miur=min(miux1[k],miux2[j]); miuy[R[k][j]]=max(miuy[R[k][j]],miur);} for(k=0;k<nmy;k++) {s1+=miuy[k]*c[k]; s2+=miuy[k]; } yc=s1/s2; //x2c=lim2-yc; //x1c=yc-x2c/ count++; printf("X1- %6.2f X2- %5.2f Y %6.3f \n",x1c, x2c, yc); fprintf(pfile, "%6.2f %5.2f %6.3f \n",x1c, x2c, yc); // fprintf(pfile, "%d ", count); }while(count < 200); getch(); fclose(pfile); } //numar maxim iteratii iter