# 微分(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)