---
# System prepended metadata

title: 微分(Differentiation)

---

# 微分(Differentiation)
## 簡介
在發展微積分的時候，牛頓和萊布尼茲做的第一件事情就是利用微分求任意物體的速率。
現在我們就來看如何利用微分，求解物體的速率。

## 例題
下圖(1)為一物體的位置隨時間的變化，考慮時間從t=0到t=20，時間間隔deltaT=0.01，可以計算
![](https://i.imgur.com/vtPhhP1.png)


![](https://i.imgur.com/QGCn4gL.png) 圖(1)
上圖的函數為 ![](https://i.imgur.com/gvVVbJg.png)
先將函式圖畫出：
```python=
import matplotlib.pyplot as plt
import numpy as np 
import sympy as sp
def f(x):
    return(np.sin(2*x)*np.cos(-x))
#設定參數
ti = 0
tf = 20
dT = 0.01
N = int((tf-ti)/dT)
tt = np.arange(0,20,dT)
plt.plot(tt,f(tt),color = 'blue')
plt.xlabel('Time')
plt.ylabel('Position')
```
由(1)可得每個位置的速度，利用 for loop就可以將每個位置的速度算出來
```python=
#還需要一個 array 存裝算出的速度
vel = np.zeros(N)

for i in range(N):
    v0 = (f(ti+dT)-f(ti))/dT # 計算每個位置的速度
    ti += dT  # 時間疊加 同 t = t + dT
    vel[i] = v0 # 存進velocity array中，用於plot
plt.plot(tt,vel,color='red') #繪圖
```    
![2](https://i.imgur.com/MyyPcaq.png) 圖(2)



如圖(2)就可以得到速度隨時間的變化，當dT取的越小，所算出來的速度會越精準(見圖(3))
![3](https://i.imgur.com/qrU5j3Z.png) 圖(3)

## Sympy diff module
上面所用的方式是利用導數和for loop做微分，也可以使用Sympy diff的模組進行微分。
首先導入Sympy module
```python=
import sympy as sp
```
定義符號
```python=
x = sp.Symbol('x')
y = sp.Symbol('y')
```
diff解微分，方式為sp.diff(欲微分方程,欲微分變數)，舉例如下:
```python=
sol = sp.diff(sp.sin(x), x)
print(sol)
```
![](https://i.imgur.com/1WHlTg5.png) 圖(4)

也可以做更高階的微分，方式為sp.diff(欲微分方程,欲微分變數，微分次數)
```python=
sol1 = sp.diff(sp.sin(2*x), x, 1)
sol2 = sp.diff(sp.sin(2*x), x, 2)
sol3 = sp.diff(sp.sin(2*x), x, 3)
```
得到
![](https://i.imgur.com/F0av2YR.png) 圖(5)
## Sympy lambdify module
由於上面計算出來的為Sympy特有的格式，沒辦法直接進行數值運算或定義，因次我們需要借用lambdify的module來重新定義我們的結果。
用法如下:
```python=
import sympy as sp
import numpy as np

x = sp.Symbol('x')
a = np.arange(10)
expr = x**2
# 構造自己的函數 用法為--> 欲定義新函數 = lambdify(符號 , 舊函數) 
f = sp.lambdify( x, expr )

print( f(a) ) 
```
輸出為
![](https://i.imgur.com/HaLJOTq.png)
所以我們可以調用上面的lambdify函式，重新定義出我們的Exact Solution，再帶入t求得解析解。

## 三者比較
![](https://i.imgur.com/kgnK6Mm.png) 圖(6)
由上圖可以看出dT約0.05(藍色實線)時，和解析解(淺藍色虛線)幾乎相同，所以在做這種數值的微分或積分時，dT越小通常越精準，但要注意不能超過電腦計算時過小數值會被直接當作0而產生的error

# 習題
1. 將公式(2)利用Sympy微分後，運用上面所教的lambdify(自訂義表達式)定義成新的函數後，再利用matplotlib繪圖，比較和dT=0.05 & dT=0.5 時的區別(解析解的t間隔可設定為0.05)，看看是否如圖(6)所示。

2. 將公式(3)進行"兩次微分"算出加速度後，同樣使用lambdify重新定義，在繪圖，T從0s模擬到20s，dT設定為0.1，將加速度和位置對時間的關係畫在同一張圖上。
 ![](https://i.imgur.com/PeEeSeN.png)
 ![](https://i.imgur.com/skaLwIp.png)




