---
# System prepended metadata

title: 'Lecture 9 – ODE Toolbox, FFT；實驗七 水火箭'

---

# Lecture 9 – ODE Toolbox, FFT；實驗七 水火箭

## 課程目標
- 學會使用 MATLAB 的 **ODE toolbox** 解常微分方程式  
- 了解 **快速傅立葉轉換 (FFT)** 的基本概念與應用  
- 進行 **水火箭實驗**，比較實驗與數值模擬結果  

---

## 一、ODE Toolbox in MATLAB

### 1. 代數解法 (Symbolic Toolbox)
使用 `dsolve` 求解可解析的一階 ODE，例如：
```matlab
syms v(t) b v0
equ = diff(v,t) == -b*v;
cond = [v(0) == v0];
v_sol(t) = dsolve(equ, cond);

% 代入數值
vi = 10; beta = 0.5;
tt = linspace(0, 3*vi/beta, 200);
v_t = subs(v_sol, {v0, b, t}, {vi, beta, tt});

plot(tt, v_t), xlabel('Time (s)'), ylabel('Velocity (m/s)')
```
👉 但多數實際問題 沒有解析解，需要數值方法。

---
### 2. 常用數值 Solver

MATLAB 提供多種 ODE solver，不同方法適合不同問題：

| Solver  | 問題類型 | 精度 | 使用時機 |
|---------|----------|------|----------|
| **ode45**   | 非剛性 | 中等 | 預設選擇，最常用 |
| **ode23**   | 非剛性 | 低   | 容忍粗略誤差時 |
| **ode113**  | 非剛性 | 低–高 | 高精度需求時 |
| **ode15s**  | 剛性   | 低–中 | 當 ode45 無法收斂時 |
| **ode23s**  | 剛性   | 低   | 適合簡單剛性問題 |
| **ode23t**  | 中度剛性 | 低 | 無數值阻尼需求時 |
| **ode15i**  | 全隱式 | 低 | 用於隱式方程或 DAE |

👉 一般情況先用 **ode45**，若不收斂再嘗試其他方法。

---

### 3. 範例：雨滴下墜
常微分方程式：
$$
\frac{dv}{dt} = g - b v
$$

MATLAB 程式：
```matlab
tspan = [0, 10];
v0 = 0; g = 9.8; b = 0.5;

fun = @(t,y) (g - b*y);
[t,y] = ode45(fun, tspan, v0);

plot(t, y)
xlabel('Time (s)')
ylabel('Velocity (m/s)')
title('Falling Rain Drop with Air Resistance')
```

### 4. 二階 ODE：簡諧振子 (SHO)

方程式：
$$
\frac{d^2x}{dt^2} + \omega^2 x = 0
$$

---

#### 降階成一階系統
令速度 $v =\frac{dx}{dt}$，可寫成：
$$
\frac{dx}{dt} = v, \quad \frac{dv}{dt} = -\omega^2 x
$$

---

#### MATLAB 程式範例
```matlab
Tp = 0.5;              % 振動週期
w = 2*pi/Tp;           % 角頻率
tspan = [0, 10*Tp];    % 模擬時間

% 定義方程式
fun = @(t,y) [y(2); -w^2*y(1)];

% 使用 ode45 解
[t,y] = ode45(fun, tspan, [2,0]);  % 初始條件 x=2, v=0

% 繪圖
plot(t, y(:,1),'r-', t, y(:,2)/w,'b--')
legend('x(t)','v(t)/w')
xlabel('Time (s)')
ylabel('Amplitude')
title('Simple Harmonic Oscillator')
```
---
### 5. Event 功能
MATLAB 的 ODE solver 提供 **Event 機制**，可以偵測特殊條件並控制模擬進行。  
常見應用：
- 模擬小球落地 (高度 = 0)  
- 模擬彈跳：落地後修正速度並繼續模擬  
- 設定停止條件 (例如位移達到某值)

👉 Event 可以讓 ODE 模擬更接近真實物理過程。  

---

## 二、傅立葉分析與 FFT

### 1. 基本概念
- 時域訊號可以分解為許多不同頻率的正弦波。  
- **傅立葉轉換**：將訊號從 **時域 (time domain)** 轉換到 **頻域 (frequency domain)**。  
- 頻譜 (spectrum)：顯示不同頻率成分的強度。  

---

### 2. 快速傅立葉轉換 (FFT)
- FFT 是一種高效能的離散傅立葉轉換演算法。  
- 頻率解析度公式：
$$
\Delta f = \frac{1}{T_f - T_i}
$$
取樣時間越長，頻率解析度越高。  

MATLAB 範例：
```matlab
Fs = 1000;              % 取樣頻率 (Hz)
t = 0:1/Fs:1-1/Fs;      % 時間序列
y = cos(2*pi*50*t) + cos(2*pi*120*t);  % 測試訊號

Y = fft(y);             % 做 FFT
L = length(y);
P2 = abs(Y/L);          % 雙邊頻譜
P1 = P2(1:L/2+1);       % 單邊頻譜
P1(2:end-1) = 2*P1(2:end-1);

f = Fs*(0:(L/2))/L;
plot(f,P1)
xlabel('Frequency (Hz)')
ylabel('|P1(f)|')
title('FFT Spectrum')
```
## 三、實驗七：水火箭 (Real Projectile)

### 實驗目的
- 觀察水火箭發射過程  
- 理解「質量隨時間改變」的動力學特性  
- 比較實驗結果與 MATLAB 模擬  

---

### 實驗原理
水火箭的質量會隨著水噴出而改變，推進力公式為：
$$
F = m(t)\frac{dv}{dt} + v_e \frac{dm}{dt}
$$

其中：  
- \( m(t) \)：火箭的瞬時質量  
- \( v_e \)：噴射速度  

👉 因為質量隨時間變化，沒有解析解，只能用 **數值方法 (如 ode45)** 模擬。  
👉 真實情況還需要考慮空氣阻力與風阻力。  

---

### 實驗步驟
1. 製作水火箭，設計尾翼以增加穩定性。  
2. 改變不同條件：  
   - 水量 (多少比例的瓶子裝水)  
   - 打氣壓力 (初始壓縮空氣壓力)  
   - 發射角度  
3. 發射並記錄：  
   - 最大高度  
   - 飛行時間  
   - 射程距離  
4. 在 MATLAB 建立數值模型，模擬相同條件下的飛行軌跡。  
5. 比較實驗與模擬的差異，並討論可能原因 (如空氣阻力、摩擦、能量損耗)。  

---

### 參考資料

- R. Barrio-Perotti et al., *Theoretical and experimental analysis of the physics of water rockets*, Eur. J. Phys. **31**, 1131 (2010).  
- [Wikipedia – Water rocket](https://en.wikipedia.org/wiki/Water_rocket)  
- [NASA – Bottle Rocket Simulation](https://web.archive.org/web/20060207020049/http://exploration.grc.nasa.gov/education/rocket/BottleRocket/sim.htm)  
- [NPL – Water Rocket Booklet (PDF)](https://www.npl.co.uk/getmedia/9562a6ed-13e3-45e6-8234-205f6a2538d6/wr_booklet_print.pdf)  
