Matematikai szoftverek – sage (Software for Arithmetic Geometry Experimentation)

Misszió: legyen egy életképes ingyenes, nyílt forráskódú alternatívája a Magma, Maple, Mathematica és Matlab programoknak.

 

A Sage hosszútávú céljai

 Források

{{{id=4| restart /// }}}

 

 

 

Sage, mint numerikus kalkulátor

Aritmetikai alapműveletek, elemi függvények

{{{id=39| 1 + 1 /// }}}

A sage ismeri a racionális számokat, amikkel pontosan tud számolni. Lebegőpontos változatra vált az n() metódus.

{{{id=40| 13/5 /// }}} {{{id=41| n(13/5) # A N() vagy n() függvény lebegőpontossá alakít /// }}} {{{id=42| sin(1), sqrt(2) /// }}} {{{id=43| sqrt(2).n(), sqrt(2).n(200) # az n() nem csak függvényként, metódusként is használható /// }}} {{{id=227| sin(1.0) /// }}} {{{id=44| sin(pi/3) /// }}} {{{id=226| show(sin(pi/3)) /// }}} {{{id=49| _.n(1000) # _ az előző eredmény /// }}} {{{id=48| 111^111 /// }}} {{{id=47| 13//5, 13%5 /// }}} {{{id=231| 64^(1/6) # gyökvonás /// }}} {{{id=232| factor(24) # TAB-bal kiegészítés, pl. csak annyit írtunk be, hogy fact /// }}} {{{id=234| exp(2), e^2 /// }}} {{{id=235| e^2.n() /// }}} {{{id=236| log(e), log(100), log(100.), log(100,10), log(1024,2) /// }}} {{{id=237| arcsin(1/2) /// }}} {{{id=244| a = 10^10 # a kifejezések megnevezhetők (változók) a%3 /// }}}

TAB gomb megnyomása folytatja az addig beírtakat (ha tudja), a felkínált listából választhatunk. Egy függvény neve után tett ? után részletes segítséget kapunk.

{{{id=239| x.abs? /// }}}

 

Listák, indexek

Az indexelés  0-tól  indul.

{{{id=83| (3 + 3*I)^4, (sqrt(3) + i)^6 # 2-elemű sorozat, a kerek zárójeleket automatikusan kiteszi /// }}} {{{id=86| expand(_[1]) # zárójelek felbontását kéri /// }}} {{{id=84| l = [1, 3, 2, 4] l[1:2] /// }}} {{{id=95| l = range(7); l # ; több parancs egymás mellé /// }}}

lista[c:d]   a lista c indexű elemétől, de a d indexű már nem!

lista[c:d:e]   mint az előző, de e-esével lépkedve

{{{id=94| l[1], l[-1], l[:2], l[4:], l[3:1], l[0:-1], l[0:-1:2] /// }}}

Listaértelmezés

[kifejezés for változó in valami]

Hasonló ahhoz, ahogy a matematikában a halmazokat definiáljuk. Például: $\{ f(x) \mid x\in H\}$.

(A lista a sage-ben különbözik a halmaztól, mert a listában az elemek sorredje meg van kötve, a halmazban nem.)

{{{id=106| L = [factor(n) for n in range(10000, 10025)] /// }}} {{{id=163| print L /// }}}

Listaértelmezés feltétellel

[kifejezés for változó in valami if feltétel]


{{{id=107| P = [n for n in range(10000,10100) if is_prime(n)] /// }}} {{{id=105| P /// }}}

 

Logikai értékek

{{{id=46| 3 == 4 /// }}} {{{id=81| 3 <> 4, 3 != 4 /// }}} {{{id=45| 3 < 4 /// }}}

 

Képlettel definiált függvények

{{{id=169| f(x) = x^3 /// }}} {{{id=175| f(5) /// }}} {{{id=174| var('c') f(c) /// }}} {{{id=173| a = f(c^2-3) /// }}} {{{id=172| expand(a) /// }}}

 

 

Sage, mint programnyelv

A Python nyelvre épül.

 

Változók

Változók típuskezelése dinamikus (nem statikus: nem kell deklarálni a típusukat, szabadon változtathatóak).

{{{id=54| a = 3 a = a+1 a = a^2 a /// }}} {{{id=53| a = "ez egy szöveg" /// }}} {{{id=52| a /// }}} {{{id=58| print a # az ö betű UTF8 kódja c3 b6 /// }}}

 

 

Szimbólikus változó, a sage, mint szimbólikus kalkulátor

Ellentétben a klasszikus programnyelvekkel (C, Python, Fortran,...), de hasonlóan a többi CAS-hez (computer algebra system) a sage-ben is lehet egy változó szimbólikus. Sage-ben induláskor az x változó szimbólikus, és a var függvénnyel bármely változó azzá tehető.

{{{id=59| diff(x^2*exp(x), x) /// }}} {{{id=68| diff(x^2*exp(x), x, 10) /// }}} {{{id=67| integral(9*x^2*exp(3*x^3), x) /// }}} {{{id=61| diff(y^2*exp(y), y) /// }}} {{{id=57| var('y') /// }}} {{{id=164| diff(y^2*exp(y), y) /// }}} {{{id=56| solve([x+y==3, x-y-4], x, y) /// }}} {{{id=55| var('x y z p q') eq1 = p+q==5 eq2 = p*x+q*y==-5 eq3 = p*x^2+q*y^2==10 solve([eq1,eq2,eq3], q, x, y) /// }}} {{{id=248| solve( [2*x + 3*y + 2*z == -1, x + y + z == 0], x, y ) /// }}} {{{id=249| solve( [2*x + 3*y + 2*z == -1, x + y + z == 0], x, y, z ) /// }}} {{{id=62| solve(cos(x)==sin(x), x) /// }}} {{{id=63| find_root(cos(x)==sin(x), 0, 1) /// }}} {{{id=145| limit(arctan(-x) + exp(-x)*x^1000, x=oo) /// }}}

 

Feltételes utasítás: if

{{{id=207| a = 12 if a%2 == 0: print "páros" else: print "páratlan" /// }}}

 

Függvények és metódusok

{{{id=160| f(x,y) = x^3*exp(x^2)*y^3 /// }}} {{{id=65| f.diff(y) /// }}} {{{id=64| f.integral(x) /// }}}

 

Saját függvény írása

{{{id=204| def lnko(a,b): if b==0: return abs(a) else: return lnko(b,a%b) /// }}} {{{id=205| lnko(1111,1111111111) /// }}}

 

Halmazok

{{{id=210| Szinek = ["Treff", "Karo", "Kor", "Pikk"] Ertekek = [2, 3, 4, 5, 6, 7, 8, 9, 10, "Bubi", "Dama", "Kiraly", "Asz"] Kartyak = Set(Szinek).cartesian_product(Set(Ertekek)) #.map(tuple) /// }}} {{{id=213| Kartyak.random_element() /// }}} {{{id=212| Kartyak.cardinality() /// }}} {{{id=211| Set([Kartyak.random_element(), Kartyak.random_element()]) /// }}} {{{id=219| Kezek = Subsets(Kartyak, 5) /// }}} {{{id=218| Kezek.random_element() /// }}} {{{id=217| Kezek.cardinality() /// }}} {{{id=220| binomial(52,5) /// }}} {{{id=221| def par_e(kez): return len(set(ertek for (szin, ertek) in kez)) == 4 /// }}} {{{id=225| kez = Kezek.random_element(); kez /// }}} {{{id=223| par_e(kez) /// }}}

 

 

 

Absztrakt matematikai struktúrák kezelése

Test fölötti polinomgyűrűk

{{{id=111| n = -1.1 /// }}} {{{id=112| n.is_unit() /// }}} {{{id=113| type(n) /// }}} {{{id=1| polinomQ. = PolynomialRing(QQ) polinomR. = PolynomialRing(RR) polinomC. = PolynomialRing(CC) /// }}} {{{id=2| factor(q^4 + 2*q^2 + 2) /// }}} {{{id=7| factor(x^4 + 2*x^2 + 2) /// }}} {{{id=17| factor(z^4 + 2*z^2 + 2) /// }}} {{{id=18| factor(x^2 - 2) /// }}} {{{id=23| gcd(q^4 - 3*q^3 + 2*q^2 - q + 1, q^2 - 1) /// }}} {{{id=26| (q^4 - 3*q^3 + 2*q^2 - q + 1) // (q^2 - 1) /// }}} {{{id=28| (q^4 - 3*q^3 + 2*q^2 - q + 1) % (q^2 - 1) /// }}} {{{id=80| (q^2 - 1)*(q^2 - 3*q + 3) - 4*q + 4 /// }}} {{{id=161| p = q^4 - 3*q^3 + 2*q^2 - q + 1 /// }}} {{{id=162| p.is_irreducible() /// }}} {{{id=78| p.xgcd(q^2-1) /// }}} {{{id=79| -1/4*p + (1/4*q^2 - 3/4*q + 3/4) * (q^2 - 1) /// }}}

 

Vektorterek, mátrixok

{{{id=117| A = Matrix([[1,2,3],[3,2,1],[1,1,1]]); A /// }}} {{{id=253| A.LU() /// }}} {{{id=118| P, L, U = A.LU() /// }}} {{{id=252| P*L*U /// }}} {{{id=119| A.rank() /// }}} {{{id=120| A.nullity() /// }}} {{{id=121| A.left_kernel() # bal nulltér: xA=0 /// }}} {{{id=122| A.right_kernel() # jobb nulltér: Ax=0 /// }}} {{{id=123| A.row_space() /// }}} {{{id=127| A.echelon_form() /// }}} {{{id=128| A.column_space() /// }}} {{{id=126| B = A.transpose() B.echelon_form() /// }}} {{{id=165| B.rref() /// }}} {{{id=129| v = vector([1,1,-4]) v /// }}} {{{id=130| A, v*A, A*v /// }}} {{{id=132| w = vector([3,5,2]) /// }}} {{{id=133| A.solve_right(w) /// }}} {{{id=255| A \ w /// }}} {{{id=131| A.solve_left(w) /// }}} {{{id=136| B = A.change_ring(GF(2)) /// }}} {{{id=137| B.echelon_form() /// }}} {{{id=143| B.base_ring() /// }}}

 

 

 

Grafika

2d grafika

{{{id=150| plot(cos, (-5,5)) /// }}} {{{id=151| plot([cos,sin], (-5,5), aspect_ratio=1) /// }}} {{{id=152| parametric_plot((cos(x),sin(x)^3),(x,0,2*pi),color='red') /// }}} {{{id=153| var('x') p = plot(2*x^4-2*x^3+3*x^2-3*x+4, (x,-1,1), color = 'cyan', thickness=3) p += plot(2*x^4, (x,-1,1), color = 'magenta', thickness=3) p.show() /// }}} {{{id=154| %hide @interact(layout=[['x0'], ['eps']]) def _(x0=slider(0, 5, default=1.9, label="x0"), eps=slider(0.01, 0.6, default=0.5, label="ε")): f=sin(x) + x/2 pont = point2d((x0,f(x=x0)), rgbcolor=(0.5,0,0), size=60) p = plot(f, (0,5)) maxx = 5 d = diff(f)(x=x0) saveps = polygon2d([[x0,f(x=x0)], [maxx,f(x=x0)+(d+eps)*(maxx-x0)], [maxx,f(x=x0)+(d-eps)*(maxx-x0)]], rgbcolor=(0,1,0), alpha=0.2)+polygon2d([[x0,f(x=x0)], [0,f(x=x0)-(d+eps)*(x0)], [0,f(x=x0)-(d-eps)*(x0)]], rgbcolor=(0,1,0), alpha=0.2) delta = min(5-x0, x0) var('z') while True: try: delta = find_root(f(x=x0)+(z-x0)*(d-eps)==f(x=z), x0+0.001, x0+delta-0.001) - x0 except: break while True: try: delta = find_root(f(x=x0)+(z-x0)*(d+eps)==f(x=z), x0+0.001, x0+delta-0.001) - x0 except: break while True: try: delta = x0 - find_root(f(x=x0)+(z-x0)*(d-eps)==f(x=z), x0-delta+0.001, x0-0.001) except: break while True: try: delta = x0 - find_root(f(x=x0)+(z-x0)*(d+eps)==f(x=z), x0-delta+0.001, x0-0.001) except: break savdel = polygon2d([[x0-delta,-0.2],[x0-delta,3],[x0+delta,3],[x0+delta,-0.2]], rgbcolor=(1,0,0), alpha=0.2) # t = text('x0+delta',(x0+delta,-0.1),rgbcolor=(0,0,0)) # t2 = text('x0-delta',(x0-delta,-0.2),rgbcolor=(0,0,0)) l = line([[x0,-0.2],[x0,3]], rgbcolor=(1,0,0), alpha=0.2, thickness=2) l2 = line([[0,f(x=x0)-x0*d], [maxx,f(x=x0)+(maxx-x0)*d]], rgbcolor=(0,1,0), alpha=0.2, thickness=2) show(pont+p+saveps+savdel+l+l2, aspect_ratio=1, xmin=-0.2, ymin=-0.2, ymax=3) /// }}} {{{id=158| var('x,y') plot3d(x^2-y^2, (x,-4,4), (y,-4,4)) /// }}} {{{id=155| u, v = var('u,v') fx = cos(v) * (3 + cos(u)) fy = sin(v) * (3 + cos(u)) fz = sin(u) parametric_plot3d([fx, fy, fz], (u, 0, 2*pi), (v, 0, 2*pi), frame=False, aspect_ratio=1, color="red") /// }}} {{{id=156| /// }}}