函式握把(function handle)是 MATLAB 的一種資料型態, 它保有呼叫一個函式所需的資訊.
f = @myfunction;
例如假設我們想寫一個程式, 畫出 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
檔.
若我們想要在 sin
這個函數傳入 graph_f
這個程式的第一個 input
中, 做法就是將 sin
做成一個函式握把, @sin
, 這樣我們在 command windows 輸入
graph_f(@sin, 0, 10, 1000)
就可以把
另一個例子, 我們也可以定義 sinc.m
,
function y = sinc(x)
y = sin(x)./x;
end
接著我們在 command windows 輸入
graph_f(@sinc, -10, 20, 1000)
就可以把 sinc
函數畫出來.
我們可以將 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
改寫你在 exam 1 的程式, 試著使用 function handle 來簡化它.
虛擬程式碼 (pseudo code) 是一個非正式的程式語言, 試圖提供足夠詳細的程式執行流程以描述程式的每一個執行步驟, 藉以提供程式設計師在接下來把程式以特定的程式語言完成.
虛擬程式碼以文字(或我們講話)的方式來表達而不需受限於特定程式語言.
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
整理自己的 github repo
, 修改 readme.md
以及所有的程式, 使得未來的自己可讀可用.