---
# System prepended metadata

title: Lecture 3 – 符號運算 (Symbolic) 與字串運算 (String)；彈跳球實驗

---

# Lecture 3 – 符號運算 (Symbolic) 與字串運算 (String)；Exp 3 彈跳球&球碰撞

## 課程目標
- 學會 MATLAB 的 **符號運算 (symbolic computation)**  
- 學會 **字串操作 (string operation)**  
- 結合符號與數值運算解物理問題  
- 進行 **彈跳球實驗 (Bouncing Ball)** 測量重力加速度 g 與恢復係數 η  

---

## 一、符號運算 (Symbolic Computation)

### 1. 基本概念
MATLAB 除了可以做數值計算，也能進行代數計算（符號運算），例如：
- 解方程式  
- 微積分  
- 解微分方程式  

使用前需要先宣告符號變數：
```matlab
syms x
```
### 2. 微積分
```matlab
syms f(x)
f(x) = sin(x^2)
df = diff(f, x)   % 對 x 微分
```
多變數偏微分：
```matlab
syms f(x,y)
f(x,y) = sin(x^2)*cos(3*y)
diff(f, x)   % 對 x 偏微分
diff(f, y)   % 對 y 偏微分
```
積分：
```matlab
syms f(x)
f(x) = exp(-x^2)
int(f, x)                % 不定積分
int(f, x, -Inf, Inf)     % 定積分
```
### 3. 解方程式
解一元二次方程式：
```matlab
syms x a b c
f = a*x^2 + b*x + c;
solve(f == 0, x)
```
### 4. 解微分方程式
無初始條件：
```matlab
syms v(t) b
dsolve(diff(v,t) == -b*v)
```
有初始條件：
```matlab
syms v(t) g b v0
f = diff(v,t) == g - b*v;
v_sol(t) = dsolve(f, v(0) == v0)
```
---
## 二、字串運算 (String Operation)
### 1. 基本操作
用單引號 ' ' 定義字串：
```matlab
str1 = 'You';
str2 = 'and';
str3 = 'me.';
str4 = [str1 ' ' str2 ' ' str3]   % 字串串接
```
字串裡要加單引號 '，要打兩個：
```matlab
str5 = 'I''m a student'
```
### 2. 常用函數
| 函數                  | 說明              |
| ------------------- | --------------- |
| `int2str(x)`        | 將數字轉成字串         |
| `num2str(x)`        | 數字轉字串           |
| `str2num(str)`      | 字串轉數字           |
| `strcmp(s1,s2)`     | 比較字串是否相同        |
| `strncmp(s1,s2,n)`  | 比較前 n 個字元是否相同   |
| `findstr(str,s)`    | 找字串 s 在 str 的位置 |
| `strrep(str,s1,s2)` | 替換字串            |
| `strtok(str,token)` | 以 token 切割字串    |
| `strvcat(s1,s2)`    | 垂直排列字串          |

範例：
```matlab
A = {'Taipei','Taoyuan','Chiayi'};
B = {'Taipei','Tainan','Hsinchu'};
strcmp(A,B)       % 比較字串
strncmp(A,B,1)    % 比較前1個字元
findstr('hello the world','world')
strrep('Call me','Call','Save')
```
---
## 三、結合符號與數值運算
在 MATLAB 中，符號運算 (`syms`) 得到的結果，可以再帶入數值進行計算。  
常用指令：`subs(符號表達式, 變數, 值)`  

---

### 範例：雨滴自由落體 (含阻力)
條件：
- 高度 H = 100 m  
- 初速 v0 = 0  
- 阻力係數 β = 0.5 (s⁻¹)  
- 重力加速度 g = 9.8 (m/s²)  

![image](https://hackmd.io/_uploads/Sy4tEYAtxx.png)

---

### 建立運動方程式
由牛頓第二定律：  
$$ \frac{dv}{dt} = g - \beta v $$

MATLAB 程式：
```matlab
syms v(t) g b v0
f = diff(v,t) == g - b*v;

% 解微分方程式，初始條件 v(0) = v0
v_sol(t) = dsolve(f, v(0) == v0)
```
輸出結果：
```matlab
v_sol(t) = (g - exp(-b*t)*(g - b*v0))/b
```
代入數值計算
```matlab
% 帶入 g=9.8, b=0.5, v0=0
v_num = subs(v_sol, [g b v0], [9.8 0.5 0]);
% 計算 t=2 秒時的速度
v_at_2 = double(subs(v_num, t, 2))
y(t)=int(v_sol(t),t,0,t);
ti = linspace(0,20,100);
yT = subs(y,{t},{ti});
plot(ti,yT,'-r')
line(xlim,[100, 100],'Color','black','LineStyle','--')
xlabel('Time(s)'); ylabel('Traveling distance(m)')
```
![image](https://hackmd.io/_uploads/SJxJIYCKeg.png)

結果解釋
- v_sol(t)：符號解，表示任意 t 的解析式
- subs：代入數值，得到特定條件下的速度函數
- double：將符號結果轉成數值
👉 這樣就能結合 符號推導 與 數值模擬，用於物理問題分析。
# 實驗 3 – 彈跳球與球碰撞 (Bouncing Ball & Ball Collision)

## 實驗目標
- 測量重力加速度 **g**  
- 測量不同球類的 **恢復係數 (Coefficient of restitution, η)**  
- 理解能量轉換與 **動量守恆** 的概念  

---

## 一、彈跳球實驗 (Bouncing Ball Problem)

### 原理
球的運動方程式會受到以下作用力影響：  
- 重力 (Gravitational force)  
- 空氣阻力 (Drag)  
- Magnus 力 (因旋轉產生)  
- 浮力 (Buoyancy)  

若只關心「碰撞前後的能量變化」，可以用 **恢復係數 η** 簡化：  

$$
\eta = \frac{v_f}{v_i} = \sqrt{\frac{H_f}{H_i}}
$$

其中：  
- $(v_f, v_i)$：碰撞後、前的速度  
- $(H_f, H_i)$：碰撞後、前的高度  

若將$H_f$以碰撞間彈跳球的飛行時間$T_f$表示，其中：
$$
T_f/2 =\sqrt{\frac{2H_f}{g}}→\sqrt{H_f}=\sqrt{\frac{g T_f^2}{8}}
$$
  則
$$
\eta =\sqrt{\frac{g T_f^2}{8 H_i}}
$$

---

### 實驗步驟
1. 選一種球，量測：  
   - 每次碰撞前的高度 $( H_{i-1} )$ 
   - 對應的飛行時間 $( T_i )$
2. 作圖：  
   - 縱軸 = $( T_i^2 )$  
   - 橫軸 = $( 8 H_{i-1} )$  
   - 擬合直線 → 斜率 = $( \eta^2 )$  
3. 更換 3~4 種不同材質的球，重複步驟，得到各自的恢復係數  

---

## 二、球碰撞實驗 (Ball Collision in Vertical Direction)

### 原理
當 **大球** 與 **小球** 同時由高度 $\ H_i$ 落下：  
- 大球與地面碰撞後，將部分動量傳給小球  
- 小球可能彈到 **高於原高度** 的位置  

忽略空氣阻力，落下時速度：  
$$
v = \sqrt{2gH_i}
$$

若大球與地面恢復係數為 $\eta_l$，則：  
- 大球與地面碰撞 → 改變速度  
- 大球與小球碰撞 → 動量守恆 + 相對速度關係

若將碰撞後大、小球之相對速度表成碰撞前之相對速度與大小球相對恢復係數$\eta_s$之乘積
最後，小球彈起高度可寫為：  
$$
H_f = \frac{v_f^2}{2g}=H_i{[{\frac{M(1+\eta_s)\eta_l+(M\eta_s-m)}{M+m}}]}^2
$$

---

### 實驗步驟
1. 選一組「大球 + 小球」，先量測大球與地面恢復係數 $\eta_l$。  
2. 改變初始高度 $\ H_i$，紀錄小球彈起高度 $\ H_f$。  
3. 利用數據計算大球與小球間的恢復係數 $\eta_s$。  
4. 更換 1~2 組不同球體，重複實驗。  

---

## 三、進階討論
真實彈跳球運動更複雜，可能涉及：  
- 空氣阻力  
- 浮力  
- Magnus 力（旋轉效應）  
- 球體與地面碰撞時的形變  

👉 思考：如果要建立更精確的模型，應該如何將這些因素納入？  

參考文章：  
- [Wikipedia: Bouncing Ball](https://en.wikipedia.org/wiki/Bouncing_ball)  
- [Real World Physics Problems – Bouncing Ball Physics](https://www.real-world-physics-problems.com/bouncing-ball-physics.html)  

