Eksponentielle modeller Matematik og Informationsteknologi 06-12-2010 HTX; klasse 2.4 Mathias Sørensen, Martin Schmidt, Andreas Mikkelsen Vejleder: Matematik: Jørn Bendtsen Informationsteknologi: Karl Bjarnason
Indholdsfortegnelse: Matematik Indledende analyse o Analyse af empirisk data 3-4 o Beregning af fremskrivningsfaktor 5-6 Opstilling af matematiske modeller for den eksponentielle fase o Model 1 6-9 o Model 2 9-11 o Model 3 11-14 Regression 14 Konklusion 15 Informationsteknologi Krav til produktet 16 Kodning af cellerne og næring 16-20 Forbedring/Videreudvikling 20 2
1) Indledende analyse Analyse af empirisk data En hypotese lyder, at gærceller i flydende næringsstofopløsning udvikler sig eksponentielt indenfor et interval. En eksponentiel udvikling har formen: b*a x a = fremskrivningsfaktoren. Hvis den er over 1 er kurven tiltagende, og aftagende hvis den er under 1. b = begyndelsesværdien, altså hvor kurven skærer y-aksen De empiriske data lyder: Tid i minutter Antal gærceller 0 20 40 60 80 100 140 160 180 200 220 240 260 280 300 320 15 16 18 19 22 24 31 42 49 67 78 90 105 109 122 125 Til at starte med plotter vi de empiriske data ind i et koordinatsystem i Graph for at danne os et overblik. Antallet af gærceller er på y-aksen og tid i minutter på x-aksen. Som man kan se på kurven, udvikler gærcellerne sig langsomt i starten. Efter 140 minutter begynder gærcellerne at formerer sig langt hurtigere end i starten. Efter ca. 300 minutter flader tilvæksten af gærcellerne ud igen. Hvis vi prøver at analyserer, hvad der sker, kan vi opdele kurven i forskellige perioder: 3
Vi har den første periode, hvor antallet af gærceller ikke stiger nævneværdigt. Mellem ca. 80 minutter og 260 minutter formerer gærcellerne sig som sagt langt hurtigere end før. Det interessante er, at udviklingen godt kunne ligne en eksponentiel udvikling, hvis man sammenligner denne periode med billedet nedenfor af en eksponentiel funktion med formen f(x)= a x Tilsyneladende er forholdene for bakterierne bedst mellem 140miutter og 300minutter. Dette kan skyldes at temperaturen er optimal for at bakterierne kan formerer sig. Til sidst stiger antallet af bakterier ikke mere, og dette kan skyldes, at affaldsstofferne ophober sig og forhindrer bakterierne i at formerer sig yderligere. Vi sætter nu grafen ind i et enkeltlogaritmisk koordinatsystem: Serie 1 Vi kan se at grafen til dels har form som en lineær funktion med nogle enkelte knæk rundt omkring. En eksponentieludvikling er karakteriseret ved netop at have form som en lineær funktion i et enkeltlogaritmisk koordinatsystem. 4
Fremskrivningsfaktor Vi vil nu forsøge at beregne en fremskrivningsfaktor mellem hvert af punkterne, for at se, om der er et sted på kurven, hvor fremskrivningsfaktoren tilnærmelsesvis er ens, og dermed tilnærmelsesvis er en eksponentieludvikling i et interval, som hypotesen sagde. For at beregne fremskrivningsfaktoren a mellem to terminer med et interval på 20sekunder dividerer vi det første punkts y-koordinat med det andet punkts y-koordinat. F.eks. lyder de to første punkter: x = 0, y = 15 og x = 20, y = 16. a = a = Fremskrivningsfaktoren mellem de to første punkter er 1,06667. På samme måde beregner man de andre fremskrivningsfaktorer. I skemaet nedenfor er alle fremskrivningsfaktorene lagt ind: Tid i sekunder (x) Antal gærceller (y) 0 15 20 16 40 18 60 19 80 22 100 24 140 31 160 42 180 49 200 67 220 78 240 90 260 105 280 109 300 122 320 125 a 1,06667 1,125 1,05556 1,15789 1,09091 1,29167 1,35484 1,16667 1,36735 1,16418 1,15385 1,16667 1,0381 1,11927 1,02459 5
Vi skal dog være opmærksomme på punktet x = 100, y = 24 og x = 140, y = 31. Forskellen på de to x- koordinater 40, og da én termin var på 20 sekunder skal vi altså finde den gennemsnitlige fremskrivningsfaktor. Dette gøres ved at tage roden svarende til det antal terminer det spænder over af fremskrivningsfaktoren, altså kvadratroden af 1,2916: a = 1,2916 = Den gennemsnitlige fremskrivningsfaktor mellem 100sekunder og 140 sekunder er altså 1,13652. Dvs. at der er to fremskrivningsfaktorerer mellem 100s og 140s med a = 1,13652 Vi nummerer nu de 16 fremskrivningsfaktorer og kalder deres værdi for a. F.faktor 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 A 1,06 1,125 1,05 1,15 1,09 1,13 1,13 1,35 1,16 1,36 1,16 1,15 1,16 1,04 1,12 1,02 2) Opstilling af matematiske modeller for den eksponentielle fase. 1. model Med udgangspunkt i fremskrivningsfaktorerne vil vi nu forsøge at indkredse et interval, hvor fremskrivningsfaktorene mellem punkterne er tilnærmelsesvis ens. Vi kigger på skemaet over fremskrivningsfaktorene og udvælger et passende interval. Vi vælger fra fremskrivningsfaktor 6 med a = 1,13 til fremskrivningsfaktor 13 med a = 1,16. Det vil sige at intervallet går fra punkt x = 100, y= 24 til punkt x = 260, y= 105. Dette er skitseret til højre: Vi rykker y-aksen hen, så punktet x= 100, y= 0 kommer til at være origo og skærer samtidig det sidste stykke fra, som ikke er en del af den nye kurve. Nu skal vi forsøge at opstille et funktionsudtryk, der tilnærmelsesvis kan beskrive kurven på billedet, som vi kalder g(x). 6
Derudover ændrer vi x-aksen fra at være sekunder til observationer. 1 observation har et interval på 20 sekunder. Dette gør vi, for at gøre det nemmere at overskue og nemmere at regne med. Vi får dermed et nyt skema over for intervallet, der ser således ud, hvor sekunder er ændret til observationer, og start punktet ligger i (0;24) og går til (8;105) Observation 0 1 2 3 4 5 6 7 8 Antal 24? 31 42 49 67 78 90 105 gærceller Vi kan ud fra skemaet opstille en Dm(g) ved at kigge på observationerne. Den går fra 0 til 8 og vi kan derfor skrive: Dm(g) = [0;8] Vi kender ikke værdien af observation 1, da der i data erne ikke er opgivet nogen værdi for dette punkt. Hypotesen sagde, at kurven skulle have form som en eksponentiel udvikling: f(x) = b*a x Vi starter med at beregne a. Dette gør vi ved at finde gennemsnittet af fremskrivningsfaktorene. Grunden til at vi tager gennemsnittet af alle fremskrivningsfaktorerne, er fordi det bedst beskriver udviklingen hen over intervallet. Vi ganger alle leddene med hinanden, bagefter tager vi roden svarer til det antal led vi har ganget sammen. Vi aflæser værdierne i skemaet på forrige side og beregner. Fremskrivningsfaktorene vi skal bruge er t.o.m 6-13: a = 8 (1,13*1,13*1,35*1,16*1,36*1,16*1,15*1,16) a = a er altså 1,19. Da vi har rykket y-aksen hen til startpunktet på intervallet kommer det første punkt til at hedde (0;24). Da b var lig med det punkt, hvor kurven skærer y-aksen, kan vi allerede nu sige, at b er 24. Det kan dog være vi finder en anden værdi af b, hvis vi vælger at indsætte et punkt fra tabellen i funktionsudtrykket, og derefter isolerer b. Vi vælger dog ikke at gøre det, da det så kan være vi ender med 9 forskellige værdier af b. Dermed kommer regneforskriften for g(x) til at hedde: Dm(g) = [0;8] 7
g(x) = 24*1,19 x Vi tegner funktionen ind i Graph, for at se hvor meget vores funktion afviger fra de empiriske data vi fik oplyst. Dette gøres ved at indsætte de empiriske data er som punkter, og så også indsætte grafen for funktionen i et normalt koordinatsystem og en logaritmisk skala: Vi kan se på de to billeder at funktionen tilnærmelsesvis beskriver empirisk data ok, men ikke godt nok endnu. Inden vi opstiller en ny model beregner vi fordoblingskonstanten for funktionen. Til at beregne fordoblingskonstanten F 2 skal vi bruge udtrykket: F 2 = Vi indsætter altså blot fremskrivningsfaktoren 1,19 i udtrykket og beregner ved hjælp af grafregneren: F 2 = F 2 = Fordoblingskonstanten for funktionen er 3,98. Nu vil vi beregne grafens procentuelle afvigelse i hvert punkt. Dette gør vi ved at beregne grafens funktionsværdi i alle de punkter, hvor vi har empirisk data. Derefter indsætter vi punktet vi ønsker at beregne i forskriften. Nedenfor er et skema over funktionsværdierne for grafen. Vi beregner ikke for observation 1, da vi ikke har empirisk data i dette punkt: 8
X 0 2 3 4 5 6 7 8 g(x) 24 34,374 41,139 49,264 58,922 70,517 84,394 101,001 tabel værdi 24 31 42 49 67 78 90 105 Formlen man bruger for at beregne den procentuelle afvigelse er følgende formel. *100 = procentuelle afvigelse. x 0 2 3 4 5 6 7 8 g(x) 24 34,374 41,139 49,264 58,922 70,517 84,394 101,001 % afvigelse 0 10,88 2,05 0,53 12,05 9,5 6,22 3,808 Vi kan se på den procentvise afvigelse at der er en meget spredt afvigelse. Dette har gjort det lidt svært at bedømme hvorfra vi skal indkredse vores nye interval. Vi har efter noget diskussion valgt at fjerne observation 7 og 8, da vi så stadig har de mindste procentafvigelser i intervallet. 2. model Nu skal vi altså finde en forskrift for den graf, der bedst beskriver intervallet fra punkt (100;24) til (220;78). Vi vælger at kalde forskriften for h(x). Intervallet, som h(x) beskriver, er illustreret på billedet nedenfor: Igen rykker vi y-aksen helt hen til startpunktet og laver x-aksen om til observationer, der går fra 0-6. Værdierne for intervallet: Observation 0 1 2 3 4 5 6 Antal 24? 31 42 49 67 78 gærceller Bemærk, at vi igen ikke kender observation 1. 9
Vi starter med at opskrive dm(h). Da den beskriver de empiriske data i intervallet x= 0 til x= 6 kan vi opskrive dm(h) således: Dm(h) = [0;6] Nu beregner vi den gennemsnitlige fremskrivningsfaktor på samme måde som før. Vi bruger fremskrivningsfaktorene 6-11: a = 8 (1,13*1,13*1,35*1,16*1,36*1,16) a = Fremskrivningsfaktoren er altså 1,21. Nu bestemmer vi b. På samme måde som før beregner vi ikke b, men aflæser blot b i startpunktet (0;24), hvilket vil sige at b er 24. Dermed har vi en forskrift der ser sådan ud: h(x) = 24*1,21 x Dm(h) = [0;6] Vi indtegner forskriften i Graph sammen med de empiriske værdier et normalt koordinatsystem og en logaritmisk skala: 10
Igen beskriver funktionen nogenlunde de empiriske data, men stadig ikke godt nok. Der er flere punkter der afviger for meget. Nu beregner vi fordoblingskonstanten F 2 med formlen: F 2 = Vi indsætter fremskrivningsfaktoren, som er 1,21 og beregner: F 2 = = Fordoblingskonstanten er 3,63 Vi opstiller nu et skema, der viser, hvor meget de enkelte punkter afviger. På vi gør på samme måde som før, ved at beregne funktionsværdierne i de punkter, hvor vi har empirisk data, og derefter finder vi afvigelsen i procent ved hjælp af formlen: *100 = procentuelle afvigelse Vi beregner funktionsværdierne i x-koordinaterne 0-6, med undtagelse af x-koordinat 1 og opstiller følgende skema: x 0 2 3 4 5 6 h(x) 24 35,198 42,627 51,623 62,517 75,711 tabelværdi 24 31 42 49 67 78 Nu plotter vi værdierne ind i formlen der beregner den procentuelle afvigelse og opskriver dette skema: x 0 2 3 4 5 6 h(x) 24 35,198 42,627 51,623 62,517 75,711 % afvigelse 0 13,54 1,49 5,35 6,69 2,93 Selvom det er observation 2 der afviger mest, fjerner vi nu de to sidste punkter, for dermed vil fremskrivningsfaktorene mellem hvert punkt minde mere om hinanden, da fremskrivningsfaktorene så kommer til at hedde: (1,13), (1,13), (1,35) og (1,16). Dette vil måske udligne observation 2 s afvigelse lidt, når vi opstiller den 3. model. Hvis vi havde valgt at fjerne de to første punkter, havde fremskrivningsfaktorene afveget mere fra hinanden, end at gøre som vi gør, ved at fjerne de to sidste. 11
3. model: Nedenfor kan ses grafen for i(x). Vi har som sagt fjernet de to første punkter. Som i de andre modeller, rykker vi igen y-aksen helt hen til startpunktet, og laver x-aksen om til observationer. Vi har altså nu kun observationerne 0-4 Observation 0 1 2 3 Antal gærceller 42 49 67 78 Vi kender nu alle observationerne. Vi starter med at finde definitionsmængden dm(i), da den som sagt fra før, beskriver de empiriske data i intervallet x = 0 til 4 = 0, kan vi opskrive dm(i) således: Dm(i) = [0;4] Vi beregner nu den gennemsnitlige fremskrivningsfaktor på samme måde, som i de to andre modeller. Vi bruger nu bare fremskrivningsfaktorene 8-11: a = Fremskrivningsfaktoren er altså 1,25371 Vi bestemmer nu b på samme måde som i de to forrige modeller. Vi aflæser blot på vores graf, eller på det ovenstående skema. Altså er det intuitivt at b = 42. Vi har dermed forskriften for i(x), der ser således ud: i(x) = 42*1,25371 Dm(i) = [0;4] Vi har her nedenfor indtegnet graferne ved hjælp af programmet Graph. Grafen til venstre er i(x) i et almindeligt koordinatsystem, og grafen til venstre er i(x) indtegnet i et koordinatsystem med logaritmisk skala: 12
Nu beregner vi fordoblingskonstanten på samme måde som før F 2 = Fordoblingskonstanten for i(x) med fremskrivningsfaktoren 1,25371 er således: F 2 = = Vi har nedenfor beregnet grafens procentuelle afvigelse i hvert af de 4 punkter. Vi har gjort som i forrige model. Nedenfor har vi lavet et skema der viser hvor meget de enkelte punkter afviger. Vi beregner funktionsværdierne i x-koordinaterne 0-3. Læg mærke til vi denne gang har alle koordinaterne. X 0 1 2 3 I(x) 42 52,655 66 82,763 tabelværdi 42 49 67 78 Vi finder afvigelsen af punkterne på samme måde som før, med formlen: *100 = procentuelle afvigelse 13
Vi har som i model 1 og 2 indsat værdierne ind i formlen der beregner den procentuelle afvigelse, og indsat den i skemaet nedenfor. X 0 1 2 3 i(x) 42 52,655 66 82,763 % afvigelse 0 7,459 1,4925 6,106 Vi kan se på afvigelserne i forhold til forrige skema, at forskellene mellem punkterne har udlignet sig lidt. Hvis vi kigger på billederne kan vi også se, at punkterne godt kunne være placeret eksponentielt, men er funktionen vi har opstillet også god nok? Til at finde ud af det vil vi nu gøre brug af regressionsanalyse. Regression Vi indsætter de empiriske data i Graph og beder den om at tegne en eksponentiel tendenslinje. Nu indtegner vi den funktion vi selv har bestemt og sammenligner de to: Den røde linje er den funktion vi fandt, og den grønne er den, som Graph har tegnet, altså den ideelle linje. Hvis vi kigger på korrelationskoefficienten, som Graph har udregnet, kan vi se, at de fire første decimaler er identiske. Korrelationskoefficienten r=0,9801. Vi må altså gå ud fra at de er lige gode, eller i hvert fald næsten lige gode. Dog er funktionen ikke god nok, da korrelationskoefficienten mindst skal være 0,99 før vi kan begynde at snakke om en eksponentiel udvikling. 14
Konklusion Vi kan altså konkludere, at inde for det interval som vi valgte at arbejde med, så er der ikke tale om en eksponentiel udvikling, da vi hele tiden har udelukket de punkter, som afveg mest fra funktionen vi valgte at opstille. Det kan være at der havde været en eksponentiel udvikling inde for et andet interval end det vi valgte fra starten, men altså ikke inde for det som vi valgte. Korrelationskoefficienten skal som sagt være mindst 0,99 før vi kan overveje om der er tale om en eksponentiel udvikling og da vores var 0,9801 er den altså ikke. Så vi kan altså afkræfte hypotesen. 15
Informationsteknologi Vi har i IT faget skulle bruge det agentbaserede programmeringsmiljø; Netlogo, til at lave en simulation af gærcellernes eksponentielle udvikling ved optagelse af næring og derved formering. Da det er under dette mat/it projekt er første gang vi er blevet introduceret til Netlogo, har vi arbejdet meget med nogle af de skabelon modeller de har i deres toturials. Ud fra disse tutorials har vi i gruppen selv udarbejdet vores egen model der skulle eftervise den eksponentielle model. Vi vil i det følgende stykke gennemgå udviklingen og kodningen bid for bid. Krav til produktet: Da dette skulle være et IT-produkt, er det vigtigt at det har en god bruger flade, der er overskuelig og simpel. Derfor har vi valgt at vi vil have en brugerflade der skulle vise det absolut simpleste. Den skulle vise hvor mange celler der er, hvor meget mad/næring der er, en graf der viser cellernes udvikling, samt en start og en restart knap. Start knappen skal aktivere cellen, således at den starter med at bevæge sig efter næring, og den kan spise og formere sig. Restart knappen skal bare starte alt forfra. Der skal være to tællere der tæller antallet af celler og antallet af mad/næring Kodningen af cellerne og næring: I Netlogo bliver agenter omtalt som turtles og den overflade/baggrund som det bevæger sig på bliver omtalt som en patch. Da turtles kan bevæge sig skal de repræsentere cellerne, og eftersom cellerne bevæger sig rundt i noget flydende næring kan vi definere patchene som næring. Til at starte med laver jeg de to knapper. Jeg har kaldt dem setup og go. Derefter har jeg i koden defineret hvilke funktioner de to knapper skal udføre når de bliver aktiveret. Koden for setup-knappen er følgende: to setup clear-all setup-cells setup-patches do-plots end to definerer at det er hvad der sker når du trykker på den knap der hedder setup clear-all fortæller at alt data der er kørt igennem kodningen skal slettes. Setup-cells henviser til hvordan cellerne skal være i start position (kodningen for setup-cells kommer senere i rapporten) setup-patches henviser ligesom den forrige til hvordan patchene skal være i start positionen. (kodningen for setup-patches kommer senere i rapporten) do-plots fortæller til grafen der er at den skal vise hvad der er af data når der trykkes setup. Da dette er at der er 1 celle og et vist antal mad, viser den det. End, definerer at kommandoen er slut. 16
to setup-cells create-turtles 1 ask turtles [ set color red ] end Her fortæller man den at når den skal udføre kommandoen setup-cells, så skal den lave en turtle (celle) og den skal fortælle at turtles er altid røde. Den røde farve har jeg valgt at de skal være for at de står i kontrast med den grønne mad, så man kan se turtles. to setup-patches ask patches [ set pcolor green ] end Her fortæller man at når kommandoen setup-patches udføres, så skal alle patches sættes til at have farven grøn. Koden for go knappen er følgende: to go move-cells eat-food reproduce check-death do-plots end Hver enkelt ting der er defineres at der skal aktiveres når man trykker på go-knappen, er en kommando man fortæller programmet at det skal udføre. De enkelte kommandoer vil senere blive defineret. to move-cells ask turtles [ right random 360 forward 1 set energy energy - 1 ] end kommandoen move-cells fortæller turtles at de skal vælge en tilfældig retning af 360 grader, og i den retning skal de bevæge sig med en hastighed på 1. For hvert felt den bevæger sig, skal den miste 1 i energi. 17
to eat-food ask turtles [ if pcolor = green [ set pcolor black set energy energy + 5 ] ] end Kommandoen eat-food fortæller turtles at hvis den patch det er på har defineret farven grøn, så skal den sætte patchen til nu at have farven sort, og samtidig skal den forøge dens energi med +5. to reproduce ask turtles [ if energy > 7 [ set energy energy - 3 hatch 1 [ set energy 5 ] ] ] end Kommandoen reproduce fortæller turtles at hvis deres energi er større end 7, så skal den trække 3 fra dens energiniveau, og derefter skal den danne en ny turtle, der har defineret et energiniveau på 5. to check-death ask turtles [ if energy <= 1 [ die ] ] end Kommandoen check-death fortæller turtles at hvis deres energiniveau er mindre eller lig med 1, så skal de dø. to do-plots set-current-plot "celler over tid" set-current-plot-pen "celler" plot count turtles end dette er en kommando der hæfter de antal af turtles sammen med grafens y-akse. Den får besked på at den skal tælle hvor mange turtles der er, og at den skal printe det i den graf/plot der på brugeroverfladen hedder celler over tid Den tæller der tæller hvor mange celler der er, har fået en kommando der hedder. count turtles Den tæller der tæller hvor meget mad der er, tæller jo antallet af grønne patches. Derfor har den 18
kommandoen: count patches with [pcolor = green] Nu har vi skrevet hele programmet til prototypen. Vi kan se at det stemmer overens med vores krav om en meget simpel brugerflade. Der er to knapper og to tællere og en graf, så man kan se udviklingen på to måder. Hvis man kigger efter kan man endda spotte en lille rød celle inde i midten af det grønne kvadrat. For at vise hvordan programmet ser ud når det bliver startet, har vi taget nogle printscreens, løbende igennem en process. 19
Vi har testet vores prototype af vores it-produkt og ud fra grafen kan vi bedømme om simuleringen lever op til kravene om en eksponentiel udvikling. De tre grafer der er vist, er tre tilfældige forsøg. De er alle sammen den samme kodning, men eftersom cellerne går i en tilfældig retning hver gang, er ingen grafer helt ens. Men hvis vi kigger på graferne kan vi se at de alle sammen har en nogenlunde eksponentiel kurve. Så vores prototype er indtil videre en succes. Den eksponentielle udvikling stopper dog brat i til sidst i simuleringen. Da cellerne til sidst ikke kan finde mere næring, og de ikke automatisk går over mod det næring der stadig er tilbage. Så kurven falder meget kraftigt lige pludselig og går straks mod 0. I den sidste periode af simuleringen, bliver grafen heller ikke så lige og bølgende som i de tre øverste, men i stedet kommer der flere meget små svingninger i kurven som man også kan se på den sidste graf inden den gik mod 0. Forbedring/Videreudvikling En af de ting der kunne forbedres i programmet, ville være hvis man kunne få cellerne til at søge efter mad. Hvis den kunne sættes til at tjekke om der var mad på feltet foran den, og hvis der så var, gik den over på det. Men hvis der ikke var, så ville den tjekke felterne til siderne for at se om der var mad der i stedet. På den måde ville programmet nok virke mere realistisk som en bakteriekultur eller en cellekultur. En anden ting der kunne forbedres kunne være hvis man lavede det sådan at man kunne indtaste de værdier cellen skulle have. Således at man fra brugerfladen, kunne vælge hvor meget energi cellen skulle have, hvor meget energi maden gav, og hvor hurtigt cellen kunne bevæge sig. 20