文章

顯示從 3月, 2021 起發佈的文章

目錄

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

計算數學入門系列 - 編寫程式模擬社會隔離(二)

圖片
上面的三種方法,沒有那一個是絕對的好,或者是那一個絕對不要學習。根據同學們自己的能力可以隨便使用任何一種方法。第一種方法無疑是最直接,程式的脈落看起來也最清楚。可是程式可能會非常冗長,在copy-and-paste 的時候可能也要精神一點,不要忘記將其中一些內容更改。第三種方法,編寫要用最多腦力,也需要對MATLAB有更好的掌握。但是熟能生巧,當你習慣了MATLAB這套語言,這個兩行程式是最乾淨,而且程式執行起來也會更快捷。我自己對入門同學的建議,是先寫一個沒有錯誤bug-free 的程式,這比起是否有效率,是否乾淨更其重要。當同學對軟件更加純熟,才慢慢的想方法把for-loop 移除,想像一下如何可以用MATLAB的一些內置函數將程式簡化和加速。 在模擬社會隔離的這個數學模型裏面,還有另外一個相關的計算問題。由於我們需要看一下在我旁邊八個格裏面一共有多少人跟我同一標籤,再看一下這佔據所有鄰居的多少個百分比,所以除了上面的計算外,還需要看一下旁邊有多少空格有人居住。做法其實同上面的那個問題基本上一樣,唯一要注意的,是矩陣X所儲存的是0,1和2,代表着冇人居住,標籤A和標籤B。所以如果我們要計算有多少鄰居的話,我們如果只將上面的程式更改成為 count2=[X~=0]; count2=sum(count2(:))-1; 這樣就「差不多」可以了。第一項裏面我們只需要將conditional statement 改變為X~=0,就是說他不等於0的地方,就用1代表,有了標籤A或B,那一個對應的地方就放入0。 然後第二句,就只需要計一下count2 這個變量裏面有多少個1,我們就知道這個3×3矩陣裏面有多少個鄰居。 前面為什麼說是「差不多」呢?因為這個程式計算出來的答案有機會是錯誤的。當同學如果把不同的矩陣放入這個程式內跑,會發覺大部份情況都沒有太大的問題,程式也不會有任何錯誤訊息顯示。可是,有些簡單情況,程式出現的答案會是錯誤的。這一種程式的bug 是相當難被發現。他不是一些語法錯誤(Syntax Error),MATLAB是可以執行這兩項程式,他也不會告訴你計算出來的答案和你想象中顯示的不相符。 這兩項程式的問題,是在於第二行「-1」這個行為。上面我們需要在第二行「-1」,是由於我們知道在中心那一格重複計算了一次。可是在這個計算裏面,中心一格並不一定等於0,所以程式第二行

YouTuber系列 - 我家貓咪開會亂入

圖片
 

計算數學入門系列 - 編寫程式模擬社會隔離(一)

圖片
以往其中一篇科普系列裏面提到一個簡單的數學模型,去解釋社會隔離現象的產生。 (有興趣的讀者,可以先參閱《數學、社會隔離與生命遊戲》)假設在一個社區內只有兩個不同的群體,我們用標籤A跟標籤B表示這兩個不同的背景群體。所代表的,可能是貧與富,也可能是華人與白人,也可能是喜歡自由黨或喜歡民主黨的。數學上,這個社區內所有的標籤,我們都可以用一個矩陣外表是,我們將它寫X(i,j)。這一個矩陣X裏面這個成員X(i,j),我們可以用1表示這個平房內的家庭有着標籤A,用2表示這個房間內家庭都有着標籤B。而如果這個房子還沒有成交,沒有人居住,我們就可以用0表示。這個我們以前提到的數學模型,用上下左右以及左上,右上,左下,和右下一共八間房子去定義「鄰居」。假設現在看(i,j)這個地方,他的鄰居將會是這八個,(i-1,j-1), (i-1,j), (i-1,j+1), (i,j-1), (i,j+1), (i+1,j-1), (i+1,j), (i+1,j+1)。要去定義「喜好」最簡單的方法,就是看這八個鄰居有百分之多少是跟我自己的標籤一樣。如果這個百分比太少,住在原本(i,j) 的人,就會搬離這個房子到其他地方居住。 如果我們要編寫一個MATLAB程式,如何可以簡單地說出在我旁邊有多少鄰居是跟我同一個標籤的呢?用一個簡單一點的例子,我們只考慮3×3的範圍,而我自己就住在(2,2) 這個地方。所以編寫程式的目的,就要看看在這個X矩陣裏面有多少個元素是跟X(2,2) 一樣。最簡單(亦是最簡陋)的編寫方法是, count1=0; if (X(1,1)==X(2,2))    count1=count1+1; end if (X(1,2)==X(2,2))    count1=count1+1; end … if (X(3,3)==X(2,2))    count1=count1+1; end 中間包含了八個condition。這個編寫的方式沒有錯誤,可是編寫起來非常麻煩,中間需要有很多copy-and-paste 和改動(所以編寫時,忘記了改寫某一些行的時候就很大機會有bug),而且看起來程式會非常長。另外一個好一點的辦法,是編寫兩個for-loop,程式將會大大縮短。 count1=0; for i=1:3 for j=1:3       if (X(i,j)==X(2,2))      

YouTuber系列 - 在香港有什麼職業選擇

圖片
 

2021年恒隆數學獎

在 Instagram 查看這則貼文 恒隆數學獎 - To infinity 無限可能(@hanglungmathematicsawards)分享的貼文  

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

圖片
情況在高維空間會變得有點複雜。在一維空間內, 我們上面考慮的都只是一段線段,沒有其他的可能性。在高維空間情況就有機會有點特殊。 在二維空間最簡單的情況是計算區域只是一個正方形或長方形。假設形狀是\([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) 。 有一些情況還是沒有找出來。 如果我們

YouTuber系列 - 讀科學有什麼發展機會

圖片
 

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

圖片
假設我們有興趣的區域是在0到1之間,我們可以把這個區域分成某些數量的線段。最簡單的方式, 就是把這線段分成N 段相同長度的線段。 所以一共就會有N +1點。用MATLAB 的表示方式,我們可以用 N=…; dx=1/N; x=[0:dx:1]; 當然,還是有一些同學喜歡用looping 的方法,喜歡把第三行寫成 for i=1:N+1       x(i)=(i-1)*dx; end 需要留意的是,這裏一共有N +1點,所以最後一個index並不是N,要不是最後運算時就差了x=1 那一點。 這裏有一點奇怪的是,我們定義了線段的段數,而不是取樣點數。所以如果同學喜歡定義N點,那就記得要把dx 定義成1/(N-1)。 對於不同問題的邊界條件,我們可能會將這個簡單的分段作出一點變化。上面所說的,對於一些Dirichlet Boundary Condition 非常方便。這種邊界條件,固定了在邊界上面函數的數值。在一些應用來說可能是邊界的溫度已經固定了,然後我們希望找出在區域內其他地方的溫度。所以在進行導數的近似值的時候,x(1) 和x(N+1) 就可以直接運用邊界條件去固定他們的數值。另外一點要注意的是,當我們在解決這個在計算區域內的問題,裏面我們希望求的是N -1個取樣點的函數值。 如果同學希望要找出來的是N個未知數(而不是N -1個取樣點上的函數),那就可以把dx定義成1/(N+1) 。 有一些問題,我們希望做一個周期性計算區域(Periodic Domain),就是說我們假設答案有一個周期性的特性所以無論x 的數值是什麼,x 和x+1 這兩點其實函數值是會一樣。如果這樣子,我們定義計算區域是就不需要考慮x=1 這一點,因為這一點的數值其實會跟x(1) 一樣,我們就不需要再多花心神在這一點上。 N=…; dx=1/N; x=[0:dx:1-dx]; 如果寫這樣子, N這個數值就不是代表着線段的總數,而是代表着取樣點的數目。 然後有另外一些數學問題,我們希望取樣點是在線段的中心,而不是在線段的兩端。這樣,我們可以用 N=…; dx=1/N; x=[dx/2:dx:1-dx/2]; 這個取樣點的方法不太常用,對一般入門的同學可能沒有太大用途。可是當我們在解決一些守恆定律方程式(Conservation Laws), 用到一些有限容積法(Finite Volume Sche

YouTuber系列 - 用數學拍電影(下)

圖片
介紹一下如何用數學的方式繪畫動畫。如何調整參數,令到產生的動畫比較好看。 #數學 #動畫 #STEM #STEMEducation #MATH #Science  

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

圖片
很多的計算問題,我們都需要將計算的區域 (Domain)標示出來。我們要定義一個數學上的函數 (Function),就必須要提供兩個東西。第一個就是如何運算數字的方式。比如說f(x)=sin(x) 的這一個三角函數。 你給我一個數字x,計算機就可以把它變成另外一個數字。中間這個過程就是運算數字的方式。對於我們來說,這個運算模式可以算是一個黑盒,電腦當然不可能根據定義繪畫一個半徑為一的圓形,再將你放入的數字x作為角度,然後看一下在圓形裏形成的三角形高度是多少。不過沒關係,就算中間的過程是一個黑盒,在運用上,我們還是可以把它定義為一個函數。第二個需要定義的,是到底什麼東西可以放入函數裏面。我們把可以放入這個函數的數字收集起來, 這個就是我們所說的「區域」。 上面所舉例的函數,我們可以放進任何的數字,所以他的區域是可以由負無限去到正無限大的。另外一些例子,譬如說我們需要解決一些拋物線型偏微分方程 (Parabolic Partial Differential Equation),就好像是要知道在一個空間裏面溫度的分布如何隨着時間而改變。所以放入去函數 (在這個例子裏面,這個函數就是溫度)的數字,就是在空間裏面一點的座標。 當然我們可以問在這無限三維空間裏面的溫度,但是這些關於無限空間的問題在計算數學裏面一般是不會考慮的。其中一個原因,是當數字越來越大,可以正確表示的數字分布將會越來越稀疏。那我們可以得到的數值解就越來越不準確。第二,就算可以計算出來,我們也沒有辦法把它畫出來,要清楚表示你計算出來的答案將不會是一件容易的事情。通常我們只會把計算集中在一個有限的區域以內,然後假設在這個區域以外,答案可能不太重要又或者是沒有趣味。如果真的是需要計算在一個無限空間上面的答案, 我們可以把問題進行傅立葉 (Fourier Transform)變換, 然後在頻率空間上面只考慮有限的頻率來進行計算。 這些我就不再繼續討論。 就算我們考慮有限的區域,一般計算我們也不會要求將區域內所有地方的答案都找出來。純數學裏面一般都會考慮那一段數線 內所有的數值,就是所說的for all 或者for any。可是在應用或者計算數學裏面我們一般都會把這些計算區域先做一個離散化 (Discretization), 就是說我們會先做一個取樣過程,只計算在某些地方的答案。而如果有需要,我們就會再用插補 (In