Professional Documents
Culture Documents
Untitled
Untitled
Общ алгоритъм за „ A
1. Имаме Жордановото разлагане:
A = H J H -1
Тук H е матрицата от собствените вектори по стълбове. J е жордановата матрица, т.е. диагонална блочна матрица, с жорданови
клетки по диагонала.
2. ‰ A = H ‰ J H -1
3. Тъй като за J имаме:
J = diagHJk1 Hl1 L, ..., Jkn Hln LL, където li е i-тата собствена стойност на A, а ki е нейната кратност. Имаме и още:
‰ J = ‰diagIJk1 Hl1 L,...,Jkn Hln LM = diagI‰ Jk1 Hl1 L , ..., ‰ Jkn Hln L M
То остава да разберем как да намерим ‰ Jk HlL .
4. Всяка жорданова клетка Jk HlL е от вида:
Jk HlL = l I + N,
където N е нилпотентна, т.е. N i = 0, за някое i. Всъщност предвид общия вид на жордановите клетки, лесно е да се забележи, че
i = k.
5. Тогава матричната експонента на дадената жорданова клетка е:
‰l I+N = ‰l ‰ N
6. Тъй като ‰ N е нилпотентна, то можем да я развием в краен матричен ред. Предвид видът й, можем да конкретизираме:
‰ N = ⁄ki=0
1
Ni =
0 0 1ê2
i!
0 0 1ê2
0 1
0 1 0 0
0 ∏ 1ê2
0 1 0 0 ∏
∏ 0 1ê2
0 ∏ + + ...
∏ 1
0 0 1 0 0 0
0 0
0 1 1ê2
1k-2
Hk-1L!
1k-2 1k-1
Hk-2L! Hk-1L!
0 0 0 0 ∫ 0 ∫
1ê2
0 0 0 ∏ 0 0 1k-2
Hk-2L!
0 0 1 ∫
0 0 ∏ 0 0
+ = 0
1ê2
0 ∏ 0 0 0 0 1 ∏ ∫
∏ 0 0 0 0 0 0 ∏
0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0
1 1 1ê2 ∫
1k-2 1k-1
Hk-2L! Hk-1L!
1k-2
Hk-2L!
1 1 ∏ ∑
Т.е. ‰ Jk HlL = ‰l
1ê2
∏ ∏ ∏ ª
1 1
0 1 1
1
2 051-MatrixExp.nb
Случаите „t A
По същество сметките са същите, тъй като можем да положим A ' = t A. Въпреки това, често се смятат такива
матрици и е смислено да ги изведем.
7. Първо, нека отбележим, че за собствените числа имаме:
li HA 'L = t li HAL
8. Собствените вектори съвпадат
9. Следователно, предвид общия подход, единствената разлика от пресмятането на ‰ A е, че вместо ‰ Jk HlL ще смятаме ‰t Jk HlL . Тогава
‰t Jk HlL = ‰t Hl I+NL = ‰t l I+t N = ‰t l ‰t N .
1 1 1 tk-2 tk-1
Hk-2L! Hk-1L!
1 t1 t2 t3 ∫
1! 2! 3!
1 1 tk-2
Hk-2L!
1 t1 t2 ∏ ∑
1! 2!
∏ ∏ ∏ ∏ ª
t Jk HlL tl 1 1 1
Т.е. ‰ =‰ 1 t 1
t 2
t3
1! 2! 3!
1 1
1 t1 t2
1! 2!
1
0 1 t1
1!
1
Примери
8x8 Матрица
Разглеждаме матрицата
− 36 − 7 − 53 34 25 135 − 66 1
6 2 9 −6 −4 − 22 11 1
0 0 1 0 0 1 −1 1
− 31 − 5 − 44 29 20 111 − 55 2
In[1]:= a= ;
−2 0 −3 2 2 8 −5 1
6 1 9 −6 −4 − 21 11 0
14 3 21 − 14 − 10 − 53 27 0
− 43 − 7 − 61 39 28 154 − 76 3
Out[2]= 8
Собствени стойности
In[3]:= Eigenvalues @ a
Тъй като собствените вектори се търсят във вида l x = A x, т.е. HA - l IL x = 0, то ние ще издледваме
матриците A - l I
Нека създадем простата функцийка, връщаща матрицата HA - l IL.
l=2
Out[5]= 2
Така намерихме броят собствени вектори. Тъй като стойността е двукратна, то ще имаме единствено два
собствени вектора. (т.е. 2 - 2 = 0 присъединени)
l=1
Out[6]= 2
Тъй като стойността е трикратна и имаме два собствени вектора, то ще имаме 1 присъединен.
l=0
Out[7]= 1
Тъй като стойността е трикратна и имаме един собствен вектор, то ще имаме и 2 присъединени.
h = Eigenvectors @ a;
h êê MatrixForm
In[8]:=
h êê MatrixRank
Out[9]//MatrixForm=
0 1 1 1 1 0 0 1
−1 0 −1 0 −1 0 1 0
2 2 −1 −1 0 1 1 0
1 1 −1 −1 1 0 0 0
0 0 0 0 0 0 0 0
1 −1 −1 0 −1 0 0 1
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
Out[10]= 5
Тук си личат и нулевите собствени вектори. (т.е. тези които трябва да допълним с присъединени (Generalized
Eigenvectors на английски). Т.е. рангът на матрицата е по-малък от необходимия.
4 051-MatrixExp.nb
Присъединените вектори се дефинират по следния начин (тъй като векторите, удовлетворяващи уравнението,
ще запълват пространството):
HA - l ILk xk = 0
Ø
(1)
Бихме могли да сметнем присъединените вектори, решавайки (2). Опасността тук е, че намирането им
зависи от избора на собствените вектори. Затова в практиката се използва обратния подход: намираме
вида на собствените вектори и предвид него взимаме вектор xk , който не го удовлетворява, но
удовлетворява HA - l ILk xk = 0, където k е кратността на собствената стойност, т.е. търсим видът на
най-последния присъединен вектор от веригата. От там пресмятаме останалите присъединени, докато
стигнем до собствен, използвайки (2). Например, ако x2 не е собствен вектор, то собственият x1 , на който x2 е
присъединен, намираме по x1 = HA - l IL x2 . В този смисъл често предлаганите от Mathematica вектори са
неподходящи (т.е. не можем да им намерим присъединени) и ще трябва да ги пресметнем сами.
l=1
Търсим един присъединен.
Нека запаметим нулевия вектор с подходящата размерност в символа zero. Използвайки ConstantArray
получаваме вектор с дължина n и елементи 0.
Нека видът на търсения вектор да запеметим в x. Такова описване се налага, тъй като математика възприема
новите символи за атоми, т.е. в случая – скалари, а не вектори.
Solve::svars : Equations may not give solutions for all "solve" variables. à
::x6 → −
x3 x4 x3 x4
Out[13]= − − x5, x7 → − − − x5, x1 → − 2 x3 − x5, x2 → − 2 x3 − x5, x8 → 0>>
2 2 2 2
Нека положим x3 = x4 = 0, x5 = 1. Ще вземем първия от получения горе резултат, тъй като ще бъде върнат
двоен списък (особеност на Solve, но не лишена от смисъл) и в противен случай ще получим вектора в
неудобна за по-нататъшно ползване форма. Нека в матрицата със собствените вектори да запишем
получените. За целта трябва да си припомним, че собствените вектори са записани по редове и са подредени
Out[14]= 8− 1, − 1, 0, 0, 1, − 1, − 1, 0<
Нека от (2) да намерим собствения, на когото принадлежи. Той ще е на четвърто място (тъй като ги намираме
в обратен ред):
Тъй като получихме нулевия вектор, оказва се, че при такова заместване сме получили собствения вектор, а
не присъединения. Нека да пробваме да заместим с други стойности, например x3 = 2, x4 = 0, x5 = 1
Out[16]= 8− 5, − 5, 2, 0, 1, − 2, − 2, 0<
In[18]:= b@1D.%
l=0
Трябва да намерим два присъединени. Тук вдигаме матрицата A - l I на трета степен, тъй като ще
генерираме верига от три вектора (един собствен и два присъединени).
Solve::svars : Equations may not give solutions for all "solve" variables. à
Out[19]= 88x1 → − x7 + x8, x2 → x5 − 2 x7, x3 → x5 − x7, x4 → x5 − x7 + x8, x6 → 0<<
Out[20]= 8− 1, − 1, 0, 0, 1, 0, 1, 0<
Out[22]= 8− 1, 1, 1, 0, 1, 0, 0, − 1<
6 051-MatrixExp.nb
h êê MatrixForm
h êê MatrixRank
In[23]:=
Out[23]//MatrixForm=
0 1 1 1 1 0 0 1
−1 0 −1 0 −1 0 1 0
2 2 −1 −1 0 1 1 0
1 1 0 0 −1 1 1 0
−5 −5 2 0 1 −2 −2 0
−1 1 1 0 1 0 0 −1
2 −1 −1 1 −1 0 0 2
−1 −1 0 0 1 0 1 0
Out[24]= 8
Жорданова матрица
h = Transpose @ h;
h êê MatrixForm
In[25]:=
Out[26]//MatrixForm=
0 −1 2 1 −5 −1 2 −1
1 0 2 1 −5 1 −1 −1
1 −1 −1 0 2 1 −1 0
1 0 −1 0 0 0 1 0
1 −1 0 −1 1 1 −1 1
0 0 1 1 −2 0 0 0
0 1 1 1 −2 0 0 1
1 0 0 0 0 −1 2 0
Тук със горните индекси сме отбелязали номера във веригата вектори (там където има и присъединени).
Липсата на горен индекс означава, че векторът участва във верига от само един вектор (себе си), т.е. е
собствен без да има присъединени. Долните индекси бележат първо собствената стойност, а второ номера на
веригата.
С други думи за l = 2 имаме две вериги от по един собстевен вектор; за l = 1 имаме две вериги: първата от
един собствен вектор, а втората: собствен и присъединен; за l = 0 имаме само една верига от три вектора:
един собствен и два присъединени.
Жордановата матрица ще получим като разглеждаме блок-матрица с елементи по диагонала: жорданови
клетки. На всяка верига вектори съответства жорданова клетка от размерност броя вектори във веригата.
Жордановата клетка дефинираме така:
l 1 0 0
> n
0 ∏ ∏ 0
0 ∏ l 1
Jl,n =
0 0 0 l
ß
n
051-MatrixExp.nb 7
Т.е. изцяло нули с изключения на главния диагонал, където са само l и над-главния – само единици.
Например жордановата клетка за веригата x10,1 x20,1 x30,1 (която беше за l = 0) има вида:
0 1 0
In[27]:= 0 0 1
0 0 0
Сега ще създадем жордановата матрица. За целта нека първо си създадем една „празна“ матрица от
съответната размерност:
Out[29]//MatrixForm=
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
Сега имаме нетривиална жорданова клетка. Образуваме я като запълваме главния диагонал с l и над-главния
с 1:
Out[35]//MatrixForm=
2 0 0 0 0 0 0 0
0 2 0 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 0 1 1 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
8 051-MatrixExp.nb
Out[37]//MatrixForm=
2 0 0 0 0 0 0 0
0 2 0 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 0 1 1 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0
Дали получихме правилно жордановата форма? Нека проверим дали ще получим отново a:
Out[39]= True
Експонентата
Главната цел беше да сметнем ескпонентата ‰t a . В началото обяснихме, че за видът на ‰t Jk HlL имаме:
Hk-2L! Hk-1L!
1k-2 1k-1
1 1 1ê2 ∫
Hk-2L!
1k-2
1 1 ∏ ∑
‰ Jk HlL = ‰l ∏ ∏ ∏ ª
1 1 1ê 2
0 1 1
1
Нека тогава дефинираме функция, която задава тази матрица, за дадено l и k:
Тогава за да сметнем ‰t a остава да построим жорданова матрица с клетки от вида на jexp и да умножим
отляво и отдясно, съответно с матрицата на прехода и обратната й. Ще я построим по начина, по който
построихме и „оригиналната“ жорданова матрица, но ще ползваме функцията jexp, за да построим
жордановите клетки:
Out[43]//MatrixForm=
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
Забележете, че дори за променяне на единични стойности по матрицата jx ползвахме span оператора (;;), тъй
като jexp връща матрица, а не число.
Out[49]//MatrixForm=
2t 0 0 0 0 0 0 0
2t
0 0 0 0 0 0 0
t
0 0 0 0 0 0 0
0 0 0 t t t 0 0 0
0 0 0 0 t 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
Out[51]//MatrixForm=
2t 0 0 0 0 0 0 0
0 2t 0 0 0 0 0 0
0 0 t 0 0 0 0 0
0 0 0 t t t 0 0 0
0 0 0 0 t 0 0 0
t2
0 0 0 0 0 1 t
2
0 0 0 0 0 0 1 t
0 0 0 0 0 0 0 1
h.jx.Inverse @ h êê MatrixForm
MatrixExp@t aD êê Reduce
In[52]:=
h.jx.Inverse @ h
+ 19 H2 − tL + 6 I− 5 tM − 4 J− 1 + 2 t − N −4 − + 3 H2 − tL − 2 t +
Out[52]//MatrixForm=
t2
− 30 + 23 t −4 2t t + t t − 2t t t
+ 19 H− 1 + tL + 6 I− 5 tM − 4 J− 1 − t + N + 3 H− 1 + tL + t +
2
t2
30 + 23 t −8 2t t + t 6− t − 2t t t
+ 19 H− 1 + tL − 4 J− t + N + 3 H− 1 + tL + t −
2
t2 t2
30 + t − 12 2t 5−2 2t
2 2
19 − 11 t −8 2t −4t 3−2 t − 2t −t
+ 19 H− 1 + tL + 6 I tM − 4 J1 − t + N + 3 H− 1 + tL + t −
t2
30 − t − 12 2t t − t 4+ t −2 2t t t
+ 6 I− 2
2
t t + t t
+ 6 I− 2
12 tM t
− 4 + 12 t +4 2t t + t tM −1 + 2t + t t
+ 19 H2 − tL − 4 J2 t − N + 3 H2 − tL − 2 t +
t2 t2
− 30 − 8 2t −5 − 2t
2 2
Out[53]= True