--- title: 數學軟體實作 - Function handle and pseudo code tags: 2020 Fall - 數學軟體實作 GA: G-77TT93X4N1 --- # Lecture - Function handle 函式握把(function handle)是 MATLAB 的一種資料型態, 它保有呼叫一個函式所需的資訊. * 使用 @ 運算子來產生函式握把時,只需要將運算子放在函式 名稱前面即可 ```matlab f = @myfunction; ``` 例如假設我們想寫一個程式, 畫出 $f(x)$ 在 $[a,b]$ 區間的圖形. 那我們需要的使用者 `input` 有: `f(x)`, `a`, `b`, 以及點數 `N`, 程式範例如下: ```matlab= function graph_f(f, a, b, N) % 在 [a, b] 以 N 個點畫出 f(x) 函數圖形 x = linspace(a, b, N); fx = f(x); plot(x, fx) end ``` 將它存成 `graph_f.m` 檔. 若我們想要在 $[0, 10]$ 這個區間畫 $\sin(x)$ 這個函數, 我們就需要將 `sin` 這個函數傳入 `graph_f` 這個程式的第一個 `input` 中, 做法就是將 `sin` 做成一個函式握把, `@sin`, 這樣我們在 command windows 輸入 ```matlab graph_f(@sin, 0, 10, 1000) ``` 就可以把 $\sin(x)$ 在 $[0, 10]$ 以 $1000$ 個點畫出來了. 另一個例子, 我們也可以定義 $sinc(x)$ 函數如下, 存成 `sinc.m`, ```matlab= function y = sinc(x) y = sin(x)./x; end ``` 接著我們在 command windows 輸入 ```matlab graph_f(@sinc, -10, 20, 1000) ``` 就可以把 `sinc` 函數畫出來. --- ## Recall [exam1](https://hackmd.io/@teshenglin/ms_exam1) 我們可以將 problem 1 暴力求根法寫成一個函數 ```matlab= function root = find_all_root(f, a, b) % 求函數 f(x) 在 [a,b] 區間內所有的根 ``` 接著在 problem 2 精準做圖就可以直接使用它 ```matlab= function accurate_graph(L) % 求 df 在 [-L, L] 所有的根 root = find_all_roots(@df, -L, L); function y = f(x) y = ?? end function y = df(x) y = ?? end ``` ### Exercise 改寫你在 exam 1 的程式, 試著使用 function handle 來簡化它. --- # Lecture - Pseudo code > 虛擬程式碼 (pseudo code) 是一個非正式的程式語言, 試圖提供足夠詳細的程式執行流程以描述程式的每一個執行步驟, 藉以提供程式設計師在接下來把程式以特定的程式語言完成. > 虛擬程式碼以文字(或我們講話)的方式來表達而不需受限於特定程式語言. ### Why pseudo code * 讓自己及其他人易於了解演算法的設計構想 * 將虛擬碼轉換成程式之前,協助組織自己的想法 #### Example - 暴力求所有根 Idea: ``` Input: 函數 f, 區間 a, b Output: 所有的根 Step 1: 在 [a, b] 均勻分成 N 個區間 Step 2: 在每一區間以 IVP 測試是否有根 Step 3: 若有根則在區間內隨機取點, 直到取到的點其函數值夠小. ``` Pseudo code: ``` Input: 函數 f, 區間 a, b Output: 所有的根 x = linspace(a, b, N+1); for ii=1:N left = x(ii); right = x(ii+1); if(f(left)*f(right)<0) find_root(@f, left, right) end end ``` --- ## Take home assignment (不需要交) 整理自己的 `github repo`, 修改 `readme.md` 以及所有的程式, 使得未來的自己可讀可用. ---