Computeralgebra met Maxima
10. Controleopdrachten 10.1. Functies en operatoren voor lijsten/vectoren/arrays Een van de eenvoudigste maar belangrijkste “lusachtige” functies is de makelist – opdracht. Voor het gebruik van rijen van elementen (lijsten, vectoren – in de meeste programmeertalen als arrays aangeduid) biedt Maxima een heel scala aan opdrachten.
Belangrijkste functies/operatoren voor lijsten/arrays: makelist(u,k,m,n) makelist(u,k,z) create_list(u,k,z)
Creëert de lijst [u(m), u(m+1), ..., u(n)] in afhankelijkheid van k. Creëert de lijst [u(z1), u(z2), ..., u(zn)], waarbij z zelf een lijst Alternatief voor makelist
length(u)
Selecteert het n-de element van de lijst u. Selecteert het eerste element van een lijst (vector). Op dezelfde wijze kunt u via second(u), third(u), …, tot tenth(u) de andere elementen van u selecteren. Een andere mogelijkheid is nog last(u). Retourneert het aantal elementen van u
delete(w,v)
Wist alle expressies w in de lijst v
append(list1,list2)
Aan lijst1 worden de elementen van lijst2 toegevoegd. Voegt de expressie a toe aan het begin van lijst v ; a wordt daarmee het eerste element van lijst v. Retourneert v zonder de eerste n elementen Geeft een kopie van v , waarbij de elementen in de omgekeerde volgorde staan. Geeft een (oplopend) gesorteerde lijst
u[n] first(u)
cons(a,v) rest(v,n) reverse(v) sort(v) Enkele voorbeelden :
1
Controleopdrachten
10.1.1. Toepassingen • Tabel met functiewaarden
Het komt in de wiskunde regelmatig voor dat we een tabel met functiewaarden nodig hebben. Stel we willen een tabel van f ( x) = x 2 − x − 1 op het interval [-2,3] met stapgrootte 0,5.
Hint:
Omdat de opdracht makelist geen optie step kent, maken we binnen makelist een lijst met de gewenst waarden (natuurlijk weer met makelist) en berekenen hiermee aansluitend de betreffende functiewaarden.
Om een stapgrootte van 1 te kunnen gebruiken,verdubbelen we alle gewenste argumentwaarden .
De gewenste argumentwaarden verkrijgen we nu door alle elementen van w door 2 te delen :
De gewenste lijst met functiewaarden krijgen we nu eenvoudig als volgt :
Uiteraard kunnen we dit resultaat ook in één opdracht bereiken :
Opgave 10.1 a.
Maak een lijst met de eerste 20 elementen van de rij an met an =
b.
Maak door middel van de opdracht makelist de volgende lijst:
c.
Maak een lijst van de eerste 20 partiële sommen van de rij
2
1 , 1!
1 3n
−1 , 3!
1 , 5!
−1 , ....... 7!
Computeralgebra met Maxima
Opgave 10.2 Definieer een functie hoek(r,n) , die de hoekpunten van een regelmatige n-hoek creëert met behulp van de opdracht makelist (straal van de omgeschreven cirkel = r). Teken met behulp van deze hoekpunten een regelmatige 6-hoek, met r = 4. • Combinaties en driehoek van Pascal
Via het gebruik van lijsten willen we de eerste 8 rijen van de driehoek van Pascal gaan construeren
1 1 1 1 1 1 1 1 1
8
4
6
1 3
6 10
15 21
28
2 3
5
7
1
4 10
20 35
56
1 1 5 15
35 70
1 6
21 56
1 7
28
1 8
1
De n-de rij bestaat uit de getallen Ckn : het aantal combinaties van k uit n , met k=0,1, ……., n. De getallen Ckn zijn in Maxima beschikbaar via de functie combination (n,k) uit het pakket functs. We kunnen dan bijvoorbeeld de 5-de rij uit de driehoek van Pascal als volgt maken : makelist ( Ck5 , k, 0, 5) In Maxima ziet een en ander concreet als volgt uit :
We moeten nu nog een lijst maken voor alle rijen vanaf rij met nummer n=0 tot en met rij met nummer n=8:
Hier staat de driehoek van Pascal, waarbij alle rijen achter elkaar staan.
3
Controleopdrachten
We willen natuurlijk elke rij op een nieuwe regel afdrukken. We maken daartoe gebruik van een echte “lus” opdracht : for .. thru .. do (zie paragraaf 9.3) :
10.2. IF-opdracht De if – opdracht biedt de mogelijkheid om berekeningen uit te voeren welke afhankelijk zijn van een of meerdere voorwaarden. Typische toepassingen zijn : gebruik als stopcriterium in recursies, definiëren van samengestelde functies. Het enkelvoudige if-statement ziet er als volgt uit : if cond_1 then expr_1 else expr_0 met de volgende betekenis : als cond_1 waar (true) is , dan wordt expr_1 uitgerekend en in alle andere gevallen wordt expr_0 berekend. Het samengestelde if-statement ziet er als volgt uit : if cond_1 then expr_1 elseif cond_2 then expr_2 elseif …….. else expr_0 met de volgende betekenis : expr_k wordt uitgevoerd als cond_k true is én alle voorafgaande condities false zijn ; als alle condities false zijn dan wordt expr_0 berekend. Voorbeeld 1: Samengestelde functies De functie f is gedefinieerd door : f ( x) =
x2 2 x
x < −2 −2≤ x≤2
2
x 2
x>2
De eenvoudigste manier om f te definiëren in Maxima is via : f(x):= if (x<-2 or x>2) then x^2/2 else abs(x) 4
Computeralgebra met Maxima
Algebravenster:
Plotvenster:
Voorbeeld 2: Recursie met if We beschrijven de faculteit van een natuurlijk getal in Maxima met behulp van de if opdracht . De recursieve definitie luidt als volgt : • •
facult(0)=1 facult(n)=n*facult(n-1)
voor n>0
5
Controleopdrachten
10.3. FOR-opdracht Voor het herhaald uitvoeren (iteraties) van dezelfde berekeningen beschikt Maxima, net als andere programmeertalen (Fortran, Algol, Pascal, Java) over de for-opdracht . Maxima kent de volgende varianten , welke alleen in het stopcriterium verschillen. • • •
for var: initial_value step increment thru limit do body for var: initial_value step increment while condition do body for var: initial_value step increment unless condition do body
Hierbij mogen initial_value, increment, limit, en body willekeurige expressies zijn. Als de stapgrootte (increment) gelijk is aan 1, dan mag "step 1" worden weggelaten.. De uitvoering van het do-satement wordt altijd voorafgegaan door het initialiseren van de variabele var (controle-variabele) met de waarde initial_value.
6
Computeralgebra met Maxima
Vervolgens: (1) Als de controle-variabele de limit van een thru heeft overschreden of als de condition van de unless true is, of als de condition van de while false is, dan eindigt de do . (2) De body wordt uitgevoerd. (3) De increment wordt opgeteld bij de controle-variabele var. De processen (1) tot en met (3 ) worden herhaald totdat voldaan is aan de stopconditie. Voorbeeld
Probleem: We willen nu een functie schrijven loop_teller(n) welke de getallen 1 tot en met n bij elkaar optelt via een loop. De variabelen i en som uit het voorbeeld kunnen dan als lokale variabelen gebruikt worden. Opmerking:
Lokale variabelen welke in een programma voorkomen moeten na de instructie block() in een lijst , tussen vierkante haken , opgesomd worden. loop_teller(n) :=block ( [i:0, som:0], ….) geeft de waarde van n door aan het programma loop_teller. Dit programma gebruikt intern de lokale variabelen i en som
Oplossing :
7
Controleopdrachten
De andere twee varianten hierop zien er als volgt uit :
Opgave 10.3 Schrijf een functie kapitaal_verd (k,p) welke berekent in hoeveel jaar een kapitaal k, bij een samengestelde interest van p procent per jaar , verdubbelt.
8