目錄

20200718 想法源起 20200719 我們在做什麼(一) 20200722 我們在做什麼(二) 20200725 竟然成為數學家(一) 20200729 竟然成為數學家(二) 20200801 竟然成為數學家(三) 20200805 不同職級(一) 20200808 不同職級(二) 20200812 趕客系列(一)為什麼讀大學? 20200815 趕客系列(二)不同大學學位跟工作的關係 20200819 趕客系列(三)大學的目的 20200822 趕客系列(四)大學為什麼要有主修 20200826 趕客系列(五)要挑選一個什麼樣的主修 20200829 沒有無緣無故的恨(一) 20200831 科普系列 - 數學與電影動畫製作(一) 20200902 沒有無緣無故的恨(二) 20200905 沒有無緣無故的恨(三) 20200907 科普系列 - 數學與電影動畫製作(二) 20200909 終身職位的評核 20200912 學術界吸引人的地方 20200914 科普系列 - 數學與電影動畫製作 (三) 20200916 學術界辛苦的地方(一) 20200919 學術界辛苦的地方(二) 20200921 科普系列 - 數學與電影動畫製作 (四) 20200923 大學的讀書成績有多重要 20200926 本科生研究機會 20200928 科普系列 - 數學與圖像修復(一) 20200930 用創新的方法去教育科學 20201003 參加研討會的重要 20201005 科普系列 - 數學與圖像修復(二) 20201007 教授與教學 20201010 研究是什麼(一) 20201012 科普系列 - 數學與圖像修復(三) 20201014 研究是什麼(二) 20201017 研究是什麼(三) 20201019 科普系列 - 數學與圖像修復(四) 20201021 如何閱讀研究論文 20201024 研究生應該修什麼課 20201026 科普系列 - 數學與圖像修復(五) 20201029 本科生的多主修多副修 20201102 科普系列 - 數學與數獨(一) 20201105 幾位教授(一) 20201109 科普系列 - 數學與數獨(二) 20201112 幾位教授(二) 20201116 科普系列 - 數學與數獨(三) 20201119 幾位教授(三) 20...

計算數學入門系列 - 計算區域的離散化(三)



情況在高維空間會變得有點複雜。在一維空間內, 我們上面考慮的都只是一段線段,沒有其他的可能性。在高維空間情況就有機會有點特殊。 在二維空間最簡單的情況是計算區域只是一個正方形或長方形。假設形狀是\([0,a]\times[0,b]\),我們可以很簡單的把計算區域離散化

M=…;

N=…;

dx=a/M;

dy=b/N;

x=[0:dx:a];

y=[0:dy:b];

[x,y]=meshgrid(x,y);


可是如果計算區域並不是一個長方形,而是一個圓形,我們就不可能用一些\([0,dx]\times[0,dy]\) 的小長方形把這個形狀覆蓋。那到底我們應該如何把這個區域離散化 就有點複雜了。如果計算區域的形狀太過複雜 (比如說很多在工程上的應用),一般都會使用小三角形把整個計算區域覆蓋,我們把這個過程叫做三角剖分(Triangulation)。這些在有限元法(Finite Element Method) 的計算都是必須的。 如何把這些小三角形安放在整個計算區域內有時都不是那麼容易。有一些有限元法 的準確度會根據三角形的形狀而有所影響,我們可能希望三角形盡量是等邊三角形,也可能只希望這些小三角形的鈍角不會太細小。編寫這些程式有時候也不是太簡單。


這個三角剖分的過程,在三維空間還是可以做出來。可是高維度的計算,就非常複雜了。當然,就算計算區域是一些高維度的長方形,一般的偏微分方程計算還是非常困難,最主要的原因是這些取樣點的總數將會非常之多。如果每一方向我們有 N個點,在d維 空間,需要計算點的總數將會是\(N^d\)。 以d=3為例, 一般電腦都不可以計算到N=200 的情況。如果在四維空間,用相同的儲存空間, N就最多只可以是大約53。 對於大部份我們有興趣的情況,用53點根本不可能做出一個正確和精密的計算。在學術上,這個叫做維數災難 (Curse of Dimensionality),一般我們做偏微分方程計算時都會盡量避免高於三維的計算。 


另外也有一些計算問題,在高位空間的計算區域並不是像上面那麼的直接。以一些動態界面問題為例子,我們希望計算氣泡在水裏面的運動情況。這個動態介面本身就是我們的計算區域。 最簡單的情況,是如何將取樣點平均分布在球體上,本身也已經是一個研究問題,叫做湯姆森問題(Thomson Problem) 。 有一些情況還是沒有找出來。 如果我們不需要平均分布,一般的三角剖分在這起泡表面上還是可以做出來。 但如果起泡在運動的過程形狀有所變化,在介面的一面黏合到他另外一邊,我們做計算時就必須要把這些在表面的三角形重新整合。在編寫程式是這些就非常困難。 所以就產生了另外一種方法,我們並不會把計算區域直接做離散化,而是把計算區域隱含在另外一個區域內。其中一個叫做水平值(Level Set)的方法,我們會定義一個函數 使到這個函數等於零的地方是我們需要的面。以一個球體為例,我們並不會直接在球體表面上取樣, 而是在這個球體存在的三維空間裏面作一個簡單的離散化。

N=…;

dx=3/(N-1);

x=[-1.5:dx:1.5];

[x,y,z]=meshgrid(x,x,x);

phi=sqrt(x.^2+y.^2+z.^2)-1;

p=patch(isosurface(x,y,z,phi,0));

isonormals(x,y,z,phi,p)

p.FaceColor = 'red';

p.EdgeColor = 'none';

daspect([1 1 1])

view(3)

camlight; lighting phong

在上面這段程式裏面,我們就定義了phi 這個函數,他等於零的地方就滿足了一個球體方程式 \(x^2+y^2+z^2=1\)。其他的指令,只是要求MATLAB 把這個函數等於零的地方找出來,然後把他畫成一個漂亮的圖。


留言