Post on 02-Mar-2019
Capita Selecta:
Grafieken en Lijsten
André Heck
© 2001 AMSTEL Instituut,
Universiteit van Amsterdam
Å Inleiding
Resultaten van berekeningen worden vaak grafisch weergegeven. Je weet al hoe je de grafiek van een functie, bijvoor-
beeld x # sin 1þþþþ2 x , tekent:
In[1]:= Plot Abs Sin x 2 , x, -6*Pi, 6*Pi ;
-15 -10 -5 5 10 15
0.2
0.4
0.6
0.8
1
In "Klassieke Natuurkunde: Golven en trillingen" wordt deze grafiek verfraaid d.m.v. opties:
In[2]:= Plot Abs Sin x 2 , x, -6*Pi, 6*Pi ,
PlotStyle � Hue 0 ,
AspectRatio � 1 4,
Ticks � Range -6*Pi, 6*Pi, 2*Pi , None ;
-6 p-4 p-2 p 2 p 4 p 6 p
In deze les leer je dergelijke methoden en technieken op het gebied van het tekenen van grafieken
met Mathematica.
In de wiskunde en haar toepassing komt het vaak voor dat je een serie gegevens getallen volgens eenzelfde recept wilt
bewerken. Lijsten maken het mogelijk om dat op een korte en systematische manier te doen. Een voorbeeld uit "Simul-
eren en modelleren"; een som over de bevolkingsgroei in de VS tussen 1790 en 1990.
capita.nb 1
In[3]:= years = Table 1790 + 10 n, n, 0, 20 ;
pop = 3.9, 5.3, 7.2, 9.6, 12.9, 17.1, 23.2, 31.4, 38.6, 50.2, 62.9,
76.0, 92.0, 105.7, 122.8, 131.7, 150.7, 179.3, 203.3, 226.5, 248.7 ;
data = Table years i , pop i , i, 1, 21 ;
logdata = Table years i , Log pop i , i, 1, 21 ;
ListPlot data, AxesOrigin � 1780, 0 , Prolog � PointSize .015 ;
1800 1850 1900 1950
50
100
150
200
250
In[8]:= ListPlot logdata, AxesOrigin � 1780, Log 3 , Prolog � PointSize .015 ;
1800 1850 1900 1950
2
3
4
5
In deze les leer je met lijsten in Mathematica om te gaan. Dit is een begin van leren programmeren in Mathematica.
Dit notebook is een korte selectie uit de laatste twee notebooks horende bij de Mathematica introductie. Werk dit
Mathematica notebook aandachtig door en maak de oefeningen.
Succes!
Å Telkens opnieuw beginnen met
In[9]:= Clear "ë" ;
Off General::"spell1" ;
Het eerste commando maakt toegewezen waarden en definities van alle gebruikte symbolen die alleen uit kleine letters
bestaan ongedaan. Het tweede commando onderdrukt meldingen over mogelijke spelfouten.
capita.nb 2
Å Opties
Als je Mathematica een grafiek van een functie laat tekenen, dan maakt het pakket allerlei keuzes: het kiest bijvoor-
beeld het bereik van de grafiek, welke merktekens langs de assen staan en waar, lijndiktes, etc. Vaak is dit goed, maar
soms is het niet naar wens en moet je zelf sturing geven.
Bekijk de grafiek van de functie x # x3- x2 op het interval (-1,1):
In[11]:= Plot x^3 - x^2, x, -1, 1 ;
-1 -0.5 0.5 1
-0.35
-0.3
-0.25
-0.2
-0.15
-0.1
-0.05
Als je alle functiewaarden op het gegeven domein wilt zien, dan kun je de optie PlotRange de waarde All geven
(schrijf de optie als substitutieregel):
In[12]:= Plot x^3 - x^2, x, -1, 1 , PlotRange � All ;
-1 -0.5 0.5 1
-2
-1.5
-1
-0.5
Je kunt ook zelf een bereik opgeven:
In[13]:= Show %, PlotRange � -0.5, 0 ;
-1 -0.5 0.5 1
-0.5
-0.4
-0.3
-0.2
-0.1
We hebben hier nog meer gedaan: we gebruiken Show commando om de grafiek opnieuw te tekenen onder nieuwe
condities. Voorwaarde om dit commando te gebruiken is wel dat er geen nieuwe functiewaarden meer uitgerekend
hoeven te worden. Je kunt bijvoorbeeld wel vragen om de grafiek te tekenen zonder de assen.
capita.nb 3
In[14]:= Show %, Axes � False ;
Maar je kunt Show niet gebruiken met de optie PlotPoints om het aantal punten in de grafiek in te stellen; hiervoor
is echt een nieuwe berekening nodig.
In[15]:= Show %, PlotPoints � 100 ;
Graphics::optx : Unknown option PlotPoints in ú Graphics ú.
Je kunt informatie over een optie krijgen op de bekende manier:
In[16]:= ?PlotPoints
PlotPoints is an option for plotting functions that specifies how many sample points to use.
More…
Er zijn twee manieren om een overzicht van de opties van het Plot-commando te krijgen:
In[17]:= ?? Plot
Plot f, x, xmin, xmax generates a plot of f as a function of x from xmin to
xmax. Plot f1, f2, ... , x, xmin, xmax plots several functions fi. More…
Attributes Plot = HoldAll, Protected
Options Plot = AspectRatio �1
þþþþþþþþþþþþþþþþþþþþþþþþGoldenRatio
, Axes � Automatic, AxesLabel � None,
AxesOrigin � Automatic, AxesStyle � Automatic, Background � Automatic,
ColorOutput � Automatic, Compiled � True, DefaultColor � Automatic, Epilog � ,
Frame � False, FrameLabel � None, FrameStyle � Automatic, FrameTicks � Automatic,
GridLines � None, ImageSize � Automatic, MaxBend � 10., PlotDivision � 30., PlotLabel � None,
PlotPoints � 25, PlotRange � Automatic, PlotRegion � Automatic, PlotStyle � Automatic,
Prolog � , RotateLabel � True, Ticks � Automatic, DefaultFont � $DefaultFont,
DisplayFunction� $DisplayFunction, FormatType � $FormatType, TextStyle � $TextStyle
In[18]:= Options Plot
Out[18]= AspectRatio �1
þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþGoldenRatio
, Axes � Automatic, AxesLabel � None,
AxesOrigin � Automatic, AxesStyle � Automatic, Background � Automatic,ColorOutput � Automatic, Compiled � True, DefaultColor � Automatic,
Epilog � , Frame � False, FrameLabel � None, FrameStyle � Automatic,FrameTicks � Automatic, GridLines � None, ImageSize � Automatic, MaxBend � 10.,
PlotDivision � 30., PlotLabel � None, PlotPoints � 25, PlotRange � Automatic,PlotRegion � Automatic, PlotStyle � Automatic, Prolog � , RotateLabel � True,Ticks � Automatic, DefaultFont � $DefaultFont, DisplayFunction � $DisplayFunction,
FormatType � $FormatType, TextStyle � $TextStyle
capita.nb 4
Je ziet hier nogal vaak als waarde van een optie Automatic verschijnen: dit betekent dat Mathematica een inge-
bouwd algoritme gebruikt.
We bespreken enkele veel gebruikte opties. Bekijk ze eens voordat je de oefeningen maakt.
é PlotRange
Bij de instelling Automatic wordt de verdeling van functiewaarden bekeken en op basis hiervan wordt een tekenge-
bied gekozen; extreme waarden worden niet getekend. Je kunt dit ook combineren met vastgestelde grenzen:
In[19]:= Plot x^3 - x^2, x, -2, 2 , PlotRange � -1, Automatic ;
-2 -1 1 2
-1
-0.8
-0.6
-0.4
-0.2
0.2
é PlotStyle
De stijl van een getekende lijn kun je vastleggen in de optie PlotStyle.
Als je deze de waarde Thickness[0.05] geeft, dan krijg je een dikke lijn;
met GrayLevel[0.5] krijg je een grijze lijn en met
PlotStyle -> {Thickness[0.05], GrayLevel[0.5]}
krijg je een dikke grijze lijn:
In[20]:= Plot x^3 - x^2, x, -1, 1 , PlotStyle � Thickness 0.05 , GrayLevel 0.5 ;
-1 -0.5 0.5 1
-0.35
-0.3
-0.25
-0.2
-0.15
-0.1
-0.05
Je kunt ook stippellijntjes specificeren:
capita.nb 5
In[21]:= Plot x^3 - x^2, x, -1, 1 , PlotStyle � Dashing 0.02 ;
-1 -0.5 0.5 1
-0.35
-0.3
-0.25
-0.2
-0.15
-0.1
-0.05
Of kleuren kiezen. Dit kan op meerdere manieren:
Hue[h] kleurenschema op basis van verzadiging h tussen 0 en 1.
RGBColor[r,g,b] kleurenschema met rood-groen-blauw-waarden r, g, en b tussen 0 en 1.
In[22]:= Plot x^3 - x^2, x, -1, 1 , PlotStyle � Hue 0 ;
-1 -0.5 0.5 1
-0.35
-0.3
-0.25
-0.2
-0.15
-0.1
-0.05
In[23]:= Plot x^3 - x^2, x, -1, 1 , PlotStyle � RGBColor 0, 0, 1 ;
-1 -0.5 0.5 1
-0.35
-0.3
-0.25
-0.2
-0.15
-0.1
-0.05
Als je Engelse namen wilt gebruiken, dan moet je eerst het Graphics‘Colors‘ pakket laden:
In[24]:= << Graphics‘Colors‘
In[25]:= Plot x^3 - x^2, x, -1, 1 , PlotStyle � Green ;
-1 -0.5 0.5 1
-0.35
-0.3
-0.25
-0.2
-0.15
-0.1
-0.05
é Diverse kleurenkaarten
De volgende opdrachten geven diverse kleurenkaarten voor GrayLevel, Hue en RGBColor. Ze zijn louter en
alleen bedoeld als naslagkaarten; de code hoef je (nog) niet te snappen:
capita.nb 6
In[26]:= Show
Graphics
Join
Table GrayLevel i 25 , Rectangle i, 0 , i + 1, 8 , i, 0, 25 ,
Table Text i 5.0, 5*i + 0.5, -1 , i, 0, 5
, AspectRatio � Automatic ;
0 0.2 0.4 0.6 0.8 1.
In[27]:= Show
Graphics
Join
Table Hue i 25 , Rectangle i, 0 , i + 1, 8 , i, 0, 25 ,
Table Hue i 5.0 , Text i 5.0, 5*i + 0.5, -1 , i, 0, 5
, AspectRatio � Automatic ;
0 0.2 0.4 0.6 0.8 1.
In[28]:= rgkleuren = Table RGBColor i, j, 0 , j, 0, 1, 0.1 , i, 0, 1, 0.1 ;
merktekens = 0, 0 , 5, 0.5 , 11, 1 , 0, 0 , 5, 0.5 , 11, 1 ;
In[30]:= Show Graphics RasterArray rgkleuren ,
Frame � Automatic,
FrameTicks � merktekens,
AspectRatio � Automatic,
FrameLabel � r, g ,
RotateLabel � False,
PlotLabel -> "RGB r,g,0 kleurenschema"
;
0 0.5 1r
0
0.5
1
g
0 0.5 1
0
0.5
1
RGB r,g,0 kleurenschema
In[31]:= rbkleuren = Table RGBColor i, 0, j , j, 0, 1, 0.1 , i, 0, 1, 0.1 ;
capita.nb 7
In[32]:= Show Graphics RasterArray rbkleuren ,
Frame � Automatic,
FrameTicks � merktekens,
AspectRatio � Automatic,
FrameLabel � r, b ,
RotateLabel � False,
PlotLabel -> "RGB r,0,b kleurenschema"
;
0 0.5 1r
0
0.5
1
b
0 0.5 1
0
0.5
1
RGB r,0,b kleurenschema
In[33]:= gbkleuren = Table RGBColor 0, i, j , j, 0, 1, 0.1 , i, 0, 1, 0.1 ;
In[34]:= Show Graphics RasterArray gbkleuren ,
Frame � Automatic,
FrameTicks � merktekens,
AspectRatio � Automatic,
FrameLabel � g, b ,
RotateLabel � False,
PlotLabel -> "RGB 0,g,b kleurenschema"
;
0 0.5 1g
0
0.5
1
b
0 0.5 1
0
0.5
1
RGB 0,g,b kleurenschema
é PlotLabel, AxesLabel en Ticks
Het volgende voorbeeld moge duidelijk maken hoe je
- titels en teksten bij de assen kunt plaatsen,
- markeringen naar keuze maakt.
capita.nb 8
In[35]:= titel = "grafiek van Sin x ^2"
Out[35]= grafiek van Sin x ^2
In[36]:= asteksten = x, Sin x ^2
Out[36]= x, Sin x 2
In[37]:= markers = Range 0, 2*Pi, Pi 2 , Automatic
Out[37]= 0,pþþþþ2, p,
3 pþþþþþþþþ2
, 2 p , Automatic
In[38]:= Plot Sin x ^2, x, 0, 2*Pi ,
PlotLabel � titel,
AxesLabel � asteksten,
Ticks � markers ;
pþþþþ2
p 3 pþþþþþþþþ2
2 px
0.2
0.4
0.6
0.8
1Sin x 2
grafiek van Sin x ^2
Je kunt het allemaal zo mooi maken als je zelf wilt. Een voorbeeld van letterkeuze en notatiekeuze:
In[39]:= lbl = StringForm "grafiek van ‘1‘", Sin x ^2
Out[39]= grafiek van Sin x 2
In[40]:= titel = StyleForm TraditionalForm lbl ,
FontSize � 15, FontWeight -> "Bold", FontSlant � "Italic" ;
asteksten = x, None ;
Plot Sin x ^2, x, 0, 2*Pi ,
PlotLabel � titel,
AxesLabel � asteksten,
Ticks � markers ;
pþþþþ2
p 3 pþþþþþþþþ2
2 px
0.2
0.4
0.6
0.8
1grafiek van sin2 x
é Gridlines
Met GridLines geef je aan of je "ruitjespapier" wilt.
capita.nb 9
In[43]:= Plot x^2, x, -3, 3 , PlotRange � All, GridLines � Automatic ;
-3 -2 -1 1 2 3
2
4
6
8
é AspectRatio
Met AspectRatio stel je de schaling van de grafiek in (standaardwaarde geeft guldensnede verhouding). De waarde
Automatic geeft een 1-1 schaling zoals het volgende voorbeeld illustreert.
In[44]:= ParametricPlot Cos t , Sin t , t, 0, 2*Pi ;
-1 -0.5 0.5 1
-1
-0.5
0.5
1
In[45]:= ParametricPlot Cos t , Sin t , t, 0, 2*Pi ,
AspectRatio � Automatic ;
-1 -0.5 0.5 1
-1
-0.5
0.5
1
Het verschil tussen AspectRatio � 1 en AspectRatio � Automatic komt het best tot uiting in het vol-
gende voorbeeld:
capita.nb 10
In[46]:= ParametricPlot Cos t , Sin t , t, 0, 2*Pi ,
PlotRange � -2, 2 , -1, 1 ,
AspectRatio � 1 ;
-2 -1.5 -1 -0.5 0.5 1 1.5 2
-1
-0.75
-0.5
-0.25
0.25
0.5
0.75
1
In[47]:= ParametricPlot Cos t , Sin t , t, 0, 2*Pi ,
PlotRange � -2, 2 , -1, 1 ,
AspectRatio � Automatic ;
-2 -1.5 -1 -0.5 0.5 1 1.5 2
-1-0.75-0.5
-0.25
0.250.5
0.751
é Oefeningen
1. De grafiek van de tangens ziet er in Mathematica niet zo mooi uit:
In[48]:= Plot Tan x , x, -5, 5 ;
-4 -2 2 4
-40
-20
20
40
Verbeter de grafische weergave.
2. Je kunt in Mathematica grafieken van meerdere functies in één figuur tekenen. Je moet dan het eerste argument van
het Plot commando vervangen door een lijst van functies. Je kunt dan ook lijsten gebruiken voor de waarde van een
optie om ze per functie te laten werken. De algemene vorm is dus
Plot[ {f1[x], f2[x],...}, {x, xmin, xmax},
optie �{o1, o2, ...}]
capita.nb 11
(i) Teken de grafiek van sin x en sin x2 in één figuur.
(ii) Teken de grafiek van sin x en sin x2 in één figuur, met de eerste rood-gekleurd en de tweede groen-gestreept.
(iii) Laad het Graphics‘Legend‘ pakket via
In[49]:= << Graphics‘Legend‘
Je kunt nu de optie PlotLegend gebruiken om een bijschrijft toe te voegen aan de grafiek.
Doe dit voor de twee gegeven functies.
Å 3-dimensionale grafieken
In[50]:= Clear "ë" ;
Met een 3-dimensionale grafiek (kortweg 3D-grafiek genoemd) kun je formules bestuderen die 2 onbekenden bevatten.
De twee onbekenden bepalen het grondvlak van de grafiek. De waarde van de formule wordt op de verticale as uit-
gezet. Er vormt zich een gebogen vlak dat bij elk punt in het grondvlak de bijbehorende waarde van de formule aan-
geeft.
Het maken van een 3D-grafiek is net zo eenvoudig als bij een 2D-grafiek: alleen gebruik je nu het commando Plot3D
en enkele andere opties om de grafiek naar je eigen smaak in te richten.
In[51]:= Clear "ë" ;
Plot3D Exp -x^2 - y^2 , x, -2, 2 , y, -2, 2 ;
-2-1
01
2 -2
-1
0
1
2
00.250.5
0.751
-2-1
01
2
Nieuwe opties zijn:
ViewPoint
Het tekenen van een 3D-grafiek in twee dimensies op het computerscherm of op papier gebeurt gewoonlijk via projec-
tie. Het centrum van de projectie heet in Mathematica het ViewPoint. Hieronder staat de standaardwaarde:
In[53]:= Options Plot3D, ViewPoint
Out[53]= ViewPoint � 1.3, -2.4, 2.
Het coördinatenstelsel van het gezichtspunt is gecentreerd op het centrum van de getekende kubusrand en dusdanig
geschaald dat de langste ribbe lengte 1 heeft. De coördinaten hebben dus niets te maken met de coördinaten van de
getekende formule.
capita.nb 12
Laten we eens van onderen en van grotere afstand tegen dezelfde grafiek aankijken.
In[54]:= Plot3D Exp -x^2 - y^2 , x, -2, 2 , y, -2, 2 ,
ViewPoint � 4, -1.5, -2 ;
-2-1
01
2
-2-1
01
2
00.250.50.751
00.250.50.751
Je kunt in het menu Input de optie 3D ViewPoint Selector kiezen, handmatig een geschik gezichtspunt
uitzoeken en dit als optie in een incompleet Plot3D commando plakken.
PlotPoints, Shading, Mesh, etc.
Je kunt ook de kleuring van het oppervlak en de fijnmazigheid van het rooster van het grondvlak beïnvloeden:
In[55]:= Plot3D Exp -x^2 - y^2 , x, -2, 2 , y, -2, 2 ,
PlotPoints � 30, 30 ,
Shading � False ;
-2-1
01
2 -2
-1
0
1
2
00.250.5
0.751
-2-1
01
2
In[56]:= Plot3D Exp -x^2 - y^2 , x, -2, 2 , y, -2, 2 ,
PlotPoints � 50, 50 ,
ColorFunction � Hue,
Mesh � False ;
-2-1
01
2 -2
-1
0
1
2
00.250.5
0.751
-2-1
01
2
capita.nb 13
é Oefeningen
3. Maak de volgende formule: 1 - sin x 2 - cos 2 y
Teken de grafiek voor x tussen -3 en +2 en y tussen -2 en 2.
Kloppen de afmetingen van het grondvalk met de ingevoerde waarden?
4. Hier is nog een formule: 2 + sin x 1 + cos 2 y
Maak er een grafiek van en combineer deze grafiek met de vorige in één figuur
Å Speciale grafieken
In[57]:= Clear "ë" ;
Mathematica kan meer dan grafieken van functies in één of twee veranderlijken tekenen. We geven enkele voorbeelden
zonder veel commentaar. Bekijk ze eens voordat je de oefeningen maakt.
é Geparametriseerde krommen
In[58]:= ParametricPlot t* Cos t , t* Sin t ,
t, 0, 8*Pi , AspectRatio � Automatic ;
-20 -10 10 20
-20
-10
10
20
In[59]:= ParametricPlot3D t* Cos t , t* Sin t , t ,
t, 0, 8*Pi , ViewPoint � 3, 2, 1 ;
-20-1001020
-20-100
1020
0
10
20
0
10
20
capita.nb 14
é Speciale grafieken uit extra Mathematica pakketten
Met LogPlot en LogLogPlot kun je grafieken van functies tekenen in logaritmische of dubbel-logaritmische
schaal. Maar zie wat er gebeurt als je de commando’s zo maar aanroept:
In[60]:= LogPlot x^2 + 2^x, x, 0.1, 10 , PlotPoints � 200 ;
Op zichzelf een correct commando, maar Mathematica weet nog niet wat het betekent. De code is opgeborgen in een
pakket, Graphics‘Graphics‘ genaamd, en dit moet je eerst ophalen in het systeem. Er bestaan nog meer speciale
grafieken-pakketten en je kunt ze allemaal gebruiken als je de zogenaamde context Graphics‘ binnenhaalt. Maar dit
moet je wel doen voordat je een procedure aanroept. Daarom verwijderen we eerst de door ons ingevoerde, foutieve
LogPlot en halen daarna de Graphics‘ context binnen:
In[61]:= Remove LogPlot ;
<< Graphics‘;
Nu werkt het LogPlot commando wel goed:
In[63]:= LogPlot x^2 + 2^x, x, 0.1, 10 , PlotPoints � 200 ;
0 2 4 6 8 101
510
50100
5001000
We geven nog enkele voorbeelden van speciale grafieken:
In[64]:= LogLogPlot x^2 + 2^x, x, 0.1, 10 , PlotPoints � 200 ;
0.1 0.2 0.5 1 2 5 101
510
50100
5001000
capita.nb 15
In[65]:= PolarPlot Cos t * 4*Sin t ^2 - 1 , t, 0, 2*Pi ;
-1 -0.75-0.5-0.25 0.25 0.5
-0.75
-0.5
-0.25
0.25
0.5
0.75
In[66]:= PlotVectorField Sin x , Cos y , x, 0, Pi , y, 0, Pi ;
é Animaties
Je kunt in Mathematica bewegende beelden, oftewel animaties, maken. Er zijn 3 manieren, waarvan we er twee
bespreken:
1. Animate
- Je plaatst in de tekenopdracht een parameter,
- je zet om de opdracht Animate en
- je geeft een gebied op waardoor de animatie-parameter loopt.
Mathematica maakt dan een serie grafieken onder elkaar.
- Selecteer ze allemaal door de juiste groepshaak rechts te kiezen met de linkermuisknop.
- Voor de overzichtelijkheid kun je dubbelklikken om alleen het eerste plaatje in beeld te houden.
- Je zet de animatie aan met ÇY of door in het menu Cell de optie Animate Selected Graphics te kiezen.
- Links onderin het notebook verschijnt een controlepaneel om bijvoorbeeld de snelheid van de animatie te regelen.
Prober het hieronder uit:
capita.nb 16
In[67]:= Plot Sin x , x, 0, 6*Pi ;
2.5 5 7.5 10 12.5 15 17.5
-1
-0.5
0.5
1
In[68]:= Animate
Plot Sin x + t , x, 0, 6*Pi ,
t, 0, 2*Pi
;
2.5 5 7.5 10 12.5 15 17.5
-1
-0.5
0.5
1
2. ShowAnimation
Je kunt ook een rijtje graphische objecten, die wellicht op verschillende wijzen gemaakt zijn, als animatie afspelen met
het commando ShowAnimation. We behandelen dit niet verder.
3. Via het user interface.Je kunt ook een opeenvolgende serie van grafieken maken, deze figuren selecteren en via de menu-optie Animate
Selected Graphics achter elkaar tonen als ware het een tekenfilm. We geven het voorbeeld van een animatie van
een slinger, afkomstig uit "Klassieke natuurkunde: Golven en Trillingen".
In[69]:= a = 1.95;
T = Min 13, Abs 4*EllipticK a^2 4 ;
bwp = f’’ t + Sin f t ç 0, f 0 ç 0, f’ 0 ç a
Out[71]= Sin f t + f�� t == 0, f 0 == 0, f� 0 == 1.95
In[72]:= opl = First NDSolve bwp, f, t, 0, T
Out[72]= f � InterpolatingFunction 0., 11.6576 , <>
In[73]:= Do
Show Graphics
Line 0, 0 , Sin f t , -Cos f t , Disk Sin f t , -Cos f t , 0.1
. opl,
PlotRange � -1.2, 1.2 , -1.2, 1.2 ,
AspectRatio � Automatic
,
t, 0, T - T 50, T 50 ;
capita.nb 17
é Oefeningen
5. Teken de grafiek van de Catenoide die gedefiieerd is door de parameterisering t, z # cos t cosh z, sin t cosh z, z
waarbij 0 b t b 2 p, -1 b z b 1.
6. Het vectorveld van de gradient van een (scalaire) functie f op het x-y vlak is het vectorveld van � fþþþþþþþþ�x , � f
þþþþþþþþ�y . We
noemen dit ook wel het vectorveld van de potentiaalfunctie f.
Teken het vectorveld van de potentiaal f x, y = ln x + 1 2+ y2 - ln x - 1 2
+ y2 , horende bij het electrisch
veld van twee parallelle lijnladingen.
7. Maak een animatie van en rondraaiende spiraal.
Å Werken met lijsten
Gegevens worden vaak opgeslagen in de vorm van lijsten. In deze sectie leer je hoe hier mee om te gaan.
é Het maken van lijsten en selecteren van lijstelementen
In[74]:= Clear "ë" ;
In Mathematica is een lijst een rijtje van objecten geplaatst tussen accolades. Bijvoorbeeld:
In[75]:= Sin x , Cos x , Tan x
Out[75]= Sin x , Cos x , Tan x
Vaak is het handig de procedure Table te gebruiken om lijsten te maken. In de volgende twee opdrachten maken we
een lijst van kwadraten van de eerste 10 natuurlijke getallen en een lijst van de even getallen tussen 50 en 75.
In[76]:= kwadraten = Table i^2, i, 1, 10
Out[76]= 1, 4, 9, 16, 25, 36, 49, 64, 81, 100
In[77]:= even = Table i, i, 50, 75, 2
Out[77]= 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74
capita.nb 18
De algemene vorm van de opdracht is
Table[ uitdrukking, iterator ]
waarbij de iterator het aantal te genereren lijstelementen bepaalt.
De meest algemene vorm van een iterator is
{var, min, max, stapgrootte}
Dan wordt de gegeven expressie herhaalde malen geevalueerd, startend met var = min en eindigend bij var = max,
waarbij var in elke stap met stapgrootte opgehoogd wordt .
Note bene: i.p.v. de opdracht Table[i, {i,0,10,2}] mag je ook het kortere Range[0,10,2] gebruiken om
een lijst van de even getallen tussen 0 en 10 te krijgen.
Elementen uit een lijst kun je gemakkelijk selecteren: telling van links naar rechts begint bij 1 en als je bijvoorbeeld het
5e element van bovenstaande lijst van kwadraten wilt hebben, dan kun je intoetsen
In[78]:= kwadraten 5
Out[78]= 25
Als je negatieve indices gebruikt dan wordt neerwaarts geteld van rechts naar links:
In[79]:= kwadraten -1
Out[79]= 100
Om het eerste en laatste element van een lijst te selecteren mag je ook de commando’s First en Last gebruiken.
Je kunt ook meerdere lijstelementen tegelijkertijd kiezen en het antwoord is op zijn beurt een lijst:
In[80]:= kwadraten 1, -1, 1
Out[80]= 1, 100, 1
Een lijstelement kun je een andere waarde geven en daarmee verandert eigenlijk de hele lijst:
In[81]:= kwadraten
Out[81]= 1, 4, 9, 16, 25, 36, 49, 64, 81, 100
In[82]:= kwadraten 3 = "IX";
kwadraten
Out[83]= 1, 4, IX, 16, 25, 36, 49, 64, 81, 100
é Operaties op lijsten
In[84]:= Clear "ë"
é Herrangschikking
Mathematica heeft verschillende commando’s om lijsten te herrangschikken:
capita.nb 19
In[85]:= lijst = Table Random Integer, 0, 6 , 10
Out[85]= 4, 0, 2, 1, 2, 5, 6, 1, 4, 1
Onderstaande commando’s mogen voor zich spreken
In[86]:= Sort lijst
Out[86]= 0, 1, 1, 1, 2, 2, 4, 4, 5, 6
In[87]:= Reverse %
Out[87]= 6, 5, 4, 4, 2, 2, 1, 1, 1, 0
In[88]:= RotateLeft %
Out[88]= 5, 4, 4, 2, 2, 1, 1, 1, 0, 6
é Combinatie
Mathematica heeft verschillende commando’s om lijsten te combineren:
In[89]:= L1 = 1, 2, 3 ;
L2 = 2, 3, 4 ;
Vergelijk de resultaten van onderstaande opdrachten.
In[91]:= Union L1, L2
Out[91]= 1, 2, 3, 4
In[92]:= Join L1, L2
Out[92]= 1, 2, 3, 2, 3, 4
In[93]:= L1, L2
Out[93]= 1, 2, 3 , 2, 3, 4
é Aanpassing
Een element van een bestaande lijst kun je een andere waarde geven en daarmee verandert eigenlijk de hele lijst. Een
voorbeeld:
In[94]:= oneven = 1, 3, 5, 7, 9 ;
In[95]:= oneven 1 = "I";
oneven
Out[96]= I, 3, 5, 7, 9
Met PrependTo en AppendTo voeg je elementen voor of achteraan toe aan een lijst:
capita.nb 20
In[97]:= AppendTo oneven, 11 ;
oneven
Out[98]= I, 3, 5, 7, 9, 11
In[99]:= PrependTo oneven, 0 ;
oneven
Out[100]= 0, I, 3, 5, 7, 9, 11
Er zijn nog meer operaties op lijsten die het aantal lijstelementen veranderen. Maar deze wijzigen niet stilzwijgend een
toewijzing van een lijst, zoals onderstaand voorbeeld illustreert.
In[101]:= oneven
Out[101]= 0, I, 3, 5, 7, 9, 11
In[102]:= Rest oneven
Out[102]= I, 3, 5, 7, 9, 11
In[103]:= oneven
Out[103]= 0, I, 3, 5, 7, 9, 11
Om met dergelijke commando’s een lijst te wijzigen moet je expliciet een toewijzing doen. In onderstaande opdracht
worden de eerste twee lijstelelementen weggelaten in oneven en het resultaat wordt op zijn beurt aan deze variabele
toegewezen.
In[104]:= oneven = Drop oneven, 1, 2
Out[104]= 3, 5, 7, 9, 11
In[105]:= priemen = Take oneven, 1, 3
Out[105]= 3, 5, 7
In[106]:= priemen = Append priemen, 11
Out[106]= 3, 5, 7, 11
Tussen twee haakjes, het aantal lijstelementen bepaal je met Length.
In[107]:= Length priemen
Out[107]= 4
é Verandering van vorm
Mathematica biedt mogelijkheden om snel de vorm van een lijst te veranderen. Een paar voorbeelden.
In[108]:= L = Table i, i, 1, 10
Out[108]= 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
capita.nb 21
Met Partition kun je een lijst opsplitsen. Het resultaat is een lijst van lijsten, die opgevat kan worden als een tabel:
In[109]:= T1 = Partition lijst, 2
Out[109]= 4, 0 , 2, 1 , 2, 5 , 6, 1 , 4, 1
In[110]:= TableForm T1
Out[110]//TableForm=
4 02 12 56 14 1
In[111]:= Dimensions T1
Out[111]= 5, 2
Inderdaad, een tabel met 5 rijen en 2 kolommen.
In[112]:= T2 = Partition lijst, 5
Out[112]= 4, 0, 2, 1, 2 , 5, 6, 1, 4, 1
In[113]:= TableForm T2
Out[113]//TableForm=
4 0 2 1 25 6 1 4 1
In[114]:= Dimensions T2
Out[114]= 2, 5
De gespiegelde tabel krijg je met Transpose:
In[115]:= T3 = Transpose T2
Out[115]= 4, 5 , 0, 6 , 2, 1 , 1, 4 , 2, 1
In[116]:= TableForm T3
Out[116]//TableForm=
4 5
0 62 11 42 1
Je kunt een lijst van lijsten of een ingewikkeldere structuur van geneste lijsten plat slaan tot een enkelvoudige lijst met
het commando Flatten.
In[117]:= T3
Out[117]= 4, 5 , 0, 6 , 2, 1 , 1, 4 , 2, 1
In[118]:= Flatten T3
Out[118]= 4, 5, 0, 6, 2, 1, 1, 4, 2, 1
capita.nb 22
Met andere woorden: alle accolades met uitzondering van de buitenste twee worden weggehaald met Flatten.
é Grafieken van lijsten van getallen
In[119]:= Clear "ë"
Met het commando ListPlot kun je lijsten van getallen grafisch weergeven.
In[120]:= kwadraten = Table i^2, i, 1, 10
Out[120]= 1, 4, 9, 16, 25, 36, 49, 64, 81, 100
In[121]:= ListPlot kwadraten ;
4 6 8 10
20
40
60
80
100
Door een enkele optie toe te voegen kun je de punten in de grafiek beter zichtbaar maken:
In[122]:= ListPlot kwadraten, PlotStyle � PointSize 0.03 ;
4 6 8 10
20
40
60
80
100
En je kunt het natuurlijk altijd zo mooi maken als je zelf wilt:
capita.nb 23
In[123]:= ListPlot kwadraten,
PlotLabel � StyleForm "kwadraten", FontFamily -> "Times-Bold",
FontSize -> 16 ,
Background � GrayLevel 0.9 ,
PlotStyle � PointSize 0.03 , GridLines � Range 10 , Automatic ,
AxesOrigin � 1, 0 ,
AxesLabel �
StyleForm n, FontSize � 14 , StyleForm n^2, FontSize � 14
;
2 4 6 8 10n
20
40
60
80
100
n2 kwadraten
Het commando ListPlot kun je ook gebruiken om de grafiek van een lijst van puntenparen te tekenen.
In[124]:= xydata = 0, 2 , 1, 3 , 2, 1 , 3, 2 , 4, 3 , 5, 2 ;
In[125]:= ListPlot xydata, PlotStyle � PointSize 0.02 ;
1 2 3 4 5
1.5
2
2.5
3
Er bestaat een optie PlotJoined, die bij de waarde True de punten met rechte lijnen verbindt.
In[126]:= ListPlot xydata, PlotJoined � True ;
1 2 3 4 5
1.5
2
2.5
3
capita.nb 24
Als je de gegevens in twee lijsten hebt en tegen elkaar uit wilt zetten, dan moet je lijstoperaties gebruiken om de juiste
puntenparen aan te maken. Bijvoorbeeld:
In[127]:= x = 0, 1, 2, 3, 4, 5 ;
y = 2, 3, 1, 2, 3, 2 ;
xy = Transpose x, y
Out[129]= 0, 2 , 1, 3 , 2, 1 , 3, 2 , 4, 3 , 5, 2
é Rekenen met lijsten
In[130]:= Clear "ë"
We bekijken de lijst van eerste 10 priemgetallen
In[131]:= priemen = Table Prime i , i, 1, 10
Out[131]= 2, 3, 5, 7, 11, 13, 17, 19, 23, 29
Mathematica is in staat om precies dezelfde berekening op alle lijstelementen los te laten.
Bijvoorbeeld, om overal 1 af te trekken:
In[132]:= priemen - 1
Out[132]= 1, 2, 4, 6, 10, 12, 16, 18, 22, 28
Of elk element te kwadrateren:
In[133]:= priemen^2
Out[133]= 4, 9, 25, 49, 121, 169, 289, 361, 529, 841
Worteltrekken en numeriek benaderen zijn twee andere voorbeelden:
In[134]:= Sqrt priemen
Out[134]= 2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 , 23 , 29
In[135]:= N %
Out[135]= 1.41421, 1.73205, 2.23607, 2.64575,
3.31662, 3.60555, 4.12311, 4.3589, 4.79583, 5.38516
Mathematica weet dat dit kan doordat de Sqrt functie en het commando N de eigenschap Listable hebben. Dit kun
je eenvoudig controlleren.
In[136]:= ?? Sqrt
Sqrt z gives the square root of z. More…
Attributes Sqrt = Listable, NumericFunction, Protected
Een zelfgemaakte functie heeft deze eigenschap niet, met bijkomende gevolgen.
Als voorbeeld dient de volgende functie die de priemdelers van een natuurlijk getal groter dan 1 opsomt.
In[137]:= priemdelers n_Integer? # > 1 & := First Transpose FactorInteger n
capita.nb 25
In[138]:= priemdelers 10
Out[138]= 2, 5
In[139]:= L = Range 2, 10
Out[139]= 2, 3, 4, 5, 6, 7, 8, 9, 10
In[140]:= priemdelers L
Out[140]= priemdelers 2, 3, 4, 5, 6, 7, 8, 9, 10
Op een lijst van getallen werkt de functie niet. Allicht want de functie heeft niet de eigenschap Listable.
In[141]:= ?? priemdelers
Global‘priemdelers
priemdelers n_Integer? #1 > 1 & := First Transpose FactorInteger n
Wil je deze functie toch toegepast zien op elk lijstelement afzonderlijk, dan moet je de procedure Map van stal halen:
In[142]:= Map priemdelers, L
Out[142]= 2 , 3 , 2 , 5 , 2, 3 , 7 , 2 , 3 , 2, 5
Map[ commando, lijst] past het commando toe op elk element van lijst.
I.p.v. het commando Map zie je ook wel eens de volgende infix-notatie:
In[143]:= priemdelers ë L
Out[143]= 2 , 3 , 2 , 5 , 2, 3 , 7 , 2 , 3 , 2, 5
Je kunt ook de procedure zelf de eigenschap Listable geven via SetAttributes:
In[144]:= SetAttributes priemdelers, Listable
In[145]:= priemdelers 20, 25, 30
Out[145]= 2, 5 , 5 , 2, 3, 5
Soms wil je niet dat een commando op elk lijstelement afzonderlijk toegepast wordt, maar wil je de lijst helemaal
vervangen, bijvoorbeeld door de som van de lijstelementen. Je kunt dit doen op verschillende manieren, maar er bestaat
een hele efficiënte methode in een functionele programmeerstijl.
Eerst maar eens kijken hoe uitdrukkingen er intern in Mathematica uitzien. Vergelijk x + y en {x, y}:
In[146]:= FullForm x + y
Out[146]//FullForm=
Plus x, y
In[147]:= FullForm x, y
Out[147]//FullForm=
List x, y
capita.nb 26
Het verschil tussen de som en de lijst is alleen de aanduiding Plus en List voor de soort uitdrukking. Als je in staat
bent om List door Plus te vervangen, dan heb je een lijst vervangen door de som van de lijstelementen. In Mathemat-
ica doe je dit met het commando Apply.
In[148]:= Apply Plus, x, y
Out[148]= x + y
En omgekeerd:
In[149]:= Apply List, x + y
Out[149]= x, y
In het algemeen ziet een expressie er intern in Mathematica altijd uit alsKop[ argument en ]
Apply[ naam, Å] vervangt de Kop door de naam.
Nog twee voorbeelden ter illustratie en tevens om het gebruik van een verkorte notatie @@ te introduceren:
In[150]:= Apply Subtract, x ç y ç 0
Out[150]= x - y == 0
In[151]:= Apply Times, x, y, z
Out[151]= x y z
In[152]:= Plus ëë x, y, z
Out[152]= x + y + z
é Oefeningen
8. Maak een lijst van de eerste 20 oneven positive getallen (d.w.z, 1, 3, 5, .., 39) d.m.v.
(i) Range
(ii) Table
(iii) Selecteer hieruit de priemgetallen (hint: Select en PrimeQ zijn nuttige commando’s)
9. (i) Ga na wat Mathematica oplevert als je de volgende commando’s toepast op de onderstaande lijst
In[153]:= Clear g ;
lijst = a, b , c, d , e, f ;
In[155]:= Map g, lijst
Out[155]= g a, b , g c, d , g e, f
In[156]:= MapAt g, lijst, 1
Out[156]= g a, b , c, d , e, f
capita.nb 27
In[157]:= MapAll g, lijst
Out[157]= g g g a , g b , g g c , g d , g g e , g f
In[158]:= Apply g, lijst
Out[158]= g a, b , c, d , e, f
In[159]:= Apply g, lijst, 1
Out[159]= g a, b , g c, d , g e, f
(ii) Beschouw de geneste lijst als een tabel:
In[160]:= TableForm lijst
Out[160]//TableForm=
a bc de f
Bedenk een efficiënte manier in functionele programmeerstijl om van de gegeven lijst een nieuwe lijst te maken
bestaande uit alleen de tweede kolom, dw.z {b,d,f}. Hoe krijg je op efficiënte wijze de eerste kolom
10. Definieer de functie gemiddelde die het gemiddelde van een lijst getallen uitrekent:
In[161]:= gemiddelde lijst_ :=
Pas de functie toe op de lijst van eerste 100 natuurlijke getallen
capita.nb 28