# Kaip papildyti vektorių sistemą iki erdvės bazės? def papildom_poerdviai(W, V): """ Gražina tiesinės erdvės V poerdvio W papildinio iki V bazę. Kitaip sakant, randa tokį poerdvį U, kad V yra W ir U tiesioginė suma ir gražina jo bazę. """ Q, pi, lift = V.quotient_abstract(W) Basis = [lift(v) for v in Q.basis()] return Basis # pi yra projekcijos atvaizdis iš erdvės V į faktorerdvę V/W: pi(v) = v + W. # lift yra "atvirkštinis" atvaizdis iš faktorerdvės Q = V/W į erdvę V, tenkinantis # lygybę pi(lift(u)) = u su visais u iš Q. def papildom(vec, V): """ Tiesinės erdvės V vektorių šeimą vec papildo vektoriais v1,..., vn iki erdvės V bazės ir gražina papildytus vektorius v1,..., vn. """ return papildom_poerdviai(V.span(vec), V)
# 2 pavyzdys. Rasime matricos A = matrix(QQ, 4, 4, [[1, 1, -2, 0], [2, 1, 0, 2], [1, 0, 1, 1], [0,-1,2,1]]) show(A)
1210110−1−20120211
# Žodano formą ir atitinkamą bazę.
# Randame matricos charakteristinį polinomą: p = A.charpoly(var = 't') show(p) show(p.factor())
t4−4t3+6t2−4t+1
(t−1)4
# Nagrinėjame matricą B := A-1*E. Ieškome mažiausoi p: rg(B^p)=4-4=0: B = A - 1*matrix.identity(4) show(B)
0210100−1−20020210
# Matricos B laipsnių rangai: B.rank() (B**2).rank()
2
0
# Taigi, p=2. Matricos B branduolys ker B ir jo dimensija: L1 = B.left_kernel() L1.dimension()
2
# Matricos B^2 branduolys ker B^2 ir jo dimensija: L2 = (B**2).left_kernel() L2.dimension()
4
# Poerdvio L1 bazę pildant iki erdvės L2 bazės, reikia pridėti 2 vektorius v11 ir v12: L = papildom(L1.basis(), L2) v11 = L[0] v12 = L[1] v11 v12
(1, 0, 0, 0)
(0, 1, 0, 0)
# Suskaičiuojame vektorius v11B ir v12B: v11*B v12*B
(0, 1, -2, 0)
(2, 0, 0, 2)
# Taigi radome Žordano bazę v11,v11B,v21,v22. # Perėjimo matrica (iš standartinės bazės į Žordano bazę): T = matrix(QQ,4,4,[v11,v11*B,v12,v12*B]) show(T)
100201100−2000002
# Pradinės matricos Žordano matrica: show(T*A*(T^(-1)))
1000110000100011