Predstavitev programa - Sage

Predstavitev programa - Sage

Avtor: Sandi Hrvačanin

O programu

Sage (System for Algebra and Geometry Experimentation) je brezplačen odprtokoden matematičen program napisan v programskem jeziku Python in Cython, ki deluje na področjih:

  • algebre,
  • kombinatorike,
  • numerične matematike,
  • teorije števil,
  • ...

Program Sage podpira programski jezik Python, zato lahko v njem pišemo tudi funkcije in razrede. Sage predstavlja alternativo bolj znanim programom, kot so:

  • Mathematica,
  • MATLAB,
  • Maple in
  • Magma.
(Sage_logo.png)

Uradna spletna stran programa Sage

Trenutna različica: 5.7 (19. 2. 2013)

Oblike uporabe in namestitev

Program Sage lahko uporabljamo na različnih operacijskih sistemih in načinih:

  • za operacijske sisteme Linux, Mac OS X lahko program Sage namestimo na računalnik,
  • pri operacijskem sistemu Windows pridobimo izvorno kodo in prek navideznega operacijskega sistema lahko uporabljamo program (potrebujemo še program VirtualBox),
  • "Live CD" omogoča delo v programu Sage brez nameščanja operacijskega sistema Linux in najenostavnejša,
  • uporabljamo lahko tudi internetno obliko programa na www.sagenb.org (imamo omejeno količino spomina, ki ga lahko uporabimo).

Povezave, do navodil za namestitev:

Začetna stran programa

Začetna stran programa je namenjena za delo z delovnimi listi:

  • ustvarjamo nove liste,
  • prenesemo že shranjene in
  • naložimo delovne liste drugih uporabnikov.

Delovne liste lahko upravljamo samo mi, lahko pa jih dodamo tudi v skupno rabo z drugimi uporabniki programa Sage. Poznati moramo le njihova uporabniška imena.

(zacetna.jpg)
začetna stran

Delovni listi

Sestavni deli delovnega lista so celice v katere vpisujemo ukaze in jih izvedemo na dva možna načina:

  • s klikom na gumb evaluate pod želeno celico, ki jo radi izvedli ali
  • s kombinacijo tipk <Shift+Enter>, enako kot je to v Mathematici.
(delovniList/celica.jpg)
celica

V celice lahko vpišemo enostavne enovrstične račune ali ukaze, ustvarimo nove spremenljivke, vnesemo več ukazov znotraj ene celice, napišemo lahko zanke, funkcije in razrede v Python-ovem zapisu kode.

Pomoč

V programu Sage je dokumentacija zelo obsežna, funkcije so dobro opisane in prikazanih veliko zgledov.

Pri vsaki funkciji dobimo z ukazom <funkcija>? podrobno opisano funkcijo z nekaj primeri.

Pri ukazu <funkcija>?? dobimo za razliko od prejšnjega ukaza celotno izvorno kodo za funkcijo, ki nas zanima.

Včasih pa ne poznamo imena funkcije, ki bi jo potrebovali. Imamo podano neko število ali funkcijo in želimo recimo najti prvo večje praštevilo ali dano funkcijo integrirati.

Pomagamo si lahko tako, da nad objektom, ki ga imamo shranjenega v spremenljivki napišemo spremenjljivka.<Tab> in program nam izpiše vse funkcije, ki so možne nad objektom tipa, ki ga imamo.

Python v Sage

Program Sage podpira programski jezik Python in je tudi v njem deloma napisan. Zaradi počasnosti Pythona je Sage deloma napisan tudi v programskem jeziku Cython, ki je kombinacija programskih jezikov Python in C.

Programska jezika Sage in Python imata podobno obliko pisanja, vendar pa se v marsičem tudi zelo razlikujeta.

OperacijaSagePython
seštevanje++
odštevanje--
množenje**
deljenje//
potenciranje* * ali ^* *
celoštevilsko deljenje/ // /
ostanek pri deljenju%%

Znak ^ v Pythonu predstavlja operacijo XOR med dvema številoma.

Sage vključuje tudi mnogo dodatnih razširitev, ki jih standardni Python nima. V program Sage je vključenih prek 100 odprtokodnih programskih knjižnic, ki so namenjene za simbolno računanje in izboljšanje algoritmov. Nekaj izmed teh so:

  • NumPy,
  • SciPy,
  • matplotlib,
  • R,
  • Maxima,...

Ne vsebuje pa:

  • tkinter,
  • želvje grafike,...

Primer uporabe

Uporabljena koda

Python v Sage

Koda

Spodaj napisana koda je bila uporabljena pri igri Minolovec.

import random

class Polje():
    def __init__(self, x1, y1, x2, y2):
        self._odkrito = False
        self._mina = False
        self._zastava = False
        self._stevilo = 0

class Minolovec():

    @staticmethod
    def ustvariPovrsino():
        sez = []
        yKoor = 2
        for i in range(10):
            xKoor = 2
            sez1 = []
            for j in range(10):
                sez1.append(Polje(xKoor, yKoor, xKoor + 30, yKoor + 30))
                xKoor += 30
            sez.append(sez1)
            yKoor += 30
        return sez

    def porazdeliMine(self, seznamMin = []):
        if seznamMin == []:
            postavljene = 0
            sezMin = seznamMin[:]
            while postavljene < 10:
                x = random.randint(0, 9) # naključno izbrana indeksa x in y
                y = random.randint(0, 9)
                if self.sez[x][y]._mina == False:
                    self.sez[x][y]._mina = True # postavimo mino
                    sezMin.append((x,y))
                    postavljene += 1
            return sezMin

    def postaviStevila(self):
        for mina in self.sezMin:
            for i in range(mina[0] - 1, mina[0] + 2):
                if i >= 0 and i < 10:
                    for j in range(mina[1] - 1, mina[1] + 2):
                        if j >= 0 and j < 10:
                            if not self.sez[i][j]._mina:
                                self.sez[i][j]._stevilo += 1

    def __init__(self):
        self.nova() # ustvarimo novo igralno površino

    def nova(self):
        self.sez = []
        self.sez = Minolovec.ustvariPovrsino()
        self.sezMin = self.porazdeliMine()
        self.postaviStevila()
        self.odkritih = 0
        self.prepoved = False

    def __str__(self):
        # metodo sem uporabljal preden sem imel grafični vmesnik, da sem preverjal postavitev min in števil
        resitev = 'Minolovec 10×10 polj z 10 minami\n'
        meja = '+ - ' * 10 + '+\n'
        resitev += meja
        for sez1 in self.sez:
            resitev += '| '
            for clen in sez1:
                resitev += 'M | ' if clen._mina == True else (str(clen._stevilo) if clen._stevilo!=0 else ' ')+' | '
            resitev += '\n'+meja
        return resitev

Grafika

V programu Sage je zelo dobro razvita grafika, saj je program ustvarjen za algebro in geometrijo.

  • Grafe in grafične objekte lahko shranimo v spremelnljivke in jih ni potrebno izrisati takoj. Izrišemo jih tako, da jih pokličemo ali s pomočjo funkcije show() .
  • Ukazi ponavadi potrebujejo le dva parametra. Na voljo pa imamo več dodatnih parametrov, s katerimi speminjamo barvo, širino in obliko obrobe, prosojnost, območje risanja, legendo, ...
  • V primerjavi z Mathematico, kjer uporabljamo dve vrsti oklepajev za oklepaje funkcije in oklepaje parametrov [ , ] in { , } v programu Sage večinoma uporabljamo le okrogle oklepaje ( , ) .
  • Mathematica pa ima tudi nekaj prednosti pred Sage, saj že sama poskrbi, da so grafi različnih barv ter znotraj enega ukaza lahko definiramo več matematičnih funkcij.

Primer implicitno podane krožnice in hiperbole v Mathematici in Sage.
Matematica:
ContourPlot[{x^2 + y^2  == 4, x^2 - y^2 == 1}, {x, -3, 3}, {y, -3, 3}]

(grafika/mathematica_implicit.PNG)

Sage:
p1 = implicit_plot(x^2 + y^2 == 4, (x, -3, 3), (y, -3, 3))
p2 = implicit_plot(x^2 - y^2 == 1, (x, -5, 5), (y, -5, 5))
p1 + p2

(grafika/sage_implicit.PNG)

Grafika - osnovno

Osnovni elementi

Puščica

 
arrow(tailpoint, headpoint, *options)
  • tailpoint: podamo urejeno dvojico števil za 2D (0, 1) in trojico števil za 3D graf (1, 2, 1) za začetno točko puščice
  • headpoint: podamo koordinate končne točke puščice
  • *options: dodamo lahko poljubno kombinacijo naslednjih in mnogo drugih parametrov za dodatne nastavitve

    • head: spremenimo postavitev puščice 0 (puščica v začetni točki), 1 (puščica v končni točki) in 2 (puščica na obeh koncih)
    • linestyle: opisuje slog puščice '-' (povezana), '--' (črtasta) in ':' (pikčasta)
    • width: določa širino puščice, privzeta vrednost je 2

Črta

 
line(points, *options)
  • points: znotraj seznama vnesemo koordinate točk, med katerimi bi radi imeli ravno črto [(0, 0), (3, 1), (5, 10)]
  • *options:

    • alpha: s številom med 0 in 1 nastavimmo prosojnost objekta
    • linestyle: opisuje slog črte '-' (povezana), '--' (črtasta) in ':' (pikčasta)
    • rgbcolor: podamo trojico števil, ki doočajo RGB zapis barve

Krog in elipsa

 
circle(center, radius,, *options)
ellipse(center, r1, r2, angle, *options)
  • center: koordinate središča kroga ali elipse
  • radius: velikost radija kroga
  • r1, r2: radija elipse, če sta enaka dobimo krožnico
  • angle: kot za katerega zavrtimo elipsko okrog njenega središča
  • *options:

    • alpha: s številom med 0 in 1 nastavimmo prosojnost objekta, kjer 1 predstavlja popolno prosojnost
    • fill: logična vrednost True zapolni notranjost kroga ali elipse, privzeto je False
    • thickness: enako kot width določa širino črte
    • facecolor: določimo barvo notanjosti

Točka

 
point(points, *options)
  • points: podamo lahko koordinate ene točke ali seznam s koordinatami točk, ki jih želimo narisati

Mnogokotnik

 
polygon(points, *options)
  • points: v seznam vnesemo koordinate točk, ki jih povežemo v mnogokotnik
  • *options:

    • alpha: s številom med 0 in 1 nastavimmo prosojnost objekta
    • fill: logična vrednost True zapolni notranjost
(grafika/liki.png)

Risanje grafov

Program Sage vsebuje več načinov s katerimi lahko ustvarimo 2D in 3D grafe matematičnih funkcij. Ukazi se razlikujejo po tem kakšno matematično funkcijo in kakšne lastnost želimo narisati.

O risanju

  • Preden definiramo funkcijo, ki bi jo radi narisali, moramo moramo definirati neodvisne spremenljivke. To storimo z ukazom var . Primer:

    (grafi/var.JPG)
  • Ukazi plot , parametric_plot , implicit_plot , polar_plot , plot3d ,... sami po sebi ne prikažejo grafa. Ukazi ustvarijo objekt ustreznega tipa, ki vsebuje podatke za graf. Grafe prikažemo z uporabo ukaza show .

    (grafi/show.JPG)
  • Ukazu show lahko dodamo parametre xmin =, xmax =, ymin =, ymax = in vpišemo vrednosti v materih mejah bi narisali graf. S parametrom figsize = [a, b] in s števil a, b določimo velikost slike na ekranu.

    (grafi/show1.JPG)
  • Pri 2D grafih nam program prikaže sliko, pri grafih 3D pa potrebujemo namešen program Java.

    (grafi/java3d.JPG)

Risanje grafov

plot

Ukaz plot je osnovni ukaz za risanje 2D grafov ene spremenljivke.

 
plot(funcs, *options)

plot(2*sin(x) + x, xmin=0, xmax=15, fill=True)

  • Ukaz potrebuje le en argument. Podati moramo funkcijo ene spremenljivke.

    • plot_points: določimo število točk s katerimi ukaz nariše funkcijo (privzeto 200)
    • fill: pri vrednosti True dobimo pobarvan del ravnine med X osjo in grafom funkcije (privzeto False )
    • xmin, xmax, ymin, ymax: začetne in končne vrednosti območja risanja
    • detect_poles: pri vrednosti True v polih funkcije ne nariše grafa (privzeto False )

parametric_plot

Ukaz je namenjen risanju parametrično podanih funkcij.

 
parametric_plot(funcs, range, *options)

parametric_plot((t, t^2), (t, -4, 4), fill = True)

  • funcs: sprejme dve funkciji spravljeni v dvojico, kjer prva funkcija opisuje gibanje prve koordinate po parametru in druga funkcija spreminanje druge koordinate.
  • range: je trojica elementov, kjer je prvi element parameter, drugi njegova začetna vrednost in tretji končna vrednost.

    • dodatne možnosti so enake kot pri ukazu plot

implicit_plot

Ukaz je namenjen risanju implicitno podanih funkcij.

 
implicit_plot(f, xrange, yrange, *options)

implicit_plot(x^2+y^2 == 2, (x,-3,3), (y,-3,3), color="red")

  • f: funkcija ali enačba dveh spremenljivk
  • xrange, yrange: je trojica elementov, kjer je prvi element spremenljivka, drugi njegova začetna vrednost in tretji končna vrednost.

    • dodatne možnosti so enake kot pri ukazu plot

polar_plot

Ukaz je namenjen risanju funkcij v polarnem koordinatnem sistemu.

 
polar_plot(funcs, range, *options)

polar_plot(sin(5*x)^2, (x, 0, 2*pi))

  • funcs: funkcija v odvisnosti od ene spremenljivke
  • range: je trojica elementov, kjer je prvi element spremenljivka, drugi njegova začetna vrednost in tretji končna vrednost.

    • dodatne možnosti so enake kot pri ukazu plot

Zgled

V spodnjem filmčku si lahko ogledate reševanje maturitetne naloge s pomočjo programa Sage.

Besedilo naloge

Rešite enačbo .

Vir

Poklicna matura 2012, spomladanski rok, 1. del, 6. naloga.

Maturitetna pola je dostopna na spletnih straneh RIC-a

Zaključek

Prednosti programa Sage

  • je brezplačen,
  • uporaba je možna na internetu,
  • preprosta sintaksa,
  • obsežna dokumentacija s primeri in
  • podpira objektno programiranje.

Slabosti programa Sage

  • ni prav zelo razširjen,
  • zahtevno nameščanje na računalnik,
  • barvo grafov moramo določati sami, v nasprotnem bi bili vsi modri in
  • določati moramo področje risanja, sicer pokaže preveč/premalo.
0%
0%