Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Tema abordata :
Pentru realizarea proiectului am ales sa construiesc baza teoretica a unui sistem capabil sa controleze glicemia unui bolnav de diabet. Acest sistem va fi capabil sa masoare valoarea glicemiei utilizatorului, dupa care, in functie de valoarea preluata de la senzorul de glucoza, sa dozeze o anumita cantitate de insulina pentru a combate cresterile glicemiei si a preveni eventualele crize hiperglicemice, precum si a mentine valoarea glicemiei la o valoare optima, si anume, intre 65 si 110 mg de glucoza/dL de plasma din sange . Valoarea cantitatii de insulina va fi stabilita de un sistem de control, care va lua decizia optima pentru a indeplini scopul intregului sistem. Sistemul de control va fi construit pe o baza de algoritmi Fuzzy .Acesti algoritmi vor fi construiti intai cu ajutorul unui program construit in Limbajul C , si apoi cu programul Matlab cu mediul de dezvoltare Fuzzy. Pentru verificarea functionarii sistemului voi introduce date specifice diferitelor situatii in care se va afla un bolnav de diabet ce va folosi un astfel de sistem, dupa care rezultatele obtinute in fiecare dintre programul construit in limbajul de programare C si cel din Matlab vor fi comparate si discutate intr-un studiu de caz pentru imbunatatirea rezultatelor si acoperirea a cat mai multor situatii posibile. O mai buna intelegere a acestui proiect necesita o fundamentare generala a fiecarui domeniu utilizat, si anume : teoria Fuzzy, simularea in Matlab, si medicina (in special diabetul zaharat si efectele insulinei ) . Notiunile generale din teoria Fuzzy au fost dobandite la cursul disciplinei : Fundamentele Inteligentei Artificiale sustinut de domnul Profesor dr. Ing., m.c. HORIA-NICOLAI TEODORESCU. Programul in limbajul C utilizat a fost construit pe baza sedintelor de laborator a disciplinei Fundamentele Inteligentei Artificiale sustinut de domnul asistent ing. MARIUS ZBANCIOC .
Date de intrare : Glicemie Rata de crestere a glicemiei Sistem de control Algoritm Fuzzy
Senzor de glucoza
Acest sistem necesita, pentru realizarea practica 3 componente principale : 1. Dispozitiv de masurare a glicemiei 2. Microprocesor sau computer pentru analiza glucozei din sange si de calcul a dozei de insulina 3. Dispozitiv de livrare a insulinei (de obicei o pompa mecanica introdusa 4. sub piele)
Notiuni generale
Pentru aprecierea cantitatii de zahar din organism, in laborator se analizeaza zaharul din sangele total ori din ser sau plasma. Valori normale ale glucozei din sange: 65-110 mg la 100 ml sange. La persoanele de peste 40-50 ani, valorile medii ale glicemiei sunt mai crescute decat la tineri, deoarece la ele si consumul de glucoza in organism este mai redus. Insulina este un hormon ce are rolul de a ajuta la consumul si la arderea glucozei din sange si celule. In unele boli ale pancreasului acesta secreta mai putina insulina sau nu mai secreta deloc si din aceasta cauza glucoza, in loc sa se consume, sa se arda, se acumuleaza in sange, crescand glicemia. Astfel, glicemia poate ajunge la 200-300 mg% si chiar mai mult, ceea ce duce la coma diabetica (coma hiperglicemica) mai ales la acele persoane care nu stiu ca au diabet. Cea mai mare crestere a glicemiei se intalneste in diabetul zaharat sau diabetul pancreatic. In mod normal dupa consumul de glucoza, zaharul din sange creste si la oamenii sanatosi, dar nu mult si revine la normal dupa 2 ore. Dar la persoanele diabetice glicemia creste foarte mult, caci zaharul din sange nu se consuma si revenirea la normal, la valorile initiale se face mai tarziu de 2 ore. La persoanele cu diabet, limitele glucozei sunt: Dimineata, inainte de micul dejun: 30-130 (mg/dl) Inainte de mese: 30-130 (mg/dl) La 2 ore dupa masa: sub 180 mg/dl
b)logica Fuzzy
Teoria multimilor si conceptelor fuzzy au aparut din necesitatea de a exprima cantitativ marimi imprecise. In 1973 Lotfi A. Zadeh a extins teoria probabilitatilor intrun sistem de logica matematica [Zad 73]. Sistemul sau permitea extinderea valorii de adevar a unei propozitii la toate numerele reale cuprinse in intervalul [0 1]. Un numar din acest interval era interpretat drept posibilitatea ca propozitia considerata sa fie adevarata sau falsa. Astfel valoarea de 0.5 exprima posibilitatea ca propozitia poate fi in aceeasi masura falsa sau adevarata, iar valoarea 0.6 exprima posibilitatea ca propozitia sa fie considerata intr-o mai mare masura adevarata, decat falsa. Astfel ca nu se poate
afirma categoric despre un obiect ca e ori Bun ori Rau . Exprimarea Adevarat/Fals care sta la baza aplicatiilor traditionale este inlocuita in cazul unui sistem fuzzy cu exprimari calitative mult mai nuantate (specifice gandirii umane). In acest domeniu, o contributie deosebita a avut si logicianul roman Grigore C. Moisil(1906-1973).
Variabile De intrare
Concluzie Fuzzy
Marime de comanda
In cazul acestui proiect logica Fuzzy imita logica gandirii umane, logica utilizata de fiecare medic specialist pentru a recomanda doze de insulina fiecarui bolnav . Astfel ca logica fuzzy se poate folosi pentru a caracteriza sistemul de control al glicemiei. Primul pas in realizarea algoritmului Fuzzy, se numeste fuzificarea si consta in a atribui unei valori exacte (de exemplu, o concentratie de 75mg/dL a glucozei in plasma sangelui) o valoare specifica limbajului si gandirii umane, numite grade lingvistice (de exemplu : glicemie normala). Fuzificare se poate reprezenta grafic realizand toate atribuirile determinist - lingvistice.
Fuzificarea
In cazul sistemului de control al glicemiei exista 2 date de intrare astfel ca vom creea 2 grafice si vom defini 2 functii de apartenenta. Prima data de intrare este Glicemia .
A doua data de intrare este : rata de schimbare a glicemiei. Aceasta reprezinta scaderea, cresterea, sau stagnarea glicemiei cu 20mg/dL, in functie de activitatile bolnavului de diabet. Astfel, cel mai mare factor care poate influenta scaderea glicemiei, ar fi efortul fizic depus, iar cel mai mare factor ce poate influenta cresterea glicemiei este consumul de alimente ce contin glucoza. In Figura 4 este reprezentata atribuirea gradelor lingvistice acestei date de intrare :
Data de iesire este reprezentata de rata de crestere a unitatilor de insulina care are ca si scop prevenirea eventualelor cresteri ale glicemiei si stabilizarea acesteia la un nivel optim, si anume, intre 65mg/dL si 110 mg/dL. Reprezentarea datei de iesire este redata in figura de mai jos, si anume Figura 5.
Reguli Fuzzy
Daca
<premisa>
atunci
<concluzie> .
1. Daca <Glicemia este F_mica> si <Rata de schimbare e Negativ_mare> Atunci <Infuzia de insulina este Deloc> 2. Daca <Glicemia este F_mica> si <Rata de schimbare e Negativ> Atunci <Infuzia de insulina este Deloc>
29. Daca <Glicemia este Extrema> si <Rata de schimbare e Pozitiv> Atunci <Infuzia de insulina este Extrema> 30. Daca <Glicemia este Extrema> si <Rata de schimbare e Pozitiv_Mare> Atunci <Infuzia de insulina este Extrema>
Sistemul propus in acest proiect are 2 date de intrare si una de iesire. Data de intrare Valoarea Glicemiei reprezentata in Figura 3 are 6 functii de apartenenta si data de intrare Rata de schiumbare a glicemiei reprezentata in Figura 4 are 5 functii de apartenenta triunghiulare, ceea ce conduce la 5*6=30 reguli de conducere. Pentru compactare am ales sa reprezint tabelar aceste reguli, ca in figura de mai jos :
Negativ_Mare
Negativ
Zero
Pozitiv
Pozitiv_Mare
F_mica
Deloc
Deloc
Deloc
Deloc
Deloc
Mica
Deloc
Deloc
Deloc
Deloc
Deloc
Normala
Deloc
Deloc
Deloc
F_putina
Putina
Mare
Putina
Medie
Multa
Multa
F_multa
F_Mare
Multa
F_Multa
F_Multa
Extrema
Extrema
Extrema
Extrema
Extrema
Extrema
Extrema
Extrema
Graficele asociate in variabilelor de intrare si celei de iesire sunt identice cu cele din figurile 4,5 si respectiv 6 .Regulile sistemului Fuzzy in programul Matlab arata ca in figura de mai jos :
Suprafata generata de catre regulile de inferenta din Matlab este reprezentata in Figura 9. In limbajul de programare C variabilele de intrare si iesire sunt definite ca un set de 2 multimi corelate. Una din cele 2 multimi contine punctele definitorii pentru fiecare functie in parte, iar cealalta contine valorile gradelor de apartenenta in fiecare punct definit in prima multime. Programul complet este atasat acestui document in Anexa 1. Pentru exemplificarea celor 3 variabile ( 2 de intrare si una de iesire) , avem Figura 10.
Defuzificarea :
In continuare voi verifica functionalitatea celor doua programe prin testarea la diferite valori de intrare, si apoi prin compararea valorilor de iesire rezultate. Valorile pentru care voi aplica testele sunt :
Rata de schimbare a glicemiei: -20 , 0 , 20 Rata de schimbare a glicemiei: -10 , 2 ,10 Rata de schimbare a glicemiei: -5 , -1 ,5
Figura 11 : Capturi din programele Matlab si Borland C Pentru compactare, voi prezenta valorile de iesire sub forma tabelara :
-20
20
-10
10
-5
-1
Insulina Rezultata
Insulina Rezultata
Insulina Rezultata
35
100
0.7
0.5
0.5
0.5
208,4
0.968 1.19
1.39
1.08
1.2
1.34
1.09
1.16
1.29
588
1.5
1.5
1.5
1.5
1.5
1.5
1.5
1.5
1.5
Figura 12 : Tabel cu diferite valori testate in programul Matlab Testand acelasi set de valori de intrare si in programul construit in limbajul C se observa o diferenta de maxim 0.1 intre valorile de iesire ale celor doua programe.
Concluzie :
Sistemul prezentat mai sus poate sta la baza unui sistem mai complex de control al glicemiei unui bolnav de diabet. Schema de principiu construita si testata mai sus are datele de intrare stabilite astfel incat sa acopere doar evenimentele si situatiile cele mai comune prin care poate trece un utilizator al acestui aparat. Glicemia este factorul cel mai determinant in luarea deciziei sistemului, intrucat se urmareste stabilizarea acesteia la o valoare optima : intre 65 si 110. Rata de schimbare a glicemiei este introdusa in algoritm pentru a caracteriza situatiile in care bolnavul de diabet consuma alimente fapt ce duce la cresterea glicemiei, sau in care bolnavul de diabet face efort fizic-fapt ce duce la scaderea glicemiei. Chiar si in cazul acesta, in care putine situatii sunt luate in considerare, rezultatele obtinute sunt bune, sistemul impiedicand cresterea glicemiei la valori periculoase. Problema principala a sistemului insa, este ca acesta nu trateaza situatia in care bolnavul ajunge la valori mici ale glicemiei (hipoglicemie). De asemenea, pentru ca un sistem sa poata fi pus in practica, trebuie sa acopere mai multe situatii si sa ia in considerare mai multi factori, cum ar fi : Dieta prescrisa de medic Tipul de diabet Ora din zi Tipul insulinei ( insulina prescrisa de medic poate fi cu actiune lenta sau cu actiune rapida ) Efortul fizic zilnic si intervalul de timp in care se produce acesta Etc.
Astfel un sistem performant de control al glicemiei necesita un algoritm fuzzy mai complex, care acopera o gama larga de situatii. Algoritmul fuzzy va avea mai multe date de intrare si iesire, si, exponential o gama mai mare de reguli de conducere.
Studiu de caz
Pentru imbunatatirea sistemului am ales sa maresc numarul de variabile de intrare si de iesire dupa cum urmeaza :
Senzor de glucoza
Prin marirea numarului de date de intrare am imbunatatit sistemul in sensul ca se iau in considerare si situatiile in care utilizatorul face efort fizic, sau consuma alimente. De asemenea se ia in considerare si situatia in care pacientul are hipoglicemie, caz in care pe display-ul aparatului apar diferite recomandari. (De exemplu : Mananca un mar sau Consuma un aliment foarte dulce sau Glicemia e optima etc. ).
Bibliografie
1.http://www.unisa.it/uploads/4978/067.jamal.pdf (02.12.2011) . 2.http://www.seattlerobotics.org/encoder/mar98/fuz/flindex.html (05.12.2012) . 3.http://www.diabetzaharat.ro/wp/index . 4. http://www.sfatulmedicului.ro/Analize-de-laborator/analize-biochimice-analizazaharului-din-sange-glicemia-si-din-urina-gli_1276 (28.11.2011). 5.Cursul disciplinei Fundamentele Inteligentei Artificiale sustinut de domnul Profesor dr. Ing., m.c. HORIA-NICOLAI TEODORESCU, Univ. Gh. Asachi , Fac. ETTI,Iasi . 6. Laboratorul disciplinei Fundamentele Inteligentei Artificiale sustinut de domnul asistent ing. MARIUS ZBANCIOC , Univ. Gh. Asachi , Fac. ETTI,Iasi.
Anexa 1
#include<stdio.h> #include<conio.h> #define min(a,b)(a<b)?a:b #define max(a,b)(a>b)?a:b #define nfx1 6 //numar functii de apartenenta pentru variabilele de intrare #define nfx2 5 //numar functii de apartenenta pentru variabilele de intrare #define nfy 7 //numar functii de apartenenta pentru variabila de iesire #define N 1001 //numar puncte folosit la discretizare univers discurs // pentru calcul reuniune si intersectie
float x2[5][3] = {{-20,-15,-10},{-20,-10,0},{-2,0,2},{0,10,20},{10,15,20}}; float miu2[5][3] = {{1,0.5, 0},{ 0, 1, 0},{ 0, 1, 0},{0,1,0},{0,0.5,1}}; int npx2 = 3; //nfx2 = 5
float grad_apart(float xc, float x[], float miu[], int npx) { float x1, x2, y1, y2;
if(xc<=x2 && xc >=x1) { if(y1==y2) return y1; else if (y1<y2) return (xc-x1)/(x2-x1)* (y2-y1) + y1; else return (x2-xc)/(x2-x1)*(y1-y2) + y2; } } return miu[npx-1]; }
void reuniune(float xA[], float miuA[], int npA, float xB[], float miuB[], int npB, float xR[], float miuR[]) { float step, xc, miu; //inf, sup,
// //
{ xc = inf+i*step; xR[i]=xc; miu = max(grad_apart(xc,xA,miuA,npA), grad_apart(xc,xB,miuB,npB)); miuR[i] = max(miuR[i], miu); // printf("R[%2d]=%6.2f \t miuR[%d]=%.2f\n", i, xR[i], i, miuR[i]);
} // vectorii R[] si miuR[] pot fi declarati ca variabile globale // in acest caz nemaifiind necesar sa fie inclusi in lista de argumente }
void trunchiere(float x[], float miux[], int npx, float prag, float y[], float miuy[]) { float step, xc; //inf, sup,
// //
for(int i=0; i<N; i++) { xc = inf+i*step; y[i]=xc; miuy[i] = min(prag, grad_apart(xc,x,miux,npx)); // printf("y[%2d]=%6.2f \t miuy[%d]=%.2f\n", i, y[i], i, miuy[i]);
} }
clrscr();
x1c = 210; x2c = 10; // se calculeaza gradele de apartenenta ale primei premise/intrari // in toate functiile fuzzy asociate intarii for (i=0;i<nfx1; i++) miup1[i] = grad_apart(x1c,x1[i],miu1[i],npx1);
// se initializeaza cu zero gradele de apartenenta ale concluziei/iesirii for (i=0;i<nfy; i++) miuc[i]=0;
// se calculeaza minimul premiselor folosit la // trunchierea iesirii regulii curente R(i,j) for (i=0;i<nfx1; i++) for (j=0;j<nfx2; j++) { miu = min(miup1[i],miup2[j]); idr = R[i][j]; //indice regula curenta R(i,j) miuc[idr] = max( miuc[idr], miu);
float miut[N]; for (idr=0; idr<nfy; idr++) { trunchiere(y[idr],miuy[idr],npy, miuc[idr], xR, miut); for (i=1; i<N; i++) miuR[i] = max(miuR[i], miut[i]); }
//defuzificare
sum2 += miuR[i]; }
miu = sum1/sum2; //valoarea defuzificata a iesirii printf("x1=%.2f, x2=%.2f -> val.iesirii=%.2f",x1c, x2c, miu);
// //
getch(); }