複數 $i$ 直接打指令i
就是了,剩下的就是直觀照打。
a = 2 + 3*i
b = 5 + i
4*a - 2*b
輸出結果
a = 2 + 3i
b = 5 + 1i
ans = -2 + 10i
找複數的conjugate,只要用到conj
即可。
a = 3 + 5*i
conj(a)
可以得到答案
a = 3 + 5i
ans = 3 - 5i
其實在程式裡,複數的除法跟實數的除法沒有區別。
不過注意一下,由於$\displaystyle \frac{1}{z}=\frac{\bar{z}}{|z|^2}$,在這個部分的計算結果大部分都是分數。
所以稍微介紹一下輸出格式,記得在第一章的介紹裡曾提過,我們可以利用格式這個指令format
來更改小數點後面的長度設定。
所以當格式選項為分數(rational number)時,使用format rat
,octave會輸出分數。
特別特別要注意一件事:當格式選項為分數時,輸出值會是最接近的有理數,所以就算你問octave,$\sqrt{2}$的值,也會得到分數。
若是格式選項為『最多只顯示小數點後四位的小數表示』,使用format short
。
sqrt(2)
format rat
sqrt(2)
輸出結果
ans = 1.4142
ans = 8119/5741
1 / ( 3 + 5*i )
format rat
1 / ( 3 + 5*i )
輸出結果
ans = 0.088235 - 0.147059i
ans = 3/34 - 5/34i
找複數的長度,可以使用abs()
,或norm()
。
a = 3 + 5*i
abs(a)
norm(a)
可以得到答案
a = 3 + 5i
ans = 3.6056
ans = 3.6056
找複數的角度,可以使用arg()
,或angle()
。
注意這邊得到的角度單位是徑度量,若是希望得到度度量的話,可以使用rad2deg()
a = -1 + sqrt(3)*i
arg(a)
rad2deg(arg(a))
可以得到答案
a = -1.0000 + 1.7321i
ans = 2.0944
ans = 120.00
以使用octave做計算來說,你會發現一點差異都沒有,一樣是使用dot(u, v)
。
v=[ 1 - i , 2 ]
u=[ 2 , 3 ]
dot( u , v )
dot( v , u )
就可以得到:
v =
1 - 1i 2 + 0i
u =
2 3
ans = 8 - 2i
ans = 8 + 2i
Conjugate Transpose 其實是兩個步驟的事,正確的做法是結合 conj()
和 transpose()
。
不過我們也可以利用一個符號來表示這兩個指令的結合'
。
v=[ 1 - i , 2 ]
conj(v)
transpose(v)
就可以得到:
v =
1 - 1i 2 + 0i
ans =
1 + 1i 2 - 0i
ans =
1 - 1i
2 + 0i
兩者結合後:
v=[ 1 - i , 2]
conj(transpose(v))
v'
兩者均可得到:
v =
1 - 1i 2 + 0i
ans =
1 + 1i
2 - 0i
ans =
1 + 1i
2 - 0i
以使用octave做計算來說,你會發現如果是可以unitarily diagonalizable的矩陣,以前的[ U , D ] = eig( A )
直接就是答案了。
A=[1, 2-2*i, 0; 2+2*i, -1,0; 0, 0, 3]
[ U , D ] = eig( A )
就可以得到:
A =
1 + 0i 2 - 2i 0 + 0i
2 + 2i -1 + 0i 0 + 0i
0 + 0i 0 + 0i 3 + 0i
U =
-0.4082 + 0.4082i 0.5774 - 0.5774i 0 + 0i
0.8165 + 0i 0.5774 + 0i 0 + 0i
0 + 0i 0 + 0i 1.0000 + 0i
D =
Diagonal Matrix
-3 0 0
0 3 0
0 0 3
我們可以檢查一下
U' * U
確實可以得到 identity matrix:
ans =
1.0000 + 0i 0.0000 + 0.0000i 0 + 0i
0.0000 - 0.0000i 1.0000 + 0i 0 + 0i
0 - 0i 0 - 0i 1.0000 + 0i
當然我們依然可以使用精確的符號形式,但是得到的答案U不會直接是unitary matrix,自己要再轉換一下。
A=sym([1, 2-2*i, 0; 2+2*i, -1,0; 0, 0, 3])
[ C , D ] = eig( A )
A = (sym 3×3 matrix)
⎡ 1 2 - 2⋅ⅈ 0⎤
⎢ ⎥
⎢2 + 2⋅ⅈ -1 0⎥
⎢ ⎥
⎣ 0 0 3⎦
C = (sym 3×3 matrix)
⎡ 1 ⅈ ⎤
⎢- ─ + ─ 1 - ⅈ 0⎥
⎢ 2 2 ⎥
⎢ ⎥
⎢ 1 1 0⎥
⎢ ⎥
⎣ 0 0 1⎦
D = (sym 3×3 matrix)
⎡-3 0 0⎤
⎢ ⎥
⎢0 3 0⎥
⎢ ⎥
⎣0 0 3⎦
再來把C做成unitary matrix的形式。p.s.simplify()
只是把U寫成比較漂亮的形式而已,對於答案沒有影響。
U = C;
U(:,1) = C(:,1) / norm( C(:,1) );
U(:,2) = C(:,2) / norm( C(:,2) );
U(:,3) = C(:,3) / norm( C(:,3) );
U = simplify( U )
U = (sym 3×3 matrix)
⎡√6⋅(-1 + ⅈ) √3⋅(1 - ⅈ) ⎤
⎢─────────── ────────── 0⎥
⎢ 6 3 ⎥
⎢ ⎥
⎢ √6 √3 ⎥
⎢ ── ── 0⎥
⎢ 3 3 ⎥
⎢ ⎥
⎣ 0 0 1⎦
在計算矩陣A的Jordan canonical form時。由於此形式對於數值誤差很敏感,建議將數值輸入轉換為精確的符號形式。然後使用[V, J] = jordan (A)
。
我們以課本的example 6為例。
A = sym([2 5 0 0 1;0 2 0 0 0;0 0 -1 0 0;0 0 0 -1 0;0 0 0 0 -1])
[V, J] = jordan(A)
就可以得到:
A = (sym 5×5 matrix)
⎡2 5 0 0 1 ⎤
⎢ ⎥
⎢0 2 0 0 0 ⎥
⎢ ⎥
⎢0 0 -1 0 0 ⎥
⎢ ⎥
⎢0 0 0 -1 0 ⎥
⎢ ⎥
⎣0 0 0 0 -1⎦
V = (sym 5×5 matrix)
⎡0 0 -1/3 5 0⎤
⎢ ⎥
⎢0 0 0 0 1⎥
⎢ ⎥
⎢1 0 0 0 0⎥
⎢ ⎥
⎢0 1 0 0 0⎥
⎢ ⎥
⎣0 0 1 0 0⎦
J = (sym 5×5 matrix)
⎡-1 0 0 0 0⎤
⎢ ⎥
⎢0 -1 0 0 0⎥
⎢ ⎥
⎢0 0 -1 0 0⎥
⎢ ⎥
⎢0 0 0 2 1⎥
⎢ ⎥
⎣0 0 0 0 2⎦