[CHWISALG] 1.0 Introductie Sage

2415 days ago by Carmen.Streat

Sage en Python. 

Python is een generieke programmeertaal van een hoger niveau dan C of Java, waardoor het makkelijker in gebruik is, maar wel enigszins ten koste van de snelheid.

Sage is een uitbreiding op Python, specifiek voor wiskunde. Het biedt een Python-functiebiblitheek met wiskundige objecten en een preparser. De preparser vertaalt je Sage-objecten naar Python. Sage wordt gebruikt om te werken rond wiskundige onderwerpen.

Sage heeft een grafische gebruikersinterface die beschikbaar is in je browser, de Sage Notebook genaamd, of de Sage Worksheet. Op dit moment gebruik je de Sage Notebook.

 

Doorloop een aantal mogelijkheden van Sage in volgende voorbeelden.  

Door op het "plus" icoontje te klikken, maak je een nieuwe cel waar je een commando kan ingeven. De cel is actief als ze blauw en dik omrand wordt, door in de cel te klikken, kan je ze (opnieuw) actief maken. Om een antwoord te krijgen, moet je op Evaluate klikken of SHIFT-ENTER gebruiken.

Een aantal interessante weetjes : 

  • Cel uitvoeren: SHIFT-ENTER of op evaluate klikken
  • Cel uitvoeren en eronder een nieuwe cel maken: ALT-ENTER
  • Nieuwe regel in een cel: ENTER
  • Nieuwe cel maken: op het "plus" icoontje klikken of op een blauwe lijn (verborgen tussen 2 cellen) klikken
  • Cel splitsen: CTRL-ENTER
  • Cellen samenvoegen: CTRL-BACKSPACE in het begin van een cel
  • Nieuw tekstblok: op het "tekstballon" icoontje klikken of SHIFT-klikken op een (verborgen) blauwe lijn
  • Bestaand tekstblok aanpassen: dubbelklikken op het tekstblok. Tekstblokken ondersteunen ook (elementaire) LaTeX: $\sqrt{x^2+y^2} = 1$.

Let op de fijne rode lijntjes links van de cellen: deze geven aan dat een cel nog niet uitgevoerd is.

Onderbreken van een lange berekening kan met de ESC toets of met Action/Interrupt in het menu bovenaan. 

Soms kan iets niet onderbroken worden of werkt Sage niet meer. In dit geval kan je wel nog Action/Restart worksheet doen. Dit stopt het volledige werkblad, met als gevolg dat alle gekozen variabelen verloren gaan.

 

Rekenen met Sage 

6+2*5 
       
16
16
2^10 
       
1024
1024

Merk op dat Sage de breuk laat staan en niet omzet naar een kommagetal:

2/5 + 3/4 
       
23/20
23/20

Wil je het decimaal antwoord, geef dan de teller in met een punt (als decimaal getal)

23./20 
       
1.15000000000000
1.15000000000000

Als één van beide getallen decimaal gegeven wordt, geeft Sage het antwoord decimaal

2/5 + 0.75 
       
1.15000000000000
1.15000000000000

Vierkantswortels berekenen:

sqrt(8) 
       
2*sqrt(2)
2*sqrt(2)

Als je een mooiere wiskundige output wil, kan je "show" gebruiken

show(sqrt(8)) 
       

                                
                            

                                

Wil je een numerieke benadering van deze uitdrukking, zet dan de uitdrukking tussen de haakjes in  "N()".

N(sqrt(8)) 
       
2.82842712474619
2.82842712474619

derde machtswortels: 

8^(1/3) 
       
2
2

log() is de natuurlijke logaritme (die op rekenmachines meestal met ln aangeduid wordt). Dat kan je merken als je log(10) ingeeft.  Sage kent het getal e als constante.

log(10) 
       
log(10)
log(10)
log(10.0) 
       
2.30258509299405
2.30258509299405
log(2.718281828) 
       
0.999999999831127
0.999999999831127
log(e) 
       
1
1

Een andere basis ingeven, doe je door log(x,b) te gebruiken voor $\log_{\mathrm{b}}(x)$

log(100,10) 
       
2
2

parent()

Hierboven werd duidelijk dat Sage de getallen "10" en "10.0" anders interpreteert . Het commando parent() geeft de wiskundige verzameling waarvan het object een element is. 

parent(10) 
       
Integer Ring
Integer Ring
parent(10.0) 
       
Real Field with 53 bits of precision
Real Field with 53 bits of precision
parent(10/1) 
       
Rational Field
Rational Field

Deze ringen en velden hebben ook een naam in Sage: ZZ voor de gehele getallen, QQ voor de rationale getallen, RR voor de reële, CC voor de complexe.  Bij de reële en complexe velden zie je een precisie in bits, die standaard gelijk is aan 53. Deze 53 bits komen overeen met ongeveer 16 decimale cijfers. Als je een getal met meer cijfers ingeeft krijg je een grotere precisie. 

CC 
       
Complex Field with 53 bits of precision
Complex Field with 53 bits of precision
RR 
       
Real Field with 53 bits of precision
Real Field with 53 bits of precision

Als R zo'n ring of veld is en x een object, dan kan je R(x) gebruiken om x om te zetten naar een element van R.  Hiermee kan je getallen omzetten of van type veranderen:

RR(10) 
       
10.0000000000000
10.0000000000000
QQ(0.25) 
       
1/4
1/4

Het volgende geeft een foutmelding, weet je waarom?

ZZ(1/2) 
       
Traceback (click to the left of this block for traceback)
...
TypeError: no conversion of this rational to integer
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "_sage_input_42.py", line 10, in <module>
    exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("WlooMS8yKQ=="),globals())+"\\n"); execfile(os.path.abspath("___code___.py"))
  File "", line 1, in <module>
    
  File "/var/sage/tmpSs3Bev/___code___.py", line 3, in <module>
    exec compile(u'ZZ(_sage_const_1 /_sage_const_2 )
  File "", line 1, in <module>
    
  File "sage/structure/parent.pyx", line 953, in sage.structure.parent.Parent.__call__ (/opt/sage/sage-7.4/src/build/cythonized/sage/structure/parent.c:9126)
  File "sage/rings/rational.pyx", line 3894, in sage.rings.rational.Q_to_Z._call_ (/opt/sage/sage-7.4/src/build/cythonized/sage/rings/rational.c:31282)
TypeError: no conversion of this rational to integer

Dit werkt ook met symbolische constanten zoals pi en:

pi 
       
pi
pi
cos(pi) 
       
-1
-1
RR(pi) 
       
3.14159265358979
3.14159265358979
RR(e) 
       
2.71828182845905
2.71828182845905

Een getal x omzetten naar een kommagetal met een expliciet gekozen precisie gebeurt met de methode x.numerical_approx(bits). Je kan ook het argument n.(digits) gebruiken, dit geeft de precisie in decimale cijfers.

pi.numerical_approx(20) 
       
3.1416
3.1416
pi.n(digits=20) 
       
3.1415926535897932385
3.1415926535897932385

Sage kent de letter I als imaginaire eenheid i

       
I
I
i^2 
       
-1
-1
parent(i) 
       
Symbolic Ring
Symbolic Ring
RR(i) 
       
Traceback (click to the left of this block for traceback)
...
TypeError: unable to convert '1.00000000000000*I' to a real number
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "_sage_input_52.py", line 10, in <module>
    exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("UlIoaSk="),globals())+"\\n"); execfile(os.path.abspath("___code___.py"))
  File "", line 1, in <module>
    
  File "/var/sage/tmpNyUdjC/___code___.py", line 2, in <module>
    exec compile(u'RR(i)
  File "", line 1, in <module>
    
  File "sage/structure/parent.pyx", line 953, in sage.structure.parent.Parent.__call__ (/opt/sage/sage-7.4/src/build/cythonized/sage/structure/parent.c:9126)
  File "sage/structure/coerce_maps.pyx", line 238, in sage.structure.coerce_maps.NamedConvertMap._call_ (/opt/sage/sage-7.4/src/build/cythonized/sage/structure/coerce_maps.c:5967)
  File "sage/symbolic/expression.pyx", line 1283, in sage.symbolic.expression.Expression._mpfr_ (/opt/sage/sage-7.4/src/build/cythonized/sage/symbolic/expression.cpp:9730)
  File "sage/symbolic/expression.pyx", line 1215, in sage.symbolic.expression.Expression._eval_self (/opt/sage/sage-7.4/src/build/cythonized/sage/symbolic/expression.cpp:9434)
  File "sage/structure/parent.pyx", line 953, in sage.structure.parent.Parent.__call__ (/opt/sage/sage-7.4/src/build/cythonized/sage/structure/parent.c:9126)
  File "sage/structure/coerce_maps.pyx", line 110, in sage.structure.coerce_maps.DefaultConvertMap_unique._call_ (/opt/sage/sage-7.4/src/build/cythonized/sage/structure/coerce_maps.c:4562)
  File "sage/structure/coerce_maps.pyx", line 105, in sage.structure.coerce_maps.DefaultConvertMap_unique._call_ (/opt/sage/sage-7.4/src/build/cythonized/sage/structure/coerce_maps.c:4441)
  File "sage/rings/real_mpfr.pyx", line 636, in sage.rings.real_mpfr.RealField_class._element_constructor_ (/opt/sage/sage-7.4/src/build/cythonized/sage/rings/real_mpfr.c:6903)
  File "sage/rings/real_mpfr.pyx", line 1460, in sage.rings.real_mpfr.RealNumber._set (/opt/sage/sage-7.4/src/build/cythonized/sage/rings/real_mpfr.c:12287)
TypeError: unable to convert '1.00000000000000*I' to a real number

 

Help bij Sage

Er zijn verschillende manieren om help te krijgen in Sage.

Documentatie

De "Help" link rechtsboven bij elk werkblad geeft toegang tot alle documentatie. Erg nuttig zijn de samenvattingen die je vindt in de Quick Reference cards .

Documentatie opzoeken door gebruik van het vraagteken

Plaats een vraagteken achter een  functie om uitleg en voorbeelden van die functie te bekomen en dan klik je op Evaluate of druk op "Tab" na het "?" 

log? 
       

File: /opt/sage/sage-7.4/local/lib/python2.7/site-packages/sage/functions/log.py

Type: <class ‘sage.functions.log.Function_log’>

Definition: log(*args, **kwds)

Docstring:

The natural logarithm of x. See log? for more information about its behavior.

EXAMPLES:

sage: ln(e^2)
2
sage: ln(2)
log(2)
sage: ln(10)
log(10)
sage: ln(RDF(10))
2.302585092994046
sage: ln(2.718)
0.999896315728952
sage: ln(2.0)
0.693147180559945
sage: ln(float(-1))
3.141592653589793j
sage: ln(complex(-1))
3.141592653589793j

The hold parameter can be used to prevent automatic evaluation:

sage: log(-1,hold=True)
log(-1)
sage: log(-1)
I*pi
sage: I.log(hold=True)
log(I)
sage: I.log(hold=True).simplify()
1/2*I*pi

File: /opt/sage/sage-7.4/local/lib/python2.7/site-packages/sage/functions/log.py

Type: <class ‘sage.functions.log.Function_log’>

Definition: log(*args, **kwds)

Docstring:

The natural logarithm of x. See log? for more information about its behavior.

EXAMPLES:

sage: ln(e^2)
2
sage: ln(2)
log(2)
sage: ln(10)
log(10)
sage: ln(RDF(10))
2.302585092994046
sage: ln(2.718)
0.999896315728952
sage: ln(2.0)
0.693147180559945
sage: ln(float(-1))
3.141592653589793j
sage: ln(complex(-1))
3.141592653589793j

The hold parameter can be used to prevent automatic evaluation:

sage: log(-1,hold=True)
log(-1)
sage: log(-1)
I*pi
sage: I.log(hold=True)
log(I)
sage: I.log(hold=True).simplify()
1/2*I*pi

TAB-completie en help

Een zeer handig hulpmiddel in Sage is TAB-Completie: als x een object is en je typt x.[TAB] (de TAB-toets op het toetsenbord), dan krijg je een lijst met alle methoden die op x werken. Als je eerst een paar letters typt, enkel de methoden die met die letters beginnen. Als er maar één mogelijkheid is, wordt de naam automatisch aangevuld:

a=2-3*i a.real_part() 
       
2
2
a.imag() 
       
-3
-3

Dit werkt ook voor functies die geen methode zijn, maar dan enkel als je al een letter getypt hebt. Zet je cursor op het einde, druk op de TAB-toets en kies uit de lijst de functie die je wil toepassen. Om bijvoorbeeld het complex toegevoegde van het complex getal a te bepalen, typ je co en dan met TAB kies je voor:

conjugate(a) 
       
3*I + 2
3*I + 2

Variabelen

Toekennen aan een variabele gebeurt met "=". De waarde wordt niet getoond als die wordt toegekend. 

b=5 
       
1/b 
       
1/5
1/5

Let op dat je de letters e en i niet zelf toekent als variabele aan een bepaalde waarde, want dan rekent Sage verder met jouw gekozen waarden! Heb je dit toch voor, kan je het rechtzetten door reset() te gebruiken.

i=2 
       
i^2 
       
4
4
reset('i') i^2 
       
-1
-1

Je kan meerdere lijnen in één cel ingeven, merk op dat alleen het laatste resultaat getoond wordt:

p = 10 p*p t = p + 50 t^2 
       
3600
3600

Gebruik het print commando om eender waar een resultaat te tonen:

print "t is gelijk aan", p+50 print "t^2 is gelijk aan",t^2 
       
t is gelijk aan 60
t^2 is gelijk aan 3600
t is gelijk aan 60
t^2 is gelijk aan 3600

Genereer de kwadraten van de natuurlijke getallen van 1 t.e.m. 10:

for n in [1..10]: print n^2 
       
1
4
9
16
25
36
49
64
81
100
1
4
9
16
25
36
49
64
81
100

Je kan op deze manier ook een aantal basisbewerkingen doen met complexe getallen. Controleer dat:

c=2-3*i d=1+i c+d 
       
-2*I + 3
-2*I + 3
c*d 
       
-I + 5
-I + 5
d^(-1) 
       
-1/2*I + 1/2
-1/2*I + 1/2
c/d 
       
-5/2*I - 1/2
-5/2*I - 1/2

Symbolische uitdrukkingen en functies

Een symbolische variabele kan je maken met behulp van var. Hieronder maken we symbolische variabelen $x$ en $y$.

var('x, y') 
       
(x, y)
(x, y)
(x+y)+(y-x) 
       
2*y
2*y

Definieer de functie $f(x)=\cos^2{x}$ als volgt:

f(x)=(cos(x))^2 
       

Alleen $f$ vragen, geeft de functie weer:

       
x |--> cos(x)^2
x |--> cos(x)^2

Een bepaalde functiewaarde opvragen:

f(pi) 
       
1
1

Plots

De functie plot dient om een functie te tonen. Deze heeft heel veel opties, kijk maar eens naar de voorbeelden in plot?. Hieronder tonen we hoe we $f$ kunnen plotten waarbij $x$ van $-5$ tot $5$ loopt:

plot(f, (x,-5,5)) 
       

Je kan ook verschillende plots tegelijk laten tekenen, elk in andere kleur. 

P1 = plot(x^3-4*x, (x,-2,2), color='orange') P2 = plot((x^5-16*x)*0.18, (x,-2,2), color='green') P1+P2 
       

De variabelen mogen ook uit meerdere letters bestaan of mogen cijfers of underscores (_) bevatten:

var('a0') 
       
a0
a0

Elke variabele moet expliciet gemaakt worden, behalve $x$ die standaard een symbolische variabele is. Hieronder verschijnt een foutmelding omdat Sage de variabele $w$ niet kent:

sin(w) 
       
Traceback (click to the left of this block for traceback)
...
NameError: name 'w' is not defined
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "_sage_input_7.py", line 10, in <module>
    exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("c2luKHcp"),globals())+"\\n"); execfile(os.path.abspath("___code___.py"))
  File "", line 1, in <module>
    
  File "/var/sage/tmpK0iT5I/___code___.py", line 2, in <module>
    exec compile(u'sin(w)
  File "", line 1, in <module>
    
NameError: name 'w' is not defined

Sommige eenvoudige vereenvoudigingen worden automatisch gedaan, andere niet:

exp(log(x)) 
       
x
x
sin(x)^2 + cos(x)^2 
       
cos(x)^2 + sin(x)^2
cos(x)^2 + sin(x)^2

Om vereenvoudigingen te forceren, gebruik je de methode simplify_full (er bestaan een heleboel varianten van simplify):

(sin(x)^2 + cos(x)^2).simplify_full() 
       
1
1
sin(2*x).simplify_full() 
       
2*cos(x)*sin(x)
2*cos(x)*sin(x)

Voor sommige vereenvoudigingen heb je canonicalize_radical nodig:

(log(x^3)/log(x)).canonicalize_radical() 
       
3
3

canonicalize_radical is soms wel onveilig (waarom?)

sqrt(x^2).canonicalize_radical() 
       
x
x

Uitwerken van uitdrukkingen:

z = (x+y)^3 
       
       
(x + y)^3
(x + y)^3
z.expand() 
       
x^3 + 3*x^2*y + 3*x*y^2 + y^3
x^3 + 3*x^2*y + 3*x*y^2 + y^3

$g$ is een functie in twee veranderlijken:

g(x,y) = log(x) + log(y) g(x,e) 
       
log(x) + 1
log(x) + 1

Je kan nagaan hoe Sage x,z,f en g kent:

parent(x) 
       
Symbolic Ring
Symbolic Ring
parent(f) 
       
Callable function ring with argument x
Callable function ring with argument x
parent(z) 
       
Symbolic Ring
Symbolic Ring
parent(g) 
       
Callable function ring with arguments (x, y)
Callable function ring with arguments (x, y)
 
       

Vergelijkingen oplossen

Met solve() kan je een vergelijking of een stelsel van vergelijkingen oplossen. Let erop om == te gebruiken in een vergelijking, want het teken = wordt gebruikt om een waarde aan een variabele toe te kennen. Na de komma staat de veranderlijke. We nemen als voorbeeld de vergelijking van de gulden snede:

var('x') solve(1 + 1/x == x, x) 
       
[x == -1/2*sqrt(5) + 1/2, x == 1/2*sqrt(5) + 1/2]
[x == -1/2*sqrt(5) + 1/2, x == 1/2*sqrt(5) + 1/2]

Complexe oplossingen worden ook gevonden:

solve(x^3 == 1, x) 
       
[x == 1/2*I*sqrt(3) - 1/2, x == -1/2*I*sqrt(3) - 1/2, x == 1]
[x == 1/2*I*sqrt(3) - 1/2, x == -1/2*I*sqrt(3) - 1/2, x == 1]

Een resultaat dat beter leesbaar is, krijg je als volgt:

show(solve(x^3 == 1, x)) 
       

                                
                            

                                

solve dient enkel om symbolische oplossingen te vinden van een vergelijking. Als Sage geen symbolische oplossing kan vinden, krijg je gewoon de vergelijking terug:

solve(exp(x) == sin(x), x) 
       
[sin(x) == e^x]
[sin(x) == e^x]

Vergelijkingen mogen ook andere variabelen bevatten, deze worden dan gezien als parameter:

var('x a') solve(x^2 + 2*x == a, x) 
       
[x == -sqrt(a + 1) - 1, x == sqrt(a + 1) - 1]
[x == -sqrt(a + 1) - 1, x == sqrt(a + 1) - 1]

Stelsels van vergelijkingen

Om een stelsel op te lossen, steek je de vergelijkingen in een lijst:

var('x y') solve([x + y == 2, x - y == 1], x, y) 
       
[[x == (3/2), y == (1/2)]]
[[x == (3/2), y == (1/2)]]

De doorsnede van een cirkel en een ellips (4 punten in dit geval):

S = solve([x^2 + y^2 == 3, x^2 + 2*y^2 == 5], x, y) S 
       
[[x == -1, y == -sqrt(2)], [x == -1, y == sqrt(2)], [x == 1, y ==
-sqrt(2)], [x == 1, y == sqrt(2)]]
[[x == -1, y == -sqrt(2)], [x == -1, y == sqrt(2)], [x == 1, y == -sqrt(2)], [x == 1, y == sqrt(2)]]

$S$ is een lijst van lijsten: de 4 oplossingen zijn S[0], S[1], S[2] en S[3] en elke S[i] een lijst met een oplossing voor $x$ en een oplossing voor $y$.

S[0] 
       
[x == -1, y == -sqrt(2)]
[x == -1, y == -sqrt(2)]
S[0][0] 
       
x == -1
x == -1

Het rechterlid van een gelijkheid:

S[0][0].rhs() 
       
-1
-1
S[0][1] 
       
y == -sqrt(2)
y == -sqrt(2)

Ongelijkheden

Sage kan ook overweg met ongelijkheden, dan krijg je als oplossing een verzameling punten of intervallen:

solve([x^4 - 4*x^3 + x^2 <= 0], x) 
       
[[x == 0], [x >= -sqrt(3) + 2, x <= sqrt(3) + 2]]
[[x == 0], [x >= -sqrt(3) + 2, x <= sqrt(3) + 2]]
plot(x^4 - 4*x^3 + x^2, (x,-1,4)) 
       

De Sage Notebook interface

De invoer- en tekstcellen zijn de gewone manier om met het Sage-proces te interageren. Je moet ook je werk opslaan en om dat te kunnen is het nodig dat je de andere elementen van de interface verstaat, zoals de verschillende knoppen en links bovenaan. Hieronder staat een overzicht van de belangrijkste.

    • Toggle: De Toggle-link verbergt een groot aantal actieknoppen bovenaan.
    • Home: De Home-link brengt je terug naar de overzichtlijst met al je notebooks. Noot: Vergeet niet op te slaan alvorens op deze link te klikken!
    • Help: De Help-link opent de uitgebreide documentatie van Sage in een ander browser-venster of tabblad.
    • Sign Out: De 'sign out'-link logt je uit en brengt je terug naar de login pagina. Noot: Opnieuw, vergeet niet op te slaan!
    • File: De 'File'-uitschuifmenu voorziet functies om je notebook (worksheet) op te slaan, ook naar een bestand op je harde schijf. Het bestand krijgt dan een .sws extensie. Als je al een .sws notebook-bestand hebt, dan kan je dit ook uploaden via de "Load worksheet from a file"-menuoptie.
    • Action: De belangrijkste optie in het "Action"-menu is  interrupt. Dit laat je toe om een lopende berekening te onderbreken. Dit kan nodig zijn als je vermoedt dat het programma vastzit, of als het te lang duurt. Noot: Een andere manier om een berekening te onderbreken is klikken binnenin de cel waarvoor de berekening bezig is en dan op "Escape" te drukken.
    • Typeset: De "Typeset"-knop kan gebruikt worden op de geëvalueerde output af te drukken in LaTeX-vorm. Dit vormt een aangenamere afdrukvorm.  
    • Print: De "Print"-knop kan gebruikt worden om een afdrukbare vorm van de notebook weer te geven.
    • Worksheet View: Dit is het huidig zicht op de notebook, zoals je het nu ziet.
    • Plain View/Text: Dit is een geavanceerde functionaliteit. Het geeft de ruwe html-tekstversie van de notebook, zoals het bewaard wordt op je harde schijf. Je kan de ruwe html van de notebook bewerken in de "Plain View" modus. Normaal gezien ga je dit weinig moeten doen.
    • Revisions: Revisions geven de vorige versies van de notebook weer, die bewaard werden toen je de notebook afsloot.

Je werk bewaren

Je kan je werk op verschillende manieren bewaren:

  • Telkens als je een cel evalueert, zal een tijdelijke kopie van het notebook bewaard worden op de harde schijf.
  • Bovenaan het notebook kan je op de 'Save' knop klikken om een tijdelijke kopie op te slaan.
  • De knop "Save and Quit" bovenaan het notebook bewaart het notebook op de harde schijf en maakt een backup revision van het notebook.
  • Ga naar "File" en dan "Save worksheet to a file" om het notebook op te slaan als een file op je persoonlijke USB drive.
  • Het is aan te raden de knop "Save and Quit" te gebruiken vooraleer je uitlogt. Je slaat best ook je notebooks op als  een file op je persoonlijke USB drive.