Tomáš Kalvoda, KAM FIT ČVUT, 2019
V souboru gauss.sage
jsme implementovali základní verzi Gaussovy eliminace, tak jak je popsaná v textu BI-LIN (vlastní štěstí s psaním kódu můžete zkusit se souborem gauss_fixme.sage
).
Sage umí samozřejmě také "Gaussovsky eliminovat".
Slouží k tomu metoda echelon_form
na objektu typu matice.
Tato metoda na matici provede Gaussovu eliminaci malinko důkladněji:
# načteme kód
load('gauss.sage')
Gaussova eliminace pro soustavu z Příkladu 1.8 s následující rozšířenou maticí s prvky z :
m = matrix(GF(2),[
[1, 0, 1, 0, 0, 1],
[1, 1, 0, 1, 1, 1],
[0, 0, 1, 1, 0, 1],
[0, 1, 0, 1, 0, 1],
[0, 1, 0, 0, 1, 1]
])
show(m)
Necháme si vypsat jednotlivé kroky (druhý parametr True
).
Všimněte si, že výpočty se provádějí v .
gauss(m, True)
[1 0 1 0 0 1] [1 1 0 1 1 1] [0 0 1 1 0 1] [0 1 0 1 0 1] [0 1 0 0 1 1] ==== [1 0 1 0 0 1] [0 1 1 1 1 0] [0 0 1 1 0 1] [0 1 0 1 0 1] [0 1 0 0 1 1] ==== [1 0 1 0 0 1] [0 1 1 1 1 0] [0 0 1 1 0 1] [0 0 1 0 1 1] [0 0 1 1 0 1] ==== [1 0 1 0 0 1] [0 1 1 1 1 0] [0 0 1 1 0 1] [0 0 0 1 1 0] [0 0 0 0 0 0] ==== [1 0 1 0 0 1] [0 1 1 1 1 0] [0 0 1 1 0 1] [0 0 0 1 1 0] [0 0 0 0 0 0] ==== [1 0 1 0 0 1] [0 1 1 1 1 0] [0 0 1 1 0 1] [0 0 0 1 1 0] [0 0 0 0 0 0] ====
[1 0 1 0 0 1] [0 1 1 1 1 0] [0 0 1 1 0 1] [0 0 0 1 1 0] [0 0 0 0 0 0]
Porovnejme tento výsledek s výsledkem metody echelon_form
.
m.echelon_form()
[1 0 0 0 1 0] [0 1 0 0 1 1] [0 0 1 0 1 1] [0 0 0 1 1 0] [0 0 0 0 0 0]
Matice v zadání má prvky z , ale i v , tj. při výpočtu si vystačíme s tělesem racionálních čísel.
m = matrix(QQ, [
[-1, 1, 1, 1, 1],
[ 1, -1, 1, 1, 1],
[ 1, 1, -1, 1, 1],
[ 1, 1, 1, -1, 1],
[ 1, 1, 1, 1, -1],
])
show(m)
gauss(m, True)
[-1 1 1 1 1] [ 1 -1 1 1 1] [ 1 1 -1 1 1] [ 1 1 1 -1 1] [ 1 1 1 1 -1] ==== [-1 1 1 1 1] [ 0 0 2 2 2] [ 0 2 0 2 2] [ 0 2 2 0 2] [ 0 2 2 2 0] ==== [-1 1 1 1 1] [ 0 2 0 2 2] [ 0 0 2 2 2] [ 0 0 2 -2 0] [ 0 0 2 0 -2] ==== [-1 1 1 1 1] [ 0 2 0 2 2] [ 0 0 2 2 2] [ 0 0 0 -4 -2] [ 0 0 0 -2 -4] ==== [-1 1 1 1 1] [ 0 2 0 2 2] [ 0 0 2 2 2] [ 0 0 0 -4 -2] [ 0 0 0 0 -3] ====
[-1 1 1 1 1] [ 0 2 0 2 2] [ 0 0 2 2 2] [ 0 0 0 -4 -2] [ 0 0 0 0 -3]
m.echelon_form()
[1 0 0 0 0] [0 1 0 0 0] [0 0 1 0 0] [0 0 0 1 0] [0 0 0 0 1]
Eliminace s komplexními čísly.
m = matrix(SR, [
[I, 2, 0],
[1, 2+I, 3-3*I],
[1+I, 0, 7]
])
show(m)
gauss(m, True)
[ I 2 0] [ 1 I + 2 -3*I + 3] [ I + 1 0 7] ==== [ I 2 0] [ 0 3*I + 2 -3*I + 3] [ 0 2*I - 2 7] ==== [ I 2 0] [ 0 3*I + 2 -3*I + 3] [ 0 0 -24/13*I + 55/13] ====
[ I 2 0] [ 0 3*I + 2 -3*I + 3] [ 0 0 -24/13*I + 55/13]
m.echelon_form()
[1 0 0] [0 1 0] [0 0 1]
eps = 1/10000000
A = matrix(QQ, [
[1+eps, 1, 1],
[1, 1-eps, 1]
])
B = matrix(RR, [
[1+eps, 1, 1],
[1, 1-eps, 1]
])
Nejprve počítejme s první maticí.
Aout = gauss(A)
show(Aout)
Čili řešení v tomto případě existuje právě jedno a jeho složky jsou:
y = Aout[1,2] / Aout[1,1]
x = (Aout[0,2] - Aout[0,1] * y) / Aout[0,0]
sA = (x,y)
show(sA)
Nyní stejný proces s druhou maticí.
Bout = gauss(B)
show(Bout)
y = Bout[1,2] / Bout[1,1]
x = (Bout[0,2] - Bout[0,1] * y) / Bout[0,0]
sB = (x,y)
show(sB)
Absolutní hodnota rozdílů složek skutečného řešení (první postup) a "přibližného řešení" (druhý postup) je obrovská:
print(abs(sA[0] - sB[0]))
print(abs(sA[1] - sB[1]))
120447.583460858 120447.595505618