Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download
Views: 4454

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}