# 微分(Differentiation)
## 簡介
在發展微積分的時候,牛頓和萊布尼茲做的第一件事情就是利用微分求任意物體的速率。
現在我們就來看如何利用微分,求解物體的速率。
## 例題
下圖(1)為一物體的位置隨時間的變化,考慮時間從t=0到t=20,時間間隔deltaT=0.01,可以計算

 圖(1)
上圖的函數為 
先將函式圖畫出:
```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)
如圖(2)就可以得到速度隨時間的變化,當dT取的越小,所算出來的速度會越精準(見圖(3))
 圖(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)
```
 圖(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)
```
得到
 圖(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) )
```
輸出為

所以我們可以調用上面的lambdify函式,重新定義出我們的Exact Solution,再帶入t求得解析解。
## 三者比較
 圖(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,將加速度和位置對時間的關係畫在同一張圖上。

