封存 Archive
封存 Archive
計算數學入門系列 - 一些關於複數不等式的解
- 取得連結
- X
- 電子郵件
- 其他應用程式
這個學期教授一門新的課程,其中有一個課題是討論一些微分方程數值解的絕對穩定性。 裏面牽涉到一些關於複數 (Complex Number)的不等式。 在這篇文章裏面介紹一些解決這些不等式的數值方法。
最簡單的例子,我們考慮 \( \left|1+z\right|\le1 \)。如果變數 z 是一個實數 (Real Number),這條不等式的答案相對比較簡單,在一般中學的課程裏面都應該已經提及過。經過一些運算,我們就可以得到 \( -2\le z\le0 \)。 如果 \( z \) 是複數, 我們就需要對複數有多一點的認識。首先我們需要去理解一下絕對值在複數的定義。其中一個方法我們可以將絕對值理解成一個複數的量或者是長度, 譬如說,\(\left|-i\right|=1\)。所以根據上面這個定義,我們就可以得到 \( \left|1+z\right|=\left|z-\left(-1\right)\right| \)就是在找一個複數 \(z \)和 -1 之間的距離。上面那條不等式,就是說要去找所有跟 -1 之間的距離就少於或等於1 的複數。 在複數平面上面,我們就可以找到一個中心在-1而且半徑為1的圓盤(Disk)。另外一個方法,我們可以把一個複數首先寫成 \( z=a+ib\) 。這樣子,不等式就變成 \( \left|1+a+ib\right|=\sqrt{\left(1+a\right)^2+b^2}\le1\),然後我們就可以找到一個中心在-1的圓盤的數學表示方式 \( \left(1+a\right)^2+b^2\le1\)。 而當 \(b=0\),我們就可以得到之前所提到的實數解 \( -2\le z\le0 \)。
上面的這個例子其實是一個一般情況的其中一個特別解。我們假設
\[ f_n\left(z\right)=1+z+\frac{z^2}{2}+\cdots+\frac{z^n}{n!} \]
為一個n項的泰勒級數(Taylor’s Expansion)。然後我們就需要找出所有滿足\( \left|f_n\left(z\right)\right|\le1\)的複數。剛剛討論的情況,就只是當\(n\)等於1時的情況。如果 z 是一個實數,我們需要解決的相關不等式,就只是一個找根 (Root Finding)的問題。 如果n等於2,我們就可以用一元二次方程式的解去把這個絕對穩定性的區域找出。可是,如果這個變數 \( z\) 是一個複數,問題就沒有那麼簡單。同學們可以嘗試用上面提到的兩個方法去看看可不可以找出這個\(n\)等於2 時的絕對穩定性區域。可以跟同學講,由於自己非常懶惰 ( ! ), 花了一丁點時間想了一下,就已經想放棄了。而且我們也會希望看一下一些更大數值的 \(n\) 時候的情況。 就算你有方法找出\(n\)等於2的答案,其他的情況也只會越來越複雜。
要解決這個問題, 我們首先希望找出這個區域的邊界。當我們把整個複數平面分成兩部份,其中一個部份,裏面的複數將會滿足不等式的要求,而這個區域以外的地方,複數就不會滿足我們所考慮的不等式。所以,這個解決不等式的問題就變成了一個介面問題,我們需要找出這個介面的位置。如果同學們有看過我以往的討論,就會知道介面表示方式起碼有兩個。所以下面我們就會看着這兩個不同的表示方式,討論兩個不同的方法去解決這個不等式問題。
第一個表示方式,是我們所講的顯性方式(Explicit Representation)或者是Lagrangian 方式。意思就是說我們在這個邊界上面放一些點,也就是一個邊界的Parameterization。數學上來說,我們希望找出一條曲線,而他有一個表示方式為 \( \mathbf{x}\left(\theta\right)\)。當我們將那個 \theta 做一個離散化,我們就可以找出一個邊界的數值表示方式 \( \mathbf{x}_j=\mathbf{x}\left(\theta_j\right)\)。要找出這些點的位置,我們就必須要就着每一個 \theta_i 去解決一個找根的問題。假設我們希望找出這個邊界跟\( \theta=\theta_j \)的相交點,我們就將複數寫成 \(z=rexp{\left(i\theta\right)}\),然後,就着每一個已知的 \( \theta=\theta_j\),我們需要找出下面方程關於r 的解
\[ \left|1+r \exp{\left(i\theta_j\right)}+\frac{r^2}{2} \exp{\left(2i\theta_j\right)}+\cdots+\frac{r^n}{n!} \exp{\left(ni\theta_j\right)}\right|=1 。\]
這個方法的難處,就是對於每一個角度,我們有可能會找到多於一個的答案,也有可能方程式並沒有解。所以,我們就很難做到一個連續的表示方式。編寫程式時所要考慮的情況也可能比較多。
關於邊界問題,我們其實有另外一個聽起來好像比較複雜的表示,就是一個隱性 (Implicit)的或者是Eulerian 的方法。 做法是,我們首先離散化整個複數平面,先用 \( z_{j,k}=a_j+ib_k \) 代表着複數平面的一些點。然後我們根據函數 \( f_n\left(z_{j,k}\right)=f_n\left(a_j,b_k\right)\) 的定義,找出 \( \left|f_n\left(a_j,b_k\right)\right| \)實數值。 最後我們只需要找出這個函數 等於1的水平值,這樣就得出了我們所需要的絕對穩定區的邊界了。下面是一個簡單的MATLAB程式,有興趣的同學可以用他在MATLAB或者Octave上面玩一下。
degree=4;
x=[-5:0.1:5];
[x,y]=meshgrid(x,x);
z=x+1i*y;
f=1;
for i=1:degree
f=f+z.^i/factorial(i);
end
f=abs(f);
[c,~]=contour(x,y,f,[1 1]);
fill(c(1,2:c(2,1)),c(2,2:c(2,1)),'k')
alpha(0.5); axis equal; grid on; axis([-5 5 -5 5])
- 取得連結
- X
- 電子郵件
- 其他應用程式
留言
發佈留言