Laboration i Ada

Detta dokument är http://www.mai.liu.se/~boein/edu/ada/

För att komma igång skall man ge följande kommandon i aktuellt terminalfönster:

	TANA39setup
	module add gnat
Följande manualer är tillgängliga:

De nedan nämnda Ada-programmen my1.adb, my2.adb och tpk.adb finns även på kursbiblioteket.

Exempel 1, Avrundningskonstanten

Jag har gjort ett mycket enkelt testexempel på hur man kommer igång med flyttal i Ada, nämligen beräkning av flyttalskonstanten my i både enkel och dubbel precision.

Man sparar undan programmet som my1.adb respektive my2.adb, samt kompilerar enkelprecisionsprogrammet med

	gnatmake my1.adb
och kör med
	./my1
Motsvarande gäller för dubbelprecisionsprogrammet.

Exempel 2, Donald Knuths demoprogram

Jag har även översatt ett mer komplicerat program från den berömde Donald Knuth, med både in- och utmatning samt utnyttjande såväl en elementär funktion, nämligen kvadratroten, som en funktion skriven av användaren. Programmet läser in elva tal från stdin och skriver ut numret på dem i omvänd ordning, tillsammans med värdet av funktionen eller meddelandet att det erhållna funktionsvärdet var för stort.

Programmet användes genom att man direkt efter start av det ger elva flyttal med blank emellan (direkt från tangentbordet).

För samma exempel i andra språk se ett appendix i min Lärobok i Fortran 90/95.

Exemplet i programspråket Ada finns som tpk.adb.

Laboration 6, Differentialekvationer med Ada

System av begynnelsevärdesproblem

I denna laboration skall vi betrakta ett system av andra ordningen av differentialekvationer av första ordningen. Systemet liknar uppgift 10.15 i exempelsamlingen, det ekologiska problemet med harar, bytesdjur, och rävar, rovdjur.

 u'(t) =  u(t)·[A - 0.1·v(t)]  + 0.015·t,     u(0) = alfa

 v'(t) =  v(t)·[0.02·u(t) - 1] + 0.0075·t,    v(0) = beta 

Samtliga storheter är normaliserade, varför den verkliga tidsskalan är okänd, vi kan dock kalla tidsenheten för år. Vi betecknar antalet harar med u(t) och antalet rävar med v(t). Tänk Dig gärna antalen som tusental!

Lösning av detta system av differentialekvationer skall programmeras i Ada, utnyttjande Runge-Kuttas metod och dubbel precision (Long_Float). Förutom beräkning av antalet harar och rävar skall programmet beräkna det fel i respektive antal som beror på att parametern A inte är exakt 1 utan i stället 1 + dellta. Själva beräkningen skall ske med A = 1 och dellta = 0.02. Aktuell formel blir analog till den i svaret till 10.15 b, dvs (kolla den gärna):


     DELTAun+1 = [1 + h·(1 - 0.1·vn)]·DELTAun - 0.1·h·un·DELTAvn + h·un·dellta

     DELTAvn+1 = [1 + h·(0.02·un - 1)]·DELTAvn + 0.02·h·vn·DELTAun

     DELTAu0 = 0		
     DELTAv0 = 0
     dellta = 0.02

Den avser egentligen Eulers metod, men Du får använda den här vid felberäkningen, för att minska programmeringsarbetet.

Anmärkning: Att jag kallat felet ovan för dellta beror på att delta är ett reserverat namn vid fixpunktsaritmetik i Ada.

Din uppgift är att köra programmet med två val av startvärdena alfa (antalet tusental harar vid starttidpunkten) och beta (antalet tusental rävar vid starttidpunkten). Dessa skall båda väljas mellan 20 och 30.

Gör två körningar, och välj ett lämpligt värde på steglängden h. Du skall i båda fallen gå från t = 0 till t = 50.

För varje fall skall Du plotta vardera u ± DELTAu och v ± DELTAv som funktion av t. Dessutom skall Du separat plotta v som funktion av u. Den senare plotten kallas fasplanet.

Plottningen kan ske antingen direkt i Ada (kräver i så fall tillgång till plottrutiner i Ada), eller genom att Ada-programmet genererar en fil som kan utnyttjas av Matlab för plottning. Viss information om plottning i Matlab ges i den korta Matlab-guiden ( sidan ii) och labbinstruktion 5 (sidorna 9 - 11). Man kommer åt till exempel den andra kolumnen av en matris y genom att skriva y(:,2). En möjlighet är att skriva ut t, u, v, DELTAu och DELTAv som fem separata vektorer, som klistras (målas) in i Matlab efter till exempel x = [, avsluta med ]. Alternativt kan man i Ada skapa en fil med namnet filnamn.m som innehåller erforderlig matris eller vektorer och som kan hämtas in i Matlab med kommandot filnamn där. Som vanligt är det lämpligt att undvika filnamn som användes för olika funktioner i Matlab!

Kommandot load filnamn.mat arbetar däremot normalt med binära filer som har filändelsen .mat och passar bäst ihop med filer skapade i Matlab med kommandot save filnamn.mat. Kommandot load filnamn.txt fungerar däremot utmärkt i vårt fall.

 

 

 

 

Fall 1.

Hur varierar antalet harar och rävar i förhållande till varandra?
     alfa =                          beta =

 


 


Fall 2.

Hur varierar antalet harar och rävar i förhållande till varandra?
     alfa =                          beta =

 


 


 

Fall 3.

Vad händer om man byter tecken på de båda termerna 0.015·t och 0.0075·t?

 


 


 

 

 

 

 

Fall 4.

Vad händer om man helt tar bort de båda termerna 0.015·t och 0.0075·t?

 


 


 

Laborationen kan ges något av följande betyg:


Senast modifierad: 6 september 2006
boein@mai.liu.se