# 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)