Try   HackMD

Lecture - Function handle

函式握把(function handle)是 MATLAB 的一種資料型態, 它保有呼叫一個函式所需的資訊.

  • 使用 @ 運算子來產生函式握把時,只需要將運算子放在函式
    名稱前面即可
f = @myfunction;

例如假設我們想寫一個程式, 畫出

f(x)
[a,b]
區間的圖形. 那我們需要的使用者 input 有: f(x), a, b, 以及點數 N, 程式範例如下:

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 輸入

graph_f(@sin, 0, 10, 1000)

就可以把

sin(x)
[0,10]
1000
個點畫出來了.

另一個例子, 我們也可以定義

sinc(x) 函數如下, 存成 sinc.m,

function y = sinc(x) y = sin(x)./x; end

接著我們在 command windows 輸入

graph_f(@sinc, -10, 20, 1000)

就可以把 sinc 函數畫出來.


Recall exam1

我們可以將 problem 1 暴力求根法寫成一個函數

function root = find_all_root(f, a, b) % 求函數 f(x) 在 [a,b] 區間內所有的根

接著在 problem 2 精準做圖就可以直接使用它

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 以及所有的程式, 使得未來的自己可讀可用.