1 Computeralgebra met Maple

Download Report

Transcript 1 Computeralgebra met Maple

1
Computeralgebra met Maple
Met Maple kan je computeralgebra doen: het is een systeem om symbolische berekeningen te maken. Dit
in tegenstelling tot MATLAB dat vooral bedoeld is voor numerieke berekeningen. Maple kan informatie
in symbolische vorm op een algebra¨ısche manier verwerken en werkt dus met symbolen en uitdrukkingen.
Op deze manier kan Maple een exacte analytische oplossing geven van enkele wiskundige problemen zoals
de berekening van integralen, het oplossen van vergelijkingen, differentiaalvergelijkingen en problemen
uit de lineaire algebra. Bovendien heeft Maple handige grafische mogelijkheden die toelaten om de
wiskundige informatie te visualiseren. Maple kan ook numerieke berekeningen maken en, in tegenstelling
tot MATLAB, kan dit in een willekeurig opgegeven precisie.
Maple is vooral bedoeld om interactief mee te werken. Je geeft in het werkblad korte instructies en
Maple geeft onmiddellijk antwoord. Maple kan echter ook worden gebruikt om programma’s te maken en
heeft daarvoor een overzichtelijke programmeertaal. Op deze manier kan men Maple gebruiken als een
wiskundelaboratorium. Gebruikers kunnen snel antwoord krijgen op mogelijke vragen zonder daarvoor
veel (vaak saai) rekenwerk te moeten doen of rekenwerk dat niet binnen de mogelijkheden ligt van pen
en papier. Men moet echter steeds voor ogen blijven houden dat een antwoord in Maple niet abslouut
bindend is en met de nodige kritische overwegingen dient onderzocht te worden. Een goede wiskundige
redenering blijft absoluut noodzakelijk om jezelf te overtuigen van de juistheid van een uitspraak.
Om een Maple sessie te beginnen ga je met de muis naar Start en vervolgens naar Programs en
Scientific, waar je Maple uitkiest. Tenslotte kies je dan Maple release 5 uit de lijst. Studenten die
in Maple ge¨ınteresseerd zijn kunnen een studentenversie kopen bij een wetenschappelijke boekhandel, zie
• K.M. Heal, M.L. Hansen, K.M. Richard, Maple V Learning Guide, Springer-Verlag, New York,
1996,
dat zowel de nodige diskettes bevat als een beknopte handleiding.
De grafische interface van Maple in een Windows 95 omgeving ondersteunt de gewone bewerkingen
met de muis (zoals knippen en plakken), opladen en bewaren van bestanden en het werken met menu’s.
Het werkblad is het venster waarin je interactief problemen kan opgeven en antwoorden krijgt. Elke lijn
begint met een prompt > waarachter je de commando’s opgeeft. Als voorbeeld kan men
taylor(exp(x),x=0);
opgeven. Merk op dat elk commando eindigt met ; (als je het antwoord op het scherm wil krijgen) of
met : (als je het antwoord niet op het scherm wil krijgen). Druk dan op enter of klik met de muis op
! en het antwoord zal worden berekend. In bovenstaand voorbeeld krijg je
1
1
1
1 5
1 + x + x2 + x3 + x4 +
x + O(x6 )
2
6
24
120
wat de eerste zes termen zijn van de Taylorreeks voor de exponenti¨ele functie x 7→ ex . In plaats van een
wiskundige formule kan Maple ook een figuur als antwoord geven. Met het commando
plot(sin);
1
krijg je de figuur
0.5
–10
–8
–6
–4
–2
2
–0.5
–1
1
4
6
8
10
Merk op dat Maple zelf de grootte van de twee assen bepaalt.
Als voorbeeld hoe je Maple commando’s intypt en uitvoert, hoe je commando’s kan wijzigen en hoe
je met grafieken kan werken, zullen we de primitieve functie van
Z
x2 sin x dx
berekenen in Maple en het resultaat verder onderzoeken. In het werkblad van Maple typ je, na de prompt
>
primitief:=Int(x^2*sin(x),x);
Vergeet hierbij ; niet. Als je dan op de enter toets drukt, geeft Maple het resultaat, in dit geval
Z
primitief := x2 sin(x) dx
en er staat een grote vierkante haak [ links van de prompt die zowel de ingetypte tekst als het resultaat
bevat.
R 2 Met dit resultaat ben je natuurlijk niets, maar Maple heeft ondertussen de symbolische uitdrukking
x sin(x) dx toegekend aan de veranderlijke primitief. Om de waarde te kennen van de integraal typ je
antwoord:=value(primitief);
en je krijgt dan
antwoord := −x2 cos(x) + 2 cos(x) + 2x sin(x)
waaruit blijkt dat Maple de integraal symbolisch heeft uitgewerkt en het resultaat heeft toegekend aan
de veranderlijke antwoord. Merk op dat er geen integratieconstante wordt gegeven! Het antwoord is in
termen van een veranderlijke x. Om te weten wat het antwoord is als x = π/3 gebruiken we
subs(x=Pi/3,antwoord);
en we krijgen
µ ¶
µ ¶
µ ¶
1 2
1
1
2
1
− π cos
π + 2 cos
π + π sin
π
9
3
3
3
3
waaruit blijkt dat subs een eenvoudige substitutie uitvoert in de veranderlijke antwoord en daar overal
x vervangt door π/3. Het resultaat kan nog worden vereenvoudigd en we typen daarom
simplify(%);
Het teken % betekent steeds het laatst verkregen resultaat. Als antwoord krijgen we
1
1 √
− π2 + 1 + π 3
18
3
Wil je een tekening van de primitieve functie, dan geef je
plot(antwoord,x=-Pi..Pi);
en je krijgt
7
6
5
4
3
2
–3
–2
–1
0
1
x
2
3
Merk op dat de schaalverdeling op de y-as niet bij 0 begint. Om een betere tekening te krijgen, typ je
plot(antwoord,x=-Pi..Pi,y=0..8);
In de volgende paragrafen zullen we de Maple commando’s in meer detail bestuderen.
2
2
Basiscommando’s
We beginnen dit onderdeel met numerieke berekeningen in Maple en daarna zullen we het hebben over
symbolische berekeningen. Over al de commando’s die we beschrijven (en ook verschillende die we niet
beschrijven) krijg je meer informatie via Help waarin je Topic Search of Full Text Search kan
gebruiken om op sleutelwoorden te gaan zoeken. In het werkblad kan je ook aan de prompt ?trefwoord
typen om meer informatie te krijgen over het trefwoord.
2.1
Numerieke berekeningen
De meest eenvoudige berekeningen in Maple zijn numeriek. Maple kan, zoals een gewone zakrekenmachine,
rekenen met gehele getallen en floating-point getallen. Je voert de uitdrukking die je wenst te berekenen
in met de gewone syntax (waarbij * wordt gebruikt voor vermenigvuldiging). Elke uitdrukking dient te
worden be¨eindigd met ; als je het resulataat op het scherm wil zien verschijnen. Zo zal
2+(5+1/2)*(2+1/6)/(3-8/5);
als antwoord geven
883
84
Merk op dat Maple exacte berekeningen uitvoert met rationale getallen en dus niet 10.51190476 als
(benaderend) antwoord gaf. Voor Maple zijn dit twee totaal verschillende objecten. Maple werkt niet
alleen met rationale getallen, maar ook met andere objecten zoals gehele getallen, floating-point getallen,
veranderlijken, verzamelingen, lijsten, rijen, veeltermen over een ring, en nog een heleboel andere zaken.
Maple kan met willekeurig lange gehele getallen werken. Praktisch betekent dit op een standaard
Pentium PC dat met getallen van 500 000 cijfers kan worden gerekend. Neem bijvoorbeeld
100!;
dan vindt Maple
9332621544394415268169923885626670049071596826438\
1621468592963895217599993229915608941463976156518\
2862536979208272237582511852109168640000000000000\
00000000000
en geven we vervolgens
length(%);
dan krijgen we
158
Dit betekent dat 100! een getal is met 158 decimale cijfers. Het karakter % is een afkorting voor het laatst
verkregen resultaat. Wensen we te verwijzen naar het voorlaatst verkregen resultaat, dan gebruiken we
%%, en voor het resultaat daarvoor %%%. Men kan gehele getallen ontbinden in factoren
ifactor(134764);
en dit geeft
(2)2 (7)(4813)
Let wel op, het ontbinden van (grote) gehele getallen in factoren kan lang duren omdat dit een rekenkundig
probleem is met hoge complexiteit. Hier volgt een lijst van commando’s om met gehele getallen te werken
abs(n)
factorial(n)
length(n)
ifactor(n)
iquo(m,n)
irem(m,n)
igcd(m,n)
isprime(n)
max, min
mod
absolute waarde van n
faculteit van n (ook n!)
aantal decimale cijfers in n
ontbinden van n in priemfactoren
de gehele deling van m door n (bm/nc)
de rest wanneer m wordt gedeeld door n
de grootste gemene deler van m en n
gaat na of n een priemgetal is
maximum en minimum
modulorekenen
3
Indien we met rationale getallen werken, dan zal Maple exacte resulaten geven in rationale getallen
(zonder deze om te zetten naar floating-point getallen). Zo zal Maple de invoer
1/2 + 1/3 + 1/4;
uitrekenen als
13
12
Indien gewenst kan je hiervan een floating-point berekening krijgen door
evalf(%);
en dit geeft het resultaat
1.083333333
tot op 10 decimalen. Wens je meer decimalen, dan geef je dit op als een tweede parameter
evalf(Pi,150);
en dit geeft π met 150 decimale cijfers
3.14159265358979323846264338327950288419716939937510582097494459230781\
640628620899862803482534211706798214808651328230664709384460955058223\
172535940813
Standaard zal Maple 10 decimale getallen gebruiken. Wens je meer (of minder) decimale getallen, dan
geef je dit op met
Digits:=20;
waarmee je dan steeds 20 decimale getallen krijgt. Dit betekent niet dat alle 20 decimale getallen steeds
correct zijn! Een gedetailleerde analyse van floating-point berekeningen (zie de cursus numerieke wiskunde
in de tweede kandidatuur) leert dat je erg moet opletten bij het aftrekken van twee floating-point getallen
die dicht bij elkaar liggen
10/3-3.3333333330;
geeft als antwoord 0, terwijl het antwoord met 10 decimalen eigenlijk 0.3333333333 ∗ 10−9 is.
Als een getal in decimale waarde wordt ingegeven, dan beschouwt Maple dit als een floating-point
getal en zal heel de bewerking in floating-point gebeuren. Er is dus een belangrijk verschil tussen
15/2*3;
(dit geeft 45/2) en
7.5*3;
(dit geeft 22.5).
2.2
Symbolische berekeningen
Maple kan (sommige) irrationale getallen als exacte grootheden beschouwen, zoals π en
gekend zijn als Pi en sqrt(2). Merk het verschil tussen
√
2 die in Maple
sqrt(2)^2;
dat als antwoord 2 geeft, en
sqrt(2.)^2;
dat als antwoord 1.999999999 geeft (en dus niet exact is). Men kan ook rekenen met complexe getallen,
waarbij Maple het symbool I gebruikt voor de imaginaire eenheid i:
(1+3*I)+(2-I)*(5+2*I);
4
13 + 2I
Er kan ook worden gerekend modulo een gegeven natuurlijk getal
48 mod 5;
3
Maple kent de meest voorkomende functies en kan er exact mee rekenen
sin(Pi/3);
1√
3
2
log(1);
0
We geven hierbij een tabel met de meest gebruikte functies
sin cos tan
sinh cosh tanh
arcsin arccos arctan
exp
log of ln
log[10] log[2]
sqrt
round
trunc
frac
binomial
goniometrische functies
hyperbolische functies
goniometrische functies
exponenti¨ele functie
natuurlijke logaritme
logaritme met grondtal 10 en 2
vierkantswortel
afronden naar het dichtst bijgelegen natuurlijk getal
afbreken (trunc(x) = bxc)
fractionele deel (frac(x) = x − bxc) ¡ ¢
binomiaalgetallen (binomial(n,k) = nk )
Je kan in Maple veranderlijken, getallen, symbolische uitdrukkingen en functies toekennen met de
karaktercombinatie := als toekenningsoperator. Zo zal
vergelijking:=x^2-3*x+1=0;
de vergelijking x2 − 3x + 1 = 0 toekennen aan de naam vergelijking. Om een functie te defini¨eren
gebruik je
f:=x->6*x+2;
waarmee de functie x 7→ 6x + 2 wordt toegekend aan de letter f . Met f(2) krijg je dan het getal 14 en
met f(z) krijg je de uitdrukking 6z + 2. Maple maakt dus een onderscheid tussen de functie f en de
functiewaarde f (x). Om van een uitdrukking 5x3 − 2x + 4 een functie g : x 7→ 5x3 − 2x + 4 te maken,
moet je ervan uitgaan dat de uitdrukking verkregen werd door g toe te passen op x. De functie g krijg
je dan door dit toepassen ongedaan te maken
g:=unapply(5*x^3-2*x+4,x);
en je krijgt dan de functie
g := x → 5x3 − 2x + 4.
De namen die worden gebruikt bij een toekenning mogen alle letters, cijfers en de underscore _ bevatten
maar mogen niet beginnen met een cijfer. Namen die Maple reeds gebruikt mag je ook niet gebruiken;
gebruik dus niet de letter D want deze letter is reeds gereserveerd voor de differentiaaloperator.
Maple kan werken met wiskundige veranderlijken. Veel gebruikte commando’s zijn expand om een
uitdrukking uit te werken (ontwikkelen) en de omgekeerde bewerking factor om een uitdrukking te
ontbinden in factoren.
5
(x+y)^3;
(x + y)3
expand(%);
x3 + 3x2 y + 3xy 2 + y 3
factor(%);
(x + y)3
Functies kunnen worden afgeleid
Diff(tan(x),x);
∂
tan(x)
∂x
en om het differenti¨eren ook expliciet uit te voeren doe je
value(%);
1 + tan(x)2
Merk op dat dit laatste antwoord geen functie is maar een uitdrukking. Wil je daar een functie van
maken dan doe je
dtan:=unapply(%,x);
Om dadelijk een functie te krijgen had je ook als volgt kunnen werken:
D(tan);
en dit geeft dan als antwoord 1 + tan2 . Wens je dit uit te rekenen in t dan geef je D(tan)(t).
Maple kan werken met veeltermen. Om twee veeltermen te delen doe je
quo(x^3+x+1,x^2+x+1,x);rem(x^3+x+1,x^2+x+1,x);
x−1
2+x
wat betekent dat
x3 + x + 1
2+x
=x−1+ 2
.
x2 + x + 1
x +x+1
Dit kan je nagaan door
simplify(x-1+(2+x)/(x^2+x+1));
x3 + x + 1
.
x2 + x + 1
Het commando simplify wordt vaak gebruikt om een uitdrukking te vereenvoudigen. Er is echter geen
algemene regel die zegt wat de meest eenvoudige vorm is van een uitdrukking, bijgevolg geeft Maple niet
altijd het antwoord dat jij het eenvoudigst vindt. Vaak doe je er beter aan te zeggen wat je precies
bedoelt met vereenvoudigen. Als je iets wil ontbinden in factoren dan gebruik je beter factor en als je
iets helemaal wil ontwikkelen dan gebruik je beter expand.
Maple kan ook werken met goniometrische uitdrukkingen
uitdruk:=cos(x)^4+sin(x)^4+3*cos(2*x):
simplify(uitdruk);
6
2 cos(x)4 − 2 + 4 cos(x)2 .
expand(cos(x+y));
cos(x) cos(y) − sin(x) sin(y).
Maple kan ook snel reeksontwikkelingen vinden
series((x^3+x^2+x+1)/(x^2+x+1),x=1);
4 2
2
1
1
+ (x − 1) + (x − 1)2 − (x − 1)3 + (x − 1)4 + O((x − 1)6 )
3 3
9
9
27
Standaard worden enkel de eerste zes termen uit de reeksontwikkeling gegeven, maar als je meer termen
wil dan geef je dit mee als extra parameter
series(exp(x),x,10);
1
1
1
1 5
1 6
1 7
1
1
1 + x2 + x2 + x3 + x4 +
x +
+
x +
x8 +
x9 + O(x10 ).
2
6
24
120
720
5040
40320
362880
Het commando taylor werkt zoals series en berekent de Taylorreeks.
2.3
Maple objecten
We weten nu reeds dat Maple werkt met getallen (gehele getallen, rationale getallen, floating-pointgetallen)
maar ook met uitdrukkingen, vergelijkingen en functies. Dit zijn slechts enkele van de vele soorten objecten waarmee Maple werkt. Maple kent ook nog meer complexe objecten, zoals rijen, lijsten, verzamelingen, arrays (schema’s) en tabellen.
Een rij is een groepje Maple uitdrukkingen gescheiden door komma’s:
rij:=x,y,z,v,w;
rij := x, y, z, v, w
Deze gegevensstructuur bewaart de volgorde van de gegevens en herhalingen zijn toegelaten. Je kan van
een karakter een rij maken door het karakter te laten volgen met elk gegeven van een gegeven rij door
het karakter te laten volgen door een punt en de gegeven rij
a.rij;
ax, ay, az, av, aw
Om snel een rij te maken van getallen die gegeven worden door een voorschrift, kan je het commando
seq gebruiken. Zo geeft seq(2*n+1,n=0..99); een rij met de eerste 100 oneven natuurlijke getallen.
Een lijst is een rij ingesloten door vierkante haakjes [ ]
lijst:=[3,x^2+1,5,y,7];
reeks1:=[Frank,Hilde,Peter,Wim,Bieke,Ilse];
lijst := [3, x2 + 1, 5, y, 7]
reeks1 := [Frank , Hilde, Peter , Wim, Bieke, Ilse]
Bij een lijst blijft de volgorde behouden en zijn herhalingen toegelaten. Bij een rij en een lijst kan elk
gegeven worden opgeroepen met behulp van een index tussen vierkante haakjes:
reeks1[3];
7
Peter
Met op(lijst) wordt de lijst omgezet in een rij en met nops(lijst) kom je te weten hoeveel gegevens
de lijst bevat.
Een verzameling krijg je door een rij te omgeven met gekrulde haakjes { }. Bij deze gegevensstructuur
heeft de volgorde van de gegevens geen belang en zijn herhalingen niet toegestaan, zoals ook het geval is
bij verzamelingen
verz:={a,b,c,a,b,e,h,f,d,g};
verz := {a, f, g, c, e, d, h, b}
Je kan van verzamelingen de unie, doorsnede en het verschil nemen
{a,b,c} union {c,d,e};
{2,4,6,8,10,12} intersect {3,6,9,12};
{1,3,5,7,9,11} minus {3,6,9,12};
{a, c, e, d, b}
{6, 12}
{1, 5, 7, 11}
Met op en nops krijg je respectievelijk een rij met de elementen van de verzameling en het aantal elementen
in de verzameling. Je kan een functie laten werken op elk element van een verzameling met het commando
map
f:=x->x^2-1:
map(f,{0,1,2,3,4,5});
{0, −1, 3, 8, 15, 24}
Merk op dat bij verzamelingen de volgorde onbelangrijk is en dat het antwoord een verzameling is met
de functiewaarden.
Een array (of schema) is een gegevensstructuur die een uitbreiding is van de lijst. Elk gegeven heeft
opnieuw een index maar deze hoeft niet meer te bestaan uit ´e´en natuurlijk getal (´e´en dimensie) maar
kan meerdimensionaal zijn. Een tweedimensionale array komt dus overeen met een matrix, maar een
hogere dimensie is ook mogelijk. Om een array te maken moet je deze eerst declareren en daarna vul je
de gegevens in.
machten:=array(1..3,1..3);
machten[1,1]:=1; machten[1,2]:=2; machten[1,3]:=3;
machten[2,1]:=1; machten[2,2]:=4; machten[2,3]:=9;
machten[3,1]:=1; machten[3,2]:=8; machten[3,3]:=27;
Wil je alle gegevens zien, dan gebruik je print of evalm;
print(machten);

1 2
1 4
1 8

3
9
27
Je kan ook individuele gegevens oproepen via hun index. Zo vind je het gegeven op rij 2 en kolom 3 met
machten[2,3]. Een kortere manier om een array te declareren en in te vullen is
machten:=array(1..3,1..3,[[1,2,3],[1,4,9],[1,8,27]]);
Een tabel is zoals een array maar met dit verschil dat je zelf mag bepalen hoe de index er uit ziet.
Deze indices hoeven dus geen natuurlijke getallen te zijn
nombres:=table([un=een,deux=twee,trois=drie,quatre=vier,cinq=vijf]);
8
en dit is handig om een vertaallijst te maken
nombres[deux];
twee
3
Maple pakketten
Wanneer Maple wordt opgestart zal enkel de kern worden opgeladen. Deze kern is de basis van het Maple
systeem en bevat de primitieve commando’s voor de Maple taal, numerieke berekeningen en routines
voor in- en uitvoer. Deze kern bestaat uit C code en omvat ongeveer 10% van het hele Maple systeem.
De overblijvende 90% is geschreven in de Maple taal en staat in de Maple bibliotheek. Deze bibliotheek
bestaat uit drie groepen: de hoofdbibliotheek, de deelbibliotheek en de pakketten. De hoofdbibliotheek
bevat de meest gebruikte Maple commando’s die nog niet in de kern zitten. Deze hoef je niet expliciet te
laden. De deelbibliotheek bevat minder vaak gebruikte commando’s. Deze moet je expliciet laden met
behulp van readlib(commando). Al de andere commando’s zitten in Maple pakketten. Deze bevatten
een hele reeks commando’s die bij mekaar horen.
Er zijn drie manieren om commando’s uit een pakket op te roepen:
1. Gebruik de volledige naam van het pakket met (tussen vierkante haakjes) het gewenste commando.
Wens je bijvoorbeeld het commando distance uit het pakket student te gebruiken om de Euclidische afstand te berekenen tussen (1, 1) en (3, 2), dan doe je dit met
student[distance]([1,1],[3,2]);
√
5
2. Laad alle commando’s uit een pakket op met het commando with(pakket) waarna je het commando
gewoon kan gebruiken als andere commando’s uit de kern of de hoofdbibliotheek. Om bijvoorbeeld
alle commando’s uit het pakket geometry op te laden doe je
with(geometry);
[ Appolonius, AreCollinear, AreConcurrent, AreConcyclic, AreConjugate,
AreHarmonic, AreOrthogonal, AreParallel, ArePerpendicular, AreSimilar,
AreTangent, CircleOfSimilitude, CrossProduct, CrossRatio, DefinedAs,
Equation, EulerCircle, EulerLine, ExternalBisector, FindAngle, GergonnePoint,
GlideReflection, HorizontalCoord, HorizontalName, IsEquilateral, IsOnCircle,
IsOnLine, IsRightTriangle, MajorAxis, MakeSquare, MinorAxis, NagelPoint,
OnSegment, ParallelLine, PedalTriangle, PerpenBisector, PerpendicularLine,
Polar, Pole, RadicalAxis, RadicalCenter, SensedMagnitude, SimsonLine,
SpiralRotation, StretchReflection, StretchRotation, TangentLine,
VerticalCoord, VerticalName, altitude, area, asymptotes, bisector, center,
centroid, circle, circumcircle, conic, convexhull, coordinates, detail,
diagonal, diameter, dilatation, directrix, distance, draw, dsegment,
ellipse, excircle, expansion, foci, focus, form, homology, homothety,
hyperbola, incircle, intersection, inversion, line, medial, median,
method, midpoint, orthocenter, parabola, point, powerpc, projection,
radius, randpoint, reciprocation, reflection, rotation, segment, sides,
similitude, slope, square, stretch, tangentpc, translation, triangle,
vertex, vertices]
3. Je kan ook ´e´en commando uit een pakket opladen met with(pakket,commando) waarna je het commando kan gebruiken zoals andere commando’s uit de kern of de hoofdbibliotheek. Om bijvoorbeeld
9
het commando linsolve uit het pakket linalg op te laden om het stelsel
x + 5y + 6z
−x − 2y − 3z
3y + 3z
x−y
= 0
= 0
= 0
= 0
op te lossen, doe je
with(linalg,linsolve):
linsolve([[1,5,6],[-1,-2,-3],[0,3,3],[1,-1,0]],[0,0,0,0]);
[− t1 , − t1 , t1 ]
zodat de oplossing gegeven wordt door (x, y, z) = (−t1 , −t1 , t1 ) met t1 een parameter.
De meest gebruikte pakketten zijn
combinat voor combinatoriek. Dit bevat o.a. commando’s om permutaties en combinaties uit te rekenen
maar ook partities van een natuurlijk getal (manieren om n te schrijven als een som van natuurlijke
getallen)
DEtools om te werken met differentiaalvergelijkingen (grafische voorstelling)
difforms voor differentiaalvormen in de differentiaalmeetkunde
GaussInt om te rekenen met Gaussgetallen (getallen van de vorm a + bi met a, b ∈ Z)
genfunc om te werken met voortbrengende functies (genererende functies)
geometry commando’s voor tweedimensionale Euclidische meetkunde
group commando’s voor permutatiegroepen en eindige groepen
inttrans om te werken met integraaltransformaties en hun inverse
linalg meer dan honderd commando’s uit de lineaire algebra om met matrices en vectoren te werken
logic om te werken met Boolse uitdrukkingen en functies
LREtools commando’s om te werken met lineaire recursievergelijkingen
numapprox commando’s om veeltermbenaderingen te berekenen
numtheory klassieke getaltheorie (priemtesten, priemgetallen, . . . )
orthopoly om met allerlei klassieke orthogonale veeltermen te werken
padic om met p-adische getallen te werken
plots om allerlei grafieken te kunnen maken
plottools om met grafische objecten te kunnen werken
powseries om met formele machtreeksen te werken
stats statistische analyse van data
student commando’s voor berekeningen uit differentiaal- en integraalrekening en calculus
10
4
4.1
Oplossen van vergelijkingen
Het commando solve
Het Maple commando solve heeft als invoer een verzameling van ´e´en of meerdere vergelijkingen en een
verzameling van ´e´en of meerdere onbekenden en geeft als uitvoer een rij van ´e´en of meerdere verzamelingen
met exacte oplossingen.
solve({x^2-4*x+1=0},{x});
{x = 2 +
√
3}, {x = 2 −
√
3}
Geef je een uitdrukking in plaats van een vergelijking, dan zet Maple dit om in de vergelijking waarbij
de uitdrukking gelijk aan nul wordt gesteld. Geef je geen onbekenden, dan lost Maple de vergelijkingen
op naar alle onbekenden.
solve({x^2+y^2=1,2*x+y=-1});
4
3
{x = 0, y = −1}, {x = − , y = }
5
5
De gekrulde haakjes rond de vergelijkingen en de onbekenden zijn niet strikt noodzakelijk maar ze zorgen
ervoor dat het antwoord ook als een verzameling wordt gegeven, wat meestal het handigst is. Zo kan je
eenvoudig controleren of het antwoord correct is door het terug in de vergelijkingen te substitueren.
vgln:={x^2+y^2=1,x^2-y^2=1}:
opln:=solve(vgln,{x,y});
opln := {x = 1, y = 0}, {x = −1, y = 0}
subs(opln[1],vgln);
subs(opln[2],vgln);
{1 = 1}
{1 = 1}
Merk op dat de oplossingen opln vergelijkingen zijn en geen toekenningen. Wil je van deze vergelijkingen
toekenningen maken, dan doe je
assign(opln[1]);
en dan krijgt x de waarde 1 toegekend en y de waarde 0. Met assign zet je dus de karakters = om in
de karakters := van een toekenning. Wil je de toekenning terug ongedaan maken, zodat x en y terug
onbekenden kunnen worden, dan doe je
x:=’x’;y:=’y’;
waarbij het symbool x en y wordt toegekend aan de namen x en y.
Soms geeft Maple een oplossing met behulp van het RootOf commando:
solve({x^5+3*x^2-1=0},{x});
{x = RootOf( Z 5 + 3 Z 2 − 1)}
en dit betekent dat de oplossing een wortel is van de veelterm z 5 + 3z 2 − 1. Dit is een exacte vorm van de
oplossing en is nuttig als er verder met deze oplossing moet worden gerekend (bijvoorbeeld in een ander
veld dan dat van de complexe getallen). Als we de oplossingen willen over C dan doen we
allvalues(%);
11
{x = −1.348046941}, {x = −.5992410280}, {x = .5610700072},
{x = .6931089810 − 1.313757976I}, {x = .6931089810 + 1.313757976I}
Aangezien er geen algemene formule bestaat voor de oplossing van een vijfdegraadsvergelijking geeft
Maple een numerieke oplossing in floating-point.
Met het commando isolve gaat Maple enkel op zoek naar gehele oplossingen:
isolve({5*x+2*y=-1});
{x = 1 + 2 N 1, y = −3 − 5 N 1}
Hierbij is N 1 een parameter voor de oplossing. Het commando msolve gebruik je voor de oplossingen
van congruenties modulo m, waarbij je de modulus m als laatste parameter meegeeft in het commando:
msolve({5*x+2*y=-1,x+3*y=2},17);
{y = 10, x = 6}
4.2
Numerieke oplossingen
De numerieke tegenhanger van solve is fsolve. Met fsolve wordt een numerieke benadering gezocht
(met floating-point getallen) van de oplossingen van de vergelijkingen. Meestal wordt slechts naar ´e´en
oplossing gezocht maar voor veeltermvergelijkingen worden alle re¨ele oplossingen gezocht.
veelterm:=8*x^8-5*x^4+2*x^3-1;
fsolve({veelterm},{x});
veelterm := 8x8 − 5x4 + 2x3 − 1
{x = −1.}, {x = .8648234897}
Wens je ook de complexe wortels te vinden, dan geef je dit mee op als een optie
fsolve({veelterm},{x},complex);
{x = −1.}, {x = −.3848170342 − .4421513795I}, {x = −.3848170342 + .4421513795I},
{x = −.06487190786 − .9493971898I}, {x = −.06487190786 + .9493971898I},
{x = .5172771972 − .4438188602I}, {x = .5172771972 + .4438188602I},
{x = .8648234897}
Indien je slechts enkele wortels van een veelterm wenst te vinden dan geef je dit op als een optie, zoals
fsolve({veelterm},{x},maxsols=3,complex);
Je kan een interval opgeven waarin naar een oplossing dient te worden gezocht:
fsolve({sin(x)+cos(x)=0},{x},5..10);
{x = 8.639379797}
Soms vindt Maple geen oplossing terwijl er wel een oplossing bestaat. In zulke gevallen maak je best een
tekening en geef je een interval op waar naar de oplossing moet worden gezocht. Let tenslotte ook op
dat niet alle cijfers in de oplossing accuraat hoeven te zijn. Om de juistheid van de decimale cijfers na te
gaan doe je best de berekening nog eens over met meerdere decimalen.
12
4.3
Differentiaalvergelijkingen
Maple kan symbolisch heel wat gewone differentiaalvergelijkingen oplossen. Dit gebeurt met dsolve
waarbij een verzameling van differentiaalvergelijkingen wordt opgegeven (eventueel met begin- en randvoorwaarden) en een verzameling met onbekenden. Een differentiaalvergelijking geef je op met behulp van
diff. Hierbij is diff(f(x),x) de afgeleide f 0 (x) en diff(f(x),x,x,x) de derde afgeleide f (3) (x). Let
op het verschil met Diff waarbij de afgeleide niet wordt ge¨evalueerd. Je kan ook de differentiaaloperator
D gebruiken.
diffvgl:=diff(y(x),x,x)-3*diff(y(x),x)+2*y(x)=0;
bvw:={y(0)=0,D(y)(0)=1};
opl:=dsolve({diffvgl} union bvw,{y(x)});
¶
¶
µ
∂2
∂
y(x) + 2y(x) = 0
diffvgl :=
y(x) − 3
∂x2
∂x
bvw := {y(0) = 0, D(y)(0) = 1}
opl := y(x) = −ex + e(2x)
µ
Merk op dat de oplossing een vergelijking is en geen Maple functie. We kunnen de functiewaarde −ex +e2x
toekennen aan de naam y(x) met behulp van het assign commando, maar daarmee heb je nog geen
functie. Daarvoor gebruik je het commando unapply.
assign(opl);
f:=unapply(y(x),x);
f := x → −ex + e(2x)
Nu kan je deze functie substitueren in de differentiaalvergelijking en de beginvoorwaarden om na te gaan
op de oplossing wel juist is:
subs(y=f,{diffvgl});
{0 = 0}
subs(y=f,bvw);
{D(f )(0) = 1, f (0) = 0}
eval(%);
{1 = 1, 0 = 0}
Let wel op dat y(x) nu geen onbekende functie meer is maar een symbool waaraan de uitdrukking −ex +e2x
werd toegekend. Om dit ongedaan te maken doe je
y(x):=’y(x)’;
anders krijg je moeilijkheden als je een andere differentiaalvergelijking wenst op te lossen met onbekende
y(x).
Geef je geen begin- of randvoorwaarden op, dan geeft Maple de algemene oplossing met integratieconstanten
dsolve({diff(y(x),x,x)-5*diff(y(x),x)+6*y(x)=0},{y(x)});
y(x) = C1e(2x) + C2e(3x)
Maple kan ook een systeem van differentiaalvergelijkingen oplossen
systeem:={diff(y(x),x,x)=z(x), diff(z(x),x)=y(x)};
dsolve(systeem,{z(x),y(x)});
13
½
¾
∂2
∂
systeem :=
z(x) = y(x), 2 y(x) = z(x)
∂x
∂x
½
√ −1x
1
1
1
2
1
1
−
x
x
y(x) = C1e + C1e( 2 ) %1 + C2 3e( 2 ) %2 − C2e(− 2 x) %1
3
3
3
3
√
1
1
1
1
1
1
+ C2ex − C3 3e(− 2 x) %2 − C3e(− 2 x) %1 + C3ex , z(x) =
3 √
3
3
3 √
1
1
1
1
1
1
1
C1 3e(− 2 x) %2 − C1e(− 2 x) %1 + C1ex − C2 3e(− 2 x) %2
3
3
3
3
¾
1
1
1
1
1
2
− C2e(− 2 x) %1 + C2ex + C3ex + C3e(− 2 x) %1
3
3
3
µ3
¶
1 √
%1 := cos
x 3
¶
µ2
1 √
x 3
%2 := sin
2
Het is sterk aan te bevelen steeds na te gaan of de oplossing voldoet aan de opgegeven vergelijkingen.
Het pakket DEtools biedt nog een heleboel extra mogelijkheden om met differentiaalvergelijkingen te
werken. Gebruik ?DEtools als je hierover meer informatie wenst.
4.4
Recursievergelijkingen
Maple kan ook veel recursievergelijkingen symbolisch oplossen met het commando rsolve. De structuur
is analoog met het oplossen van differentiaalvergelijkingen:
rsolve({f(n)=f(n-1)+f(n-2),f(0)=1,f(1)=1},{f(n)});
´n
´n 
√ ³
√ ³
√2
√2

5
−
5
−
2
2
− 5+1
5+1
√
√
f (n) = −
+


5
5
− 5+1
5+1


Ook wat moeilijkere recursievergelijkingen kunnen worden opgelost
rsolve({f(n)=2*f(n/2)+C*n},{f(n)});
{f (n) = f (1)n +
n ln(n)C
}
ln(2)
Met behulp van het pakket LREtools kunnen nog allerlei andere zaken worden gedaan met recursievergelijkingen. Gebruik hiervoor ?LREtools om meer informatie te krijgen.
5
Grafische mogelijkheden
Een tekening zegt vaak meer dan duizend woorden. Maple heeft daarom verschillende manieren om
figuren te maken, in het bijzonder zijn er veel manieren om een grafiek van een re¨ele functie van ´e´en
of twee re¨ele veranderlijken te maken. Maple kan werken met Cartesische co¨ordinaten, poolco¨ordinaten,
met impliciete functies en functies gegeven met een parametervergelijking. Verschillende figuren kunnen
worden gekoppeld om een dynamisch effect te krijgen waarmee een animatie kan worden gemaakt die
laat zien hoe de figuur wijzigt als een parameter toeneemt.
Bij elk van de tekeningen die Maple produceert kan je met de muis op de tekening klikken en krijg je
in de taakbalk bovenaan enkele knoppen waarmee je de assen en de lijnstijl kan wijzigen. Verder kan je
door de hoeken of zijkanten van het venster te slepen de tekening groter en kleiner maken.
5.1
Grafiek van een re¨
ele functie
Om de grafiek van een functie f te tekenen moet Maple de functie en het domein kennen. Met het plot
commando krijg je dan een tekening
f:=x->3*sin(x)+cos(3*x);
plot(f(x),x=0..10);
14
f := x → 3 sin(x) + cos(3x)
3
2
1
0
2
4
x
6
8
10
–1
–2
–3
Standaard verschijnt de tekening in het Maple werkblad. Wil je deze tekening als een bestand wegschrijven dan gebruik je daarvoor het plotsetup commando. Wens je bijvoorbeeld de tekening in postscript
formaat te bewaren in een bestand graf1.ps dan geef je
plotsetup(postscript,plotoutput=‘graf1.ps‘);
en laat je het plot commando terug lopen. Om daarna terug de tekeningen in het Maple werkblad te
laten verschijnen doe je
plotsetup(inline);
Andere mogelijke opties van plotsetup zijn plotsetup(pcx,plotoutput=‘graf1.pcx‘) als je een bestand graf1.pcx wil hebben in pcx-formaat of plotsetup(window) als je de tekening in een apart venster
wil krijgen onder Windows.
Maple kiest automatisch een gepaste grootte van de verticale as. Je kan deze zelf instellen door
plot(f(x),x=0..10,y=-5..0);
Om meer dan ´e´en functie te tekenen kan je een lijst van functies opgeven
plot([f(x),diff(f(x),x),diff(f(x),x,x)],x=0..10,linestyle=[1,2,3]);
10
5
0
2
4
x
6
8
10
–5
–10
Om onderscheid te maken tussen de verschillende functies hebben we de linestyle optie gebruikt. Dit is
opnieuw een lijst getallen waarbij elk element uit de lijst correspondeert met de overeenkomstige functie
in de functielijst. De waarden 0 en 1 geven een ononderbroken lijn en hogere waarden geven gestreepte
lijnen met steeds kleinere streepjes. Je kan ook een lijst kleuren meegeven als optie
plot([f(x),diff(f(x),x),diff(f(x),x,x)],x=0..10,color=[red,blue,green]);
Kijk bij ?plot[color] voor een lijst van mogelijke kleuren.
Maple kan ook functies in parametrische vorm weergeven. Een cirkel of een ellips zijn hier goede
voorbeelden van
15
plot([[cos(x),sin(x),x=0..2*Pi],[cos(x),sin(3*x),x=0..2*Pi]]);
1
0.5
–1
–0.5
0.5
1
–0.5
–1
Maple zal automatisch de schaal van de horizontale en verticale as kiezen zodat de tekening netjes in een
venster past. Meestal zal de schaal op de twee assen verschillend zijn zodat een cirkel wordt weergegeven
als een ellips. Wil je dezelfde schaal op de twee assen dan geef je als optie scaling=constrained.
Maple gebruikt gewoonlijk Cartesische co¨ordinaten maar kan ook in poolco¨ordinaten tekenen. Hiervoor gebruik je polarplot dat in het Maple pakket plots is opgenomen. Je moet dus eerst dit pakket
opladen. Wens je de grafiek van r = sin(3θ) met θ ∈ [0, 2π] dan doe je
with(plots):
polarplot(sin(3*t),t=0..2*Pi);
Het eerste argument is dus het functievoorschrift voor r in functie van de hoek θ en het tweede argument
is het interval dat θ doorloopt (meestal [0, 2π]). Zoals bij parametrische vergelijkingen kunnen zowel r
als θ functie zijn van een parameter en kan polarplot ook deze parametrische vorm aan. Om de grafiek
van (r, θ) = (sin t, cos t) te tekenen doe je
polarplot([sin(t),cos(t),t=0..2*Pi]);
Maple kan functies met discontinu¨ıteiten met extra zorg tekenen. Om de functie
(
cos πx als x < 1,
g(x) =
x2 − 2 als x ≥ 1,
te defini¨eren en te tekenen, samen met zijn afgeleide, doe je
g:=x->piecewise(x<1,cos(Pi*x),x>=1,x^2-2):
plot([g(x),diff(g(x),x)],x=0..2,discont=true);
4
3
2
1
0
0.2
0.4
0.6
–1
–2
–3
16
0.8
1
x
1.2
1.4
1.6
1.8
2
Zonder de optie discont=true zou er voor de afgeleide functie een stukje verticale lijn zijn als x = 1, als
gevolg van de discontinu¨ıteit van g 0 in x = 1.
Om enkel maar een lijst punten te tekenen (bijvoorbeeld bij numerieke data) gebruik je plot met een
lijst van gegevens van de vorm
[[x1 , y1 ], [x2 , y2 ], . . . [xn , yn ]].
Als de lijst erg lang is dan geef je die best een naam. Maple zal de punten tekenen met lineaire interpolatie
maar met de optie style=point worden enkel de punten getekend. Je kan bovendien ook de vorm van
de punten kiezen met symbol=s waarbij s gekozen wordt uit box, cross, circle, POINT of diamond.
data:=[seq([n,n^2],n=0..20)]:
plot(data,style=point,symbol=circle);
Heb je enkel een lijst van waarden, dan kan je listplot gebruiken uit het Maple pakket plots. Dit
commando heeft als invoer een lijst numerieke waarden [y1 , . . . , yn ] en zal deze uitzetten op dezelfde
manier als plot zou werken met invoer [[1, y1 ], . . . , [n, yn ]].
5.2
Driedimensionale figuren
Een re¨ele functie van twee veranderlijken kan worden getekend als een oppervlak in drie dimensies.
Hiervoor gebruik je plot3d op dezelfde manier als het gewone plot commando. Het eenvoudigst is een
functie van de vorm z = f (x, y):
f:=(x,y)->exp(-(x^2+y^2)):
plot3d(f(x,y),x=-2..2,y=-2..2);
Als je met de muis op de tekening klikt dan verschijnen in de taakbalk een aantal knoppen waarmee je
de tekening kan aanpassen. Zo kan je de grafiek bekijken onder een andere hoek, met rasterlijnen, met
kleuren en met assen.
Sommige oppervlakken kan je niet voorstellen in de vorm z = f (x, y). Een bol, een hyperbolo¨ıde
of een ander kwadriek is gemakkelijker te beschrijven op parametrische wijze. In drie dimensies heb
je dan wel twee parameters nodig. Voor de hyperbolo¨ıde x2 + y 2 − z 2 = 1 gebruik je bijvoorbeeld de
parametrisatie
x
= cos θ cosh(s)
y
z
= sin θ cosh(s)
= sinh(s)
en in Maple teken je dit met
plot3d([cos(t)*cosh(s),sin(t)*cosh(s),sinh(s)],t=0..2*Pi,s=-2..2,
style=patch,orientation=[45,75]);
17
Maple zal normaal een driedimensionale figuur tekenen met een raster op het oppervlak. Met de optie
style=patch worden de vakjes in het raster allemaal gekleurd. De optie orientation=[a,b] geeft de
hoek waaronder je het oppervlak bekijkt, met a de hoek θ in graden en b de hoek ϕ in graden. Standaard
wordt orientation=[45,45] genomen. Voor andere opties kan je kijken bij ?plot3d[options].
In plaats van met Cartesische co¨ordinaten te werken kan Maple ook met bolco¨ordinaten (sferische
co¨ordinaten) werken. Hiervoor moet je wel het Maple pakket plots oproepen waarin het commando
sphereplot is opgenomen. Een figuur gedefinieerd door r = f (θ, ϕ) teken je dan door sphereplot(f(t,s),t=a..b,s=c..d
Om bijvoorbeeld een slakkenhuisje te tekenen doe je
with(plots):
sphereplot(t*sin(phi),t=0..4*Pi,phi=0..Pi,style=patch);
Je kan sphereplot ook gebruiken in parametervorm, waarbij opnieuw twee parameters nodig zijn.
Als het oppervlak wordt gegeven door
r
θ
ϕ
=
=
=
f (s, t)
g(s, t)
h(s, t)
dan teken je dit door
sphereplot([f(s,t),g(s,t),h(s,t)],s=a..b,t=c..d);
Maple kan ook met cilinderco¨ordinaten werken. Hiervoor gebruik je cylinderplot dat ook in het
plots pakket zit. De structuur is analoog met sphereplot.
5.3
Animatie
De grafiek van een functie geeft een statisch beeld van de functie. Om een dynamisch beeld te krijgen
kan je de grafiek van de functie tekenen terwijl een parameter steeds wijzigt. Op die manier krijg je een
beeld van bijvoorbeeld een stuiterende bal of de trilling van een snaar door een heleboel figuren na elkaar
te tekenen. Maple kan al deze figuren na elkaar vertonen met behulp van de commando’s animate en
animate3d die in het pakket plots staan.
Beschouw als voorbeeld de functie f (x, t) = sin(3x) sin(t) waarbij x ∈ [0, π] en t > 0 een tijdsparameter
is. Deze functie geeft een trillende snaar die vast zit in de eindpunten 0 en π en trilt in ´e´en van zijn
trillingsmodi. We krijgen een animatie van deze trillende snaar met
with(plots):
animate(sin(3*x)*sin(t),x=0..Pi,t=0..2*Pi);
Op het scherm verschijnt dan een assenstelsel zonder grafiek. Klik met de muis op de figuur, dan
verschijnen er enkele knoppen in de taakbalk. Klik je op de zwarte driehoek, dan zal de animatie beginnen
en krijg je zestien opeenvolgende figuren voor zestien verschillende t-waarden. Je kan de animatie stoppen,
in een lus laten doorlopen, versnellen en in omgekeerde volgorde laten lopen. Als je meer dan zestien
beelden wenst in de animatie, dan geef je de optie frames=aantal waarmee je het aantal beelden opgeeft.
Je kan ook animatie in drie dimensie krijgen. Neem bijvoorbeeld de functie f (x, y, t) = exp(−(x2 +
2
y )/t), dan krijg je hiervan een animatie met
animate3d(exp(-(x^2+y^2)/t),x=-2..2,y=-2..2,t=0.1..3,style=patch);
Voor driedimensionale animatie worden normaal slechts acht beelden gemaakt, maar dit kan je weer
aanpassen met frames.
18