文章

顯示從 4月, 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

YouTuber系列 - 科學計算(三)ENG

圖片
20210304 跟 IRE 同學介紹應用數學和計算數學的一節課。第三節講一下關於高頻函數的計算。 #math #matheducation #science #scienceresearch #research #scientificcomputing #stem #stemeducation #應用數學 #計算數學 #數學 #研究 #科研  

計算數學入門系列 - 線性代數問題(一)

圖片
上文提到如何在程式內建構一個矩陣,在這篇文章我們討論一下如何解決一些矩陣的數值問題。最簡單的數值問題,是去找尋N 元一次方程組的答案,數學上來說我們希望找出Ax=b 的根。方程式裏面A 代表一個矩陣,b 代表着方程組的一個已知向量。對於純數學家來說(在本科生課程裏面的線性代數),我們只會問這個方程組有答案嗎?有答案的話,他是唯一的嗎?要真的找出這個方程組的答案,課程裏面,我們也只會用高斯消去法(Gaussian Elimination)一步一步的把答案找出來。對於一些不是很大的問題(就是說N 並不會太大),這個高斯消去法當然不會有太大的問題。方法 一般都可以把確切解(Exact Solution)找出。 可是這裏有兩個問題。第一個,確切解有多exact 其實是可以被質疑的。主要原因是因為前面文章有提過,在電腦裏面我們根本沒有辦法把所有數字確切的標示出來。在那麼多的加減乘除後,我們真的有辦法知道計算出來的數字到底有多準確?當然我們可以說,如果答案準確至小數點後十多個位,誤差一般都不會很大。在一般應用上來說,這個問題應該不會有太大影響。可是這個解釋,對應用數學家來說並沒有太大的吸引力。我們需要的是一個更嚴謹的證明去說明每一步驟微小的不準確,是如何影響着答案的準確度。在數學上來說,這是一個關於算法(Algorithm)本身的穩定性(Stability)的問題。一般在本科生的課程裏面並不會提到。同學們如果有興趣可以參考一些數值線性代數的參考書(譬如說Golub 和Van Loan 的Matrix Computations)。這裏就不再仔細討論。可是比較大的問題,是這個算法的計算量實在太大。簡單來說,要找出一個N 元一次方程組的答案,高斯消去法就差不多需要N的3次方那麼多的計算量。對於應用數學上的問題,這個方法就變得不切實際。 在程式內,很多同學都會第一時間使用MATLAB 的內置函數inv 把矩陣A 的逆 (Inverse)找出來 >> x=inv(A)*b; 這裏沒有錯, x的解(如果我們可以把A的逆找得到)就真的等於這個表達式。 可是,要找出這個矩陣的inverse,可能就真的需要用一些像高斯消去法的方法。所以當矩陣很大時,這個方法就不可行。而且,儘管A本身可能是非常稀疏,他的inverse 一般來說都會是一個全矩陣。這個表達式就先需要把這個全矩陣儲存起來,

YouTuber系列 - 科學計算(二)ENG

圖片
20210304 跟 IRE 同學介紹應用數學和計算數學的一節課。第二節介紹一下動態界面問題。 #math #matheducation #science #scienceresearch #research #scientificcomputing #stem #stemeducation #應用數學 #計算數學 #數學 #研究 #科研  

計算數學入門系列 - 矩陣的儲存(二)

圖片
上面這個例子,我們就設定了一個中等大小的矩陣,在一些問題裏面已經非常有用。可是有一點要特別小心,如果這個變量n 是更大,就比如說30000 ,上面這個方法就已經對電腦的儲存空間造成很大的負擔。主要的問題是,定義一個30000×30000 的矩陣,電腦就必須儲存9 千萬個數字。在MATLAB 內,就需要差不多1.8GB 的內存空格。 要解決這個問題,我們可以看見這9 千萬個數字裏面大部份都是0,而且這些數字在運算過程內我們可能根本沒有機會用到。所以雖然說1.8GB 的儲存空間,可是大部份根本沒有機會用到而浪費掉了。當我們要處理這些非常大的稀疏矩陣,我們可以使用MATLAB 另一個矩陣儲存方式,我們只需要把矩陣內不是0的地方標示出來就可以了。 以上面一個10×10的三對角矩陣為例,我們知道這個矩陣一共有10+9+9=28 個不是0的元素,所以我們可以先設定 >> D=zeros(28,3); D 是一個28×3的矩陣,每一橫行代表着一個不是等於0元素。我們會用前兩個數字 去代表位置,最後一個代表他的數值。 >> D(1:10,1)=1:10; >> D(1:10,2)=1:10; >> D(1:10,3)=-2; 這樣,我們就把矩陣的對角線上的元素定義好。再把 >> D(11:19,1)=1:9; >> D(11:19,2)=2:10; >> D(11:19,3)=1; >> D(20:28,1)=2:10; >> D(20:28,2)=1:9; >> D(20:28,3)=1; 矩陣內所有不是零的元素都已經定義後,我們再用 >> D=spconvert(D); 這個稀疏矩陣就完成了。這個方法的問題,是如果矩陣的大小有所改變,我們就必須要把不是零元素的數目重新設定,然後很小心的把位置計算清楚。但是,如果我們所需要定義的矩陣並沒有一些特別的特徵,我們很可能還是要用這個方法把元素一個一個的設定出來。 比較方便改變的方法,可以使用MATLAB內置函數speyes 或spdiags >> n=30000; >> tmp = ones(n,1); >> E = spdiags([tmp -2*tmp tmp], -

YouTuber系列 - 科學計算(一)ENG

圖片
20210304 跟 IRE 同學介紹應用數學和計算數學的一節課。第一集裏面介紹了自己和一些關於科學計算的背景。 #math #matheducation #science #scienceresearch #research #scientificcomputing #stem #stemeducation #應用數學 #計算數學 #數學 #研究 #科研  

Apple Music Replay 2020

輕鬆一下,聽一下去年播放得最多的歌曲。

計算數學入門系列 - 矩陣的儲存(一)

圖片
矩陣(Matrix)在應用數學裏面有着不可或缺的重要性。我們曾經用過矩陣的方式把計算區域標示出來(可以參考〈科普系列 - 數學、社會隔離與生命遊戲〉一文)。在數據科學裏面,我們曾經討論過如何把高維數據內的低維資訊找出來(可以參考〈科普系列 - 數學與數獨〉一文)。在〈科普系列 - 數學與圖像修復〉裏面,我們也曾經把圖像修復的問題,模擬成為找出鄰近地區色彩平均值的問題。在這篇文章裏面,我們希望討論一些關於矩陣的問題。 最基本要解決的問題,是如何在程式內把這個矩陣標示出來。如果矩陣相對非常細小,我們可以把矩陣內的所有元素一個一個標示出來,我們可以直接用MATLAB 的設定 >> A = [1 2; 3 4]; 這個矩陣A是一個2×2的矩陣,第一行是1和2的兩個數值,另外一行就只有3和4兩個數值。這個方法最為簡單,基本上也不會花太多時間就把矩陣定義出來。可是有些時候我們的矩陣非常大,這個把數值一個一個輸入的方法就非常浪費時間,也很容易出錯。可是如果需要解決的問題,矩陣並沒有任何的特性,而且也是一個全矩陣 (Full Matrix,就是說在矩陣內絕大部份的元素都不是0),我們也沒有其他辦法。 幸運的是,大部份這些非常巨大的矩陣,很多時候都會有一些特別的特徵,而且也更可能是一個稀疏矩陣(Sparse Matrix,就是說矩陣裏大部份的元素都是0)。所以我們在設定這些矩陣時會有一些很方便的方法。 如果我們想設定一個10×10的三對角矩陣(Tridiagonal Matrix),對角線上的所有數值都是-2,上對角線和下對角線的所有數值都是1,而剩下來的所有數值都是0,我們可以用MATLAB 內置函數diag >> B = -2*diag(ones(10,1)) + diag(ones(9,1),1) + diag(ones(9,1),-1); MATLAB 的內置函數diag 可以把一個向量放到矩陣的對角線上面。ones(10,1) 設定了一個10×1的向量,diag(ones(10,1)) 就做出了一個矩陣,而矩陣的對角線所有元素都是1。內置函數diag 還有一個功能,如果函數有兩個input,他就會把第一個輸入的向量放到第二個輸入的相對應對角線上。舉例來說,diag(ones(9,1),1) 就會把一個9×1的向量放到一個矩陣的上對角線。如果這個矩陣,

YouTuber系列 - 我家貓咪上堂亂入

圖片
  #貓咪亂入 #貓咪 #貓 #cat #catvideo

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

圖片
所以這裏的問題,在於中心一點是否等於0。如果中心一點是0就沒有問題,不等於0的話答案就錯了。再仔細看一下,就是說,如果第一行count2 中心點是1,第二行就需要「-1」;如果第一行count2 中心點是0,第二行就不需要「-1」,就是說只需要「-0」。所以,要解決這個bug,我們可以把第二行改成 count2=[X~=0]; count2=sum(count2(:))-count2(2,2); 這樣子就可以了。 當然,就算我們不改正這一個bug,其實對整個程式不會有太大影響。因為如果中心一格等於0,我們根本不需要考慮居住在這一格的人是否滿意自己居住的環境然後考慮會否搬離這一格。所以無論答案是對還是錯,其實不會對整個程式有太大影響。甚至乎,同學在編寫這個程式時並沒有發現這個bug也沒關係,最後的模擬應該看不出來。  但是,這個例子就可以看出為什麼我們在編寫程式時有時會發現,程式越改越複雜,越來越難debug。因為很多時一小部份的錯誤並不會在整體上顯示出來。只有當我們將不同部份拼湊起來,作出改動,有些時候才會發現計算出來的答案和想像中好像有點落差,答案好像總是有點不對頭。有些同學在這個地方已經放棄,一直跟我們說找不到bug,跟我們說每一部份計出來的答案都和想像中的一樣。這可能是在編寫大型程式時最有挑戰的地方,同學們必須要回頭再去嘗試找出這些邏輯錯誤(Logical Error)。 這個模擬社會隔離的程式內,最重要的部份基本上已經完成,剩下來的是把需要搬來的人隨機放到一些空格來。針對着「隨機」, MATLAB 有兩個來自函數rand 和randn。可是他們都是用來產生一些隨機數,並不是可以直接使用在我們現在的應用上。那我們應該如何使用隨機函數rand 編寫我們的程式呢?我們可以簡化一點討論,假設我們現在有10個空格,用矩陣Y來表示。然後我們有5個人,要隨機放進這10個空格內。 聽起來好像有點複雜,但是其實我們只需要在矩陣Y內隨機放入1至5,代表着5個人的標記,餘下來的5格都放0,代表還是空置着。更簡單的方法,我們可以先將1至10隨機放入矩陣Y裏面,然後將6到10這些數字更改為0。這就完成了。所以剩下來最重要的問題,就是如何用隨機函數rand「隨機將1至10隨機放入矩陣Y裏面」。 這裏沒有一個最好的方法,同學可以運用自己的想像力,設計不同的方法達到這個效果。自己覺得這個是

YouTuber系列 - YouTuber 好難做

圖片