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