Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
5136 views

Symbolisk manipulation

Det är möjligt att hantera uttryck symboliskt. Vi inleder med att sätta två logiska variabler till sanna för att underlätta presentationen.
implicit_multiplication(True) # tolka bl.a. mellanslag som multipikation typeset_mode(True) # typsatt utdata
Med funktionen var definierar man vad Sage ska betraktas som symboler.
a, b, c, x = var('a b c x') type(a)
<type 'sage.symbolic.expression.Expression'>
Med typeset_mode satt till sant får vi en lättläst typsatt utdata.
alpha1 = var('alpha1') alpha1
α1\displaystyle \alpha_{1}

Ekvationer

Funktionen solve löser algebraiska ekvationer, d.v.s. en ekvation på formen p(x1,x2,,xn)=0p(x_1, x_2, \ldots, x_n) = 0 där pp är ett polynom. Indata är en ekvation eller en lista av ekvationer samt en lista över de obekanta.
solve(a x + b == 0, x)
[x=ba\displaystyle x = -\frac{b}{a}]
Låt oss lösa andragragsekvationen ax2+bx+c=0ax^2 + bx + c = 0 och spara lösningarna i en variabel.
lsn_abc = solve(a x^2 + b x + c == 0, x) lsn_abc
[x=b+b24ac2a\displaystyle x = -\frac{b + \sqrt{b^{2} - 4 \, a c}}{2 \, a}, x=bb24ac2a\displaystyle x = -\frac{b - \sqrt{b^{2} - 4 \, a c}}{2 \, a}]
Insättning i ett uttryck görs med subs. Vi vill kanske veta hur lösningen ser ut då a=1a = 1 och b=5b = 5 och c=3c = -3. Vi kan plocka ut en lösning i taget och sätta in eller t.ex. använda funktionen map.
lsn_abc[0].subs(a = 1, b = 5, c = -3)
x=123752\displaystyle x = -\frac{1}{2} \, \sqrt{37} - \frac{5}{2}
lsn = map(lambda L : L.subs(a = 1, b = 5, c = -3), lsn_abc) lsn
[x=123752\displaystyle x = -\frac{1}{2} \, \sqrt{37} - \frac{5}{2}, x=123752\displaystyle x = \frac{1}{2} \, \sqrt{37} - \frac{5}{2}]
Vi kan spara symboliska uttryck i en variabel och därefter sätta in värden eller symboler, som t.ex. en lösning.
U = (x - 2)/(x^2 + x) U
x2x2+x\displaystyle \frac{x - 2}{x^{2} + x}
Vad är utrycket UU lika med då man sätter in den första lösningen till x2+5x3=0x^2 + 5x - 3 = 0?
U.subs(lsn[0])
2(37+9)(37+5)223710\displaystyle -\frac{2 \, {\left(\sqrt{37} + 9\right)}}{{\left(\sqrt{37} + 5\right)}^{2} - 2 \, \sqrt{37} - 10}
En lösning kan innehålla en parameter. Med andra ord, har ekvationen i sådana fall oändligt många lösningar.
y = var('y') lsn = solve(x^2 + 2y == 1, [x, y]) lsn
[[x=r1\displaystyle x = r_{1}, y=12r12+12\displaystyle y = -\frac{1}{2} \, r_{1}^{2} + \frac{1}{2}]]
Från ovanstående exempel ser vi att ekvationen x2+2y=1x^2 + 2y = 1 har oändligt många lösningar som bestäms av parametern r1r_1.
Man kan även lagra en ekvation eller olikhet i en variabel.
ekvation = x^2 + 2x == alpha1 x^2 + 5 ekvation
x2+2x=α1x2+5\displaystyle x^{2} + 2 \, x = \alpha_{1} x^{2} + 5
olikhet = 4 - x < 3x^2 + 2x olikhet
x+4<3x2+2x\displaystyle -x + 4 < 3 \, x^{2} + 2 \, x
Funktionen solve kan också användas för att lösa olikheter.
solve(olikhet, x)
[[x<165712\displaystyle x < -\frac{1}{6} \, \sqrt{57} - \frac{1}{2}], [x>165712\displaystyle x > \frac{1}{6} \, \sqrt{57} - \frac{1}{2}]]
Att multiplicera en olikhet med ett negativt tal vänder på olikheten.
(-1) * olikhet
x4<3x22x\displaystyle x - 4 < -3 \, x^{2} - 2 \, x
Funktionerna left och right returnerar vänster- respektive högerled av en ekvation eller olikhet.
olikhet.left()
x+4\displaystyle -x + 4
ekvation.right()
α1x2+5\displaystyle \alpha_{1} x^{2} + 5
Att addera xx till båda led i olikheten görs på följande sätt.
olikhet + (x == x)
4<3x2+3x\displaystyle 4 < 3 \, x^{2} + 3 \, x

Förenklingar

Enkla omskrivningar av uttryck sker automatiskt.
y + x + x + y + y + 5 y + x
2x+8y\displaystyle 2 \, x + 8 \, y
Ibland måste man dock ''tvinga'' Sage att förenkla ett utryck.
U = (x^2 - x - 2)/(x + 1) U
x2x2x+1\displaystyle \frac{x^{2} - x - 2}{x + 1}
U.simplify_full() # vi kan nämligen förkorta bort nämnaren
x2\displaystyle x - 2
I föregående exempel räcker inte funktionen simplify till för att förenkla uttrycket UU.

Utveckling och faktorisering

Att utveckla produkter av parenteser och faktorisera uttryck görs med expand respektive factor.
expand((x + 2)^5 (x - 3)^2)
x7+4x611x570x440x3+272x2+528x+288\displaystyle x^{7} + 4 \, x^{6} - 11 \, x^{5} - 70 \, x^{4} - 40 \, x^{3} + 272 \, x^{2} + 528 \, x + 288
factor(x^6 + 14x^5 + 65x^4 + 120x^3 + 40x^2 - 128x - 112)
(x+7)(x+2)4(x1)\displaystyle {\left(x + 7\right)} {\left(x + 2\right)}^{4} {\left(x - 1\right)}

Polynom

Ett centralt begrepp i algebran är polynom.
f = x^5 - 8x^4 - 5x^3 + 80x^2 + 44x - 112 f
x58x45x3+80x2+44x112\displaystyle x^{5} - 8 \, x^{4} - 5 \, x^{3} + 80 \, x^{2} + 44 \, x - 112
g = x^4 - 9x^3 + 27x^2 - 31x + 12 g
x49x3+27x231x+12\displaystyle x^{4} - 9 \, x^{3} + 27 \, x^{2} - 31 \, x + 12
Ett polynoms grad.
f.degree(x)
5\displaystyle 5
Största gemensamma delare till två polynom fås med gcd.
gcd(f, g)
x25x+4\displaystyle x^{2} - 5 \, x + 4
Kvot q(x)q(x) och rest r(x)r(x) vid polynomdivisionen f(x)/g(x)f(x)/g(x). Notera att vi här utnyttjar programvaran Maxima. Vi kommer längre fram studera enklare metoder för att finna kvot och rest.
q, r = f._maxima_().divide(g).sage() q # kvot
x+1\displaystyle x + 1
r # rest
23x3+84x2+63x124\displaystyle -23 \, x^{3} + 84 \, x^{2} + 63 \, x - 124
bool(f == g q + r) # kontrollera om f(x) = g(x)q(x) + r(x)
True\displaystyle \mathrm{True}
Vi kan plocka ut enskilda koefficienter eller en lista över samtliga koefficienter i ett polynom.
p.coefficient(x^2)
80\displaystyle 80
q.coefficients() # det andra elementet i varje dellista avser exponenten
[[12\displaystyle 12, 0\displaystyle 0], [31\displaystyle -31, 1\displaystyle 1], [27\displaystyle 27, 2\displaystyle 2], [9\displaystyle -9, 3\displaystyle 3], [1\displaystyle 1, 4\displaystyle 4]]
q.coefficients(sparse = False) # skippa exponenterna
[12\displaystyle 12, 31\displaystyle -31, 27\displaystyle 27, 9\displaystyle -9, 1\displaystyle 1]

Rationella uttryck

Det är möjligt att partialbråksuppdela ett rationellt uttryck samt plocka ut motsvarande täljare och nämnare.
ru = (x^5 - x^3 + 7x^2 - 3x + 1)/(x^3 + 3x^2 -4) ru
x5x3+7x23x+1x3+3x24\displaystyle \frac{x^{5} - x^{3} + 7 \, x^{2} - 3 \, x + 1}{x^{3} + 3 \, x^{2} - 4}
ru.partial_fraction() # partialbråksuppdelning
x23x1229(x+2)+59(x1)113(x+2)2+8\displaystyle x^{2} - 3 \, x - \frac{122}{9 \, {\left(x + 2\right)}} + \frac{5}{9 \, {\left(x - 1\right)}} - \frac{11}{3 \, {\left(x + 2\right)}^{2}} + 8
ru.numerator() # täljare
x5x3+x23x+1\displaystyle x^{5} - x^{3} + x^{2} - 3 \, x + 1
ru.denominator() # nämnare
x3+3x24\displaystyle x^{3} + 3 \, x^{2} - 4

Konvertera till LaTeX

Funktionen latex returnerar LaTeX-koden för ett symbliskt utryck.
latex(ru)
\frac{x^{5} - x^{3} + 7 \, x^{2} - 3 \, x + 1}{x^{3} + 3 \, x^{2} - 4}
latex(lsn_abc[1])
x = -\frac{b - \sqrt{b^{2} - 4 \, a c}}{2 \, a}