Introductie in Scilab Ingelbrecht Jeroen, 2ti4 14/05/2007
Inhoudsopgave 1.1 1.2
Inleiding . . . . . . . . . . . . . . . . . . . . . . Eenvoudige bewerkingen uitvoeren . . . . . . 1.2.1 Rekenen in Scilab . . . . . . . . . . . . . 1.2.2 Het aantal beduidende cijfers . . . . . . 1.2.3 Werken met variabelen . . . . . . . . . . 1.2.4 Vectoren . . . . . . . . . . . . . . . . . . 1.2.5 Werken met functies . . . . . . . . . . . 1.2.6 Vergelijkingen numeriek oplossen . . . Werken met grafieken . . . . . . . . . . . . . . 1.3.1 De grafiek van een functie tekenen . . . 1.3.2 Opvragen van cordinaten van een punt Programmeren in Scilab . . . . . . . . . . . . . 1.4.1 Werken met functies . . . . . . . . . . . 1.4.2 Matrices en vectoren . . . . . . . . . . .
1.3
1.4
1.1
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
1 1 1 2 3 4 4 5 6 6 7 8 8 8
Inleiding
De versie van Scilab waarover deze tutorial handelt is Scilab 4.1.1 voor unixsystemen. Het wordt gebruikt onder Kubuntu met kde versie 3.5.6.
1.2 1.2.1
Eenvoudige bewerkingen uitvoeren Rekenen in Scilab Listing 1.1: Eenvoudige bewerkingen
1 2 3 4
-->4+5 ans = 9.
Instructies worden ingevoerd na de prompt (–¿) via het toetsenbord en worden uitgevoerd door de return-toets in te drukken. Listing 1.2: Vierkantswortel 1 2 3 4 5 6 7
-->sqrt(4),sqrt(17) ans = 2. ans = 4.1231056
1
Ook in Scilab is er geen symbool voor de vierkantswortel. Ook hier is er een ingebouwde functie sqrt(). Meerdere instructies worden van elkaar gescheiden d.m.v. een komma. Output wordt onderdrukt door gebuirk te maken van de puntkomma ’;’. Listing 1.3: Uitvoer onderdrukken 1 2 3 4
-->3*4+7;sqrt(36)-2 ans = 2.
Machten kan je intikken met de toets ’ˆ’. In tegenstelling tot Euler hoeft de spatietoets niet meer gebruikt te worden. Als de exponent uit meerdere termen bestaat, dan plaatsen we die tussen haakjes. Listing 1.4: Volgorde van bewerkingen 1 2 3 4 5 6 7 8 9
-->3*4ˆ2-10,-1ˆ2*3+7,(-1)ˆ(2*3)+7 ans = 38. ans = 4. ans = 8.
Scilab heeft een aantal ingebouwde functies zoals log(), abs(), ceil(), floor(), modulo(n,m), sin(), cos(), . . . Listing 1.5: Enkele ingebouwde functies 1 2 3 4 5 6 7 8 9 10 11 12 13
-->abs(-5),floor(6.3),log(30),modulo(25,3) ans = 5. ans = 6. ans = 3.4011974 ans = 1.
1.2.2
Het aantal beduidende cijfers Listing 1.6: Beduidende cijfers
1 2 3 4
-->%pi %pi = 3.1415927
Dit is niet het volledige irrationele getal pi. Het aantal beduidende cijfers kan aangepast worden met het commando: format( [string],[integer]) Waarbij string kan zijn: ’v’ (v-formaat, default) of ’e’ (e-formaat) en integer duidt op het maximum aantal tekens (default 10). 2
Listing 1.7: Meer of minder beduidende cijfers 1 2 3 4 5 6 7 8 9 10 11 12 13 14
-->format(’v’,10),%pi %pi = 3.1415927 -->format(’v’,12),%pi %pi = 3.141592654 -->format(’v’,5),%pi %pi = 3.14
Deze instelling blijft geldig tot wanneer ze uitgeschakeld wordt door een ander commando. Belangrijk detail: in Scilab kan je niet met de cursor naar een vorige regel gaan en die laten heruitvoeren. Je kan wel een vorige regel laten uitvoeren door met de pijltjestoetsen te werken. Listing 1.8: Instellingen blijven gelden 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
-->format(’v’,20),%pi,sqrt(3),1/7,format(’v’,5),sqrt(3),%pi %pi = 3.14159265358979312 ans = 1.73205080756887719 ans = 0.14285714285714285 ans = 1.73 %pi = 3.14
1.2.3
Werken met variabelen Listing 1.9: Variabelen
1 2 3 4 5 6 7 8 9 10 11 12 13 14
-->x=7,ar=-2.4,zon=1.1 x = 7. ar = -2.4 zon = 1.1 -->2*x+3,ar/-2,zon*zon ans =
3
15 16 17 18 19 20 21
17. ans = 1.2 ans = 1.21
De naam van een variabele kan bestaan uit meerder karakters. Een waarde toekennen aan de variabele gebeurt d.m.v. ’=’. Als deze variabele nadien gebruikt wordt in wiskundige uitdrukkingen, dan wordt er gewerkt met de waarde van de variabele. Het uitvoeren van een paar regels terug zorgt er echter voor dat x terug de waarde 7 krijgt. Het heruitvoeren van regels is niet aangeraden om misverstanden te vermijden. Listing 1.10: Waarde van variabelen 1 2 3 4 5 6 7
-->x=-2,3*xˆ3-1 x = -2. ans = -25.
1.2.4
Vectoren Listing 1.11: Vector
1 2 3 4
-->x=1:0.2:3 x = 1.
1.2
1.4
1.6
1.8
2.
2.2
2.4
2.6
2.8
3.
Met deze instructie kennen we aan de variabele x een (rekenkundige) rij toe. De rij begint bij 1 en einidgt bij 3. De stap tussen elk van de waarden van de rij bedraagt 0.2. Met deze variabele x kunnen bewerkingen gedaan worden. Een rij van getallen is een vector. Listing 1.12: Rekenen met vectoren 1 2 3 4
-->2*xˆ2+1 ans = 3.
1.2.5
3.88
4.92
6.12
7.48
9.
10.68
12.52
14.52
Werken met functies Listing 1.13: Functie defini¨eren
1 2 3 4 5 6 7 8
-->function y=f(x) -->y=2*x -->endfunction -->f(2) ans = 4.
4
16.68
19.
9 10 11 12 13 14 15
-->function y=g(x), y=x*3, endfunction -->g(5) ans = 15.
Het defini¨eren van een functie in Scilab gebeurt als volgt: na de prompt schrijven we function gevolgd door een output parameter. Deze parameter wordt gevolgd door een ’=’, de naam van de functie en de input parameter(s) tussen haakjes. Bijvoorbeeld: ’function y=dubbel(x)’. Hierna volg(en)(t) de instructie(s) die moet(en) leiden tot de output. Bijvoorbeeld: ’y=2*x’. Als laatste volgt er nog endfunction. Je kan dit in Scilex zelf typen, wat werkbaar is voor kleinere functies. Je kan echter ook de editor van Scilab gebruiken, die je vindt in de werkbalk bovenaan rechts. Dit is aangeraden voor grotere functies. Je slaat het bestand dan op en je laat het uitvoeren in scilex door op ’execute’ te klikken en dan te kiezen voor ’Load into Scilab’. Listing 1.14: Vergelijkingen numeriek oplossen 1 2 3 4 5 6 7
-->s=1:0.5:3,f(s) s = 1. 1.5 2. 2.5 ans =
3.
2. 3. 4. 5. 6.
1.2.6
Vergelijkingen numeriek oplossen Listing 1.15: Roots-functie
1 2 3 4 5 6
-->x=poly(0,’x’); -->roots(-2*x+7) ans = 3.5
De functie roots() geeft een vector weer van nulpunten van de opgegeven functie. In het voorbeeld was er maar n nulpunt, het resultaat van roots(-2*x+7) is dus een vector bestaande uit n getal. Listing 1.16: Roots-functie met meerdere nulpunten 1 2 3 4 5
-->x=poly(0,’x’);roots(-2*xˆ2+3*x-1) ans = 0.5 1.
x=poly(0,’x’) betekent dat je een polynoom aanmaakt met als nulpunt 0 en als variabele x. Een andere variant is: x=poly([1,2,3], ’x’, ”coeff”) waarmee je de volgende functie opgeeft: 1 + 2x + 3x2 Ook functies kunnen als argument meegegeven worden in de roots-functie 5
Listing 1.17: Roots-functie met functie als argument 1 2 3 4 5 6 7 8
-->function y=test(x), y=2*x+5,endfunction -->format(’v’,20) -->x=poly(0,’x’);roots(test(x)) ans = -2.5
Belangrijk is dat je de naam van de functie geeft met dan nog eens het argument tussen haken. De naam van de functie alleen is niet genoeg. Roots geeft, evenals Euler, slechts een benadering van het nulpunt. Listing 1.18: Roots-functie met benadering van nulpunten 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
-->format(’v’,20) -->x=poly(0,’x’);roots(xˆ3-3*x+1) ans = 0.3472963553338608 1.532088886237956 - 1.8793852415718169 -->x= 1.532088886237956 x = 1.532088886237956 -->xˆ3-3*x+1 ans = -0.00000000000000044
1.3 1.3.1
Werken met grafieken De grafiek van een functie tekenen
De grafiek van een functie geeft een goed beeld van het verloop. De grafiek geeft een globaal beeld van de functie op een bepaald interval. Er zijn meerder manieren om een grafiek te tekenen. De aangetoonde manier is een gestructureerde manier die uit vier stappen bestaat: 1. defini¨eren van het interval op de X-as 2. defini¨eren van het interval op de Y-as 3. defini¨eren van de functie 4. het plotten van de functie Listing 1.19: functiedefinitie en plot2d 1 2 3
-->x=0:0.5:20; -->y=-5:0.5:20;
6
4 5 6 7
-->y= sin(x); -->plot2d(x,y)
Het defini¨eren van de intervallen op de assen geeft het venster aan waarin de grafiek geplot wordt. plot2d tekent dan de functie. De grafiek komt tevoorschijn in een ander venster. Met ALT+TAB kan je naar het ander venster terug. Ok je klikt in het andere venster. In het grafisch venster zijn er vele mogelijkheden waaronder inzoomen en het bekijken van de grafiek in 3D, gesteld dat het gaat om een 2D-grafiek. Het veranderen van de grenzen gebeurt in het volgende voorbeeld. Listing 1.20: Scherm aanpassen 1 2 3 4 5 6 7 8 9 10 11 12 13
-->x=0:0.5:20; -->y=-5:0.5:20; -->y= sin(x); -->plot2d(x,y) -->x=-10:0.5:20; -->y= sin(x); -->plot2d(x,y)
Scilab zal automatisch verschillende functies op eenzelfde grafiek tekenen zolang het grafisch scherm niet gesloten wordt of het xbasc() commando niet werd gegeven in scilex. Dat laatste commando maakt het grafische scherm leeg. Een nadeel is dat de grafieke in dezelfde kleur worden geplot. Een oplossing is de kleur aanpassen in het plotcommando. Het volgende voorbeeld heeft als resultaat dat de tweede grafiek in het rood wordt getekend. Listing 1.21: Kleur aanpassen 1 2 3
-->x=0:0.5:20;y=-5:0.5:20;y= sin(x);plot2d(x,y) -->y= cos(x);plot2d(x,y,style=[color("red")])
1.3.2
Opvragen van cordinaten van een punt
Het opvragen van cordinaten van een punt gaat d.m.v. het locate() commando. Hierbij kan je twee integers als argumenten meegeven die aangeven om hoeveel het punten het gaat. g=locate(2,1) betekent bijvoorbeeld dat je twee punten gaat selecteren op de grafiek en dat deze punten staan aangeduid met een kruisje. Als resultaat krijg je dan een 2 op 2 matrix, twee ¨ coordinaten per punt. Listing 1.22: Opvragen van cordinaten van een punt 1 2 3 4 5 6 7
-->x=0:0.5:20;y=-5:0.5:20;y= sin(x);plot2d(x,y) -->g=locate(1,1) g = 4.0095078 -0.6427372
7
1.4 1.4.1
Programmeren in Scilab Werken met functies
Een functie heeft een functienaam, een (aantal) argument(en), ook wel gekend als paramter(s) en een functiedefinitie. Elke functie heeft juist e´ e´ n resultaat. Listing 1.23: Functie in Euler defini¨eren 1 2 3 4 5 6
-->function y=meetkgem(a,b), y=sqrt(a*b),endfunction -->meetkgem(3,12) ans = 6.
Er zijn twee manieren om functies te defini¨eren. De eerste manier is zoals in het voorbeeld, alles ingeven in scilex. Deze methode is echter alleen werkbaar voor functies bestaande uit een beperkt aantal regels code. Het wordt al snel onoverzichtelijk en daarom is een tweede methode veel beter wanneer het gaat om uitgebreidere functies. Deze tweede methode bestaat uit het intypen van de regels code in de editor van scilab: scipad. Je vindt deze editor terug in de rechterbovehoek van scilex. Bestanden die je in scipad aanmaakt kan je opslaan als ”.sci”bestanden waarna je ze kan inladen in scilex. Dit doe je door op de tab ’Execute’ te klikken en ’Load into Scilab’ te kiezen, of gewoon CTRL+l. Door dit commando wordt de code (onzichtbaar) ingeladen in Scilab en kan je de functie nu gebruiken in Scilab. Commentaar kan je meegeven in de header van de functie. Deze kan je dan oproepen door in scilex het head_comments functienaam pad/functienaam commando op te geven. Hieronder een voorbeeld van hoe dit in zijn werk gaat. Listing 1.24: Maal.sci 1 2 3 4
function y=maal(a,b) // deze functie berekent a*b y=a*b endfunction
1 2 3 4 5 6 7 8
-->head_comments maal /home/jeroen/Khleuven/2ti4/Wiskunde/Scilab/maal function y=maal(a,b) deze functie berekent a*b
Listing 1.25: Oproepen van functiecommentaar
-->maal(2,3) ans = 6.
1.4.2
Matrices en vectoren
Een vector is een geordende verzameling van getallen. Een voorbeeld: V = [1, 2, 3, 4, 5] Een matrix is een rechthoekig schema getallen. Scilab telt een aantal ingebouwde functies m.b.t. matrices. 8
definitie matrix matrixelement volledige rij van een matrix submatrix matrices samenvoegen constante optellen bij elk element elk element vermenigvuldigen met constante matrix optelling (element per element) matrix met 4 rijen en 2 kolommen, en ieder element gelijk aan 0 lengte van de vector V matrix met 2 rijen en 2 kolommen, en ieder element gelijk aan 1
M=[1,2,3,4;5,6,7,8] M(2,3) M(3,:) M(1:2,2:3) M=[M,M],M=cat(1,M,M) M+3 M*3 M+N zeros(4,2) length(V) ones(2,2)
Tabel 1.1: Enkele ingebouwde functies m.b.t. matrices
1 2 −3 2 M= 8 5 7 5 . −6 −4 11 8
Bovenstaande matrix bijvoorbeeld bevat 3 rijen en 4 kolommen. Een matrix wordt rij per rij genoteerd tussen vierkante haken “[,]”. De kolommen worden gescheiden door “,” en de rijen door “;”. Het aantal rijen en kolommen wordt opgevraagd door de functies rows() en cols(). Listing 1.26: Een matrix defini¨eren 1 2 3 4
-->M=[1,2;3,4] M = 1. 2. 3. 4.
Een matrixelement kan opgevraagd worden door de indices te geven, bvb.: M(1,2). Dit is het element in de eerste rij, tweede kolom. In bovenstaand geval zou dit 2opleveren. Een vector is niets meer dan een matrix bestaande uit 1 rij of 1 kolom. Om een element uit een vector te halen moet je slechts 1 index meegeven. Listing 1.27: Een vector defini¨eren 1 2 3 4 5 6 7 8 9 10 11 12
-->V=[1,2,3,4] V = 1.
2.
3.
4.
-->V(3) ans = 3. -->W=[5,6,7,8];
9
13 14 15 16 17 18 19 20 21 22
-->X=[V,W] X = 1.
2.
3.
4.
5.
6.
7.
8.
-->X=cat(1,V,W) X = 1. 5.
2. 6.
3. 7.
4. 8.
10