11. Eenvoudige programma s schrijven in Maxima We zullen in dit hoofdstuk een aantal eenvoudige Maxima programma s laten zien. 11.1. Aantal wortels van een vierkantsvergelijking Het onderstaande programma bepaalt of de kwadratische vergelijking: a x + b x + c = 0 een dubbele wortel, twee reële wortels of twee complexe wortels heeft. Het type van de wortels is afhankelijk van het teken van de discriminant d=b -4ac, tussen de vierkante haken direct achter het block-statement. Block is hier de body van het programma. Het doel van de vierkante haken is om van d een lokale variabele te maken, d.w.z. de opdracht d : b^-4*a*c heeft geen betekenis buiten type_wortels, waar dezelfde naam voor andere doeleinden gebruikt kan worden. Voorts ziet u hier het gebruik van een geneste if constructie zoals besproken in paragraaf 10. Voorbeelden: Opgave 11.1 Schrijf/programmeer een functie kwad(a,b,c,x) welke bij een gegeven kwadratische functie ax + bx + c een kwadraat afsplitst. Voorbeelden: Omdat x + x + 3 geschreven kan worden als resultaat opleveren ( x + 1) + ; ( x + 1) +, moet kwad (1,,3,x) dus als 1
Eenvoudige programma s schrijven in Maxima Omdat 4x x 1 1 3 resultaat x + geven. 4 + geschreven kan worden als 1 3 x + 4, moet kwad (4,-,1,x) dus het 11.. Bepalen van de vergelijking van een lijn door twee gegeven punten. De helling en het y-intercept van een lijn door twee gegeven punten P 1 ( x 1, y 1 ) en P (x, y ) kunnen worden berekend door de volgende twee vergelijkingen op te lossen : y 1 = m x 1 + b en y = m x + b voor m en b. De vergelijking (helling-intercept vorm) van de lijn door de punten P 1 ( x 1, y 1 ) en P (x, y ) wordt dus gegeven door de volgende Maxima functie: De lijn door de punten P 1 ( 3, 1) en P (1, -1) heeft dus als vergelijking: Controleer nu zelf of deze vergelijking correct is! De functie lijn in (%i13) is helaas niet juist voor verticale lijnen., d.w.z. in het geval dat x 1 = x In geval de lijn door de punten P 1 (x 1,y 1 ) en P (x, y ) verticaal loopt wordt de vergelijking x = x 1. Via een if statement kunnen we de vergelijking als volgt aanpassen:
Bijvoorbeeld de lijn door de punten P 1 (, 1) en P (, 5) loopt verticaal: U kunt dit programma nog wat gebruiksvriendelijker maken via de volgende Maxima-sessie : U slaat deze Maxima-sessie via het menu File Save as op, bijvoorbeeld onder de naam verg_lijn.wxm. Als u vervolgens dit programma wilt draaien (runnen), dan laadt u het programma via het menu File Open. De uitvoer zou er bijvoorbeeld als volgt uit kunnen zien : 3
Eenvoudige programma s schrijven in Maxima Bepalen van de vergelijking van een lijn door twee gegeven punten P1(x1, y1) en P(x, y) (%i1) x1: read ("Geef de x-coördnaat van P1"); (%i) y1: read ("Geef de y-coördinaat van P1 "); (%i3) x: read ("Geef de x-coördnaat van P "); (%i4) y: read ("Geef de y-coördinaat van P "); (%i5) lijn (x,y,x1,y1,x, y): = if x1=x then x=x1 else y=((y1-y)/(x1-x))*x-(x*y1-x1*y)/(x1-x)$ (%i6) print ("de vergelijking van de lijn door P1(",x1,",",y1,") en P(",x,",",y,"): ",lijn(x,y,x1,y1,x,y)); Opgave 11. Gegeven zijn de lijnen l : y = m1 x + b1 en m: y = m x + b. Schrijf een functie snijpunt (x, y, m 1, m, b 1, b ) die bepaalt of de lijnen l en m een snijpunt hebben. Onderscheid hierbij 3 gevallen. In geval van een snijpunt moeten de coördinaten van het snijpunt worden getoond. 4
11.3. Simulatie van een dobbelsteen In deze paragraaf willen een dobbelsteen simuleren en van een groot aantal worpen bepalen hoe groot de ogenaantallen zijn. Daartoe hebben we allereerst een randomgenerator nodig welke de getallen vanaf 1 tot en met 6 toevalsgewijs produceert. Maxima beschikt over de opdracht random(x) die bij een geheel getal x - een random getal vanaf 0 tot en met x-1 maakt. Voor het simuleren van een worp met een dobbelsteen zouden we dus de volgende opdracht kunnen gebruiken om het aantal ogen o aan te geven: o : random(6) + 1 Als we bijvoorbeeld 6 keer met een dobbelsteen gooien, dan kunnen we dat als volgt realiseren Nu willen we ook nog bijhouden hoe vaak elk ogenaantal gegooid wordt, m.a.w. we willen de frequenties van de ogenaantallen weten. Daartoe gebruiken we een geheugenruimte in de vorm van een vector freq met 6 elementen: Hierbij geeft het i-de element, freq[i], dus aan hoe vaak het ogenaantal i geworpen wordt. 5
Eenvoudige programma s schrijven in Maxima We willen nu een functie schrijven die dit alles in één opdracht doet en voor een willekeurig aantal worpen: We kunnen deze functie bijvoorbeeld aanroepen met parameter n = 3000: U ziet dat de frequenties allemaal rond het verwachte aantal van 500 liggen. 6
Opgave 11.3 Schrijf naar analogie van de functie dobbelsteen uit paragraaf 11.3 een functie cdobbelsteen die bij de aanroep cdobbelsteen (3000) het volgende resultaat geeft: Opmerking: De getallen in de laatste kolom zullen natuurlijk per functieaanroep verschillen. 7