Section 2. 極限與微分 |
主題 1. 定義函數
現在要學的函數不是把輸入值轉換的計算,而是類似Python模組或內建的運算,類似 log(),abs()。隨時呼叫就可以。我們由一個簡單的例子來說明, 已知一個指數函數,名稱叫做myFun1的運算,對任何輸入myFun1()括弧的數字,就執行這個指數轉換再輸出。要怎麼做呢?def myFun1(x):
import math
y=x*math.exp(-2*x)
print(y)def 宣告了函數物件myFunc1,在 Spyder 內先用滑鼠把這四行框起來執行,然後 myFunc1就可以任意使用,例如,鍵入myFunc1(-2.5), myFunc1(2.5) 和myFunc1(0)看看結果是什麼。
如果是多變數函數,例如
def myFun2(x,y):
import math
z=y*math.exp(-2*x*y)
print(z)執行畢,嘗試 myFun2(x=2,y=1) 和 myFun2(2,1)。簡單幾行就搞定,很簡單吧!
必須注意,Python使用內縮 (indentation) 確認一個函數的範圍區塊,這作法和一般使用大括弧 {} 的程式語言很不同。
主題 2. 極限和微分
Python 內有一個威力無窮的模組sympy,不但可以用來做計算極限,還可以做微分的符號運算。
2-1 特定值的極限
例 1. 求極限: Python程式如下from sympy import * #載入模組
x = symbols('x') #宣告代數符號的變數,須記得此步一定要
limit(x**2-x+3, x, 1) # limit() 是極限函數
Out[3]: 3例 2. 求極限: Python程式如下
limit((sqrt(x+1)-1)/x, x, 0) # limit() 是極限函數
Out[4]: 1/22-2 微分
例 3. 求函數(x*e^(-2x)) 的一階微分
diff(x*exp(-2*x), x) # diff() 是微分函數,執行符號運算求一階導函數
Out[5]: -2*x*exp(-2*x) + exp(-2*x)Out[5] 就是
在 sympy 如果希望 output 就是數學專業打出來的樣子,可以先宣告一個環境參數 init_printing(use_unicode=True),爾後如果不需要,可以執行 init_printing(pretty_print=False) 即可。
2-3 兩個變數偏微分的作法也很簡潔,如下:
例 4. 雙變數函數 x*e^(xy) ,對x的偏微分
y = symbols('y') ##宣告新增符號的變數,此步一定要
diff(x*exp(x*y), x)
Out[6]: x*y*exp(x*y) + exp(x*y)Out[6] 就是
如果要求二階微分,可以這樣 diff(x*exp(x*y), x, x) 或 diff(x*exp(x*y), x, 2)
2-4 另外,如果要計算特定數值的導數,有兩個方法
第1. 用 def 定義函數就可以,如上面主題1 的例子,把導函數寫進去就可以。
第2. 使用新模組 mpmath ,如下
import mpmath as dydx
dydx.diff(lambda x: x*exp(-2*x), x=0.0, n=2) #計算當x=0 時的二階導數內的參數 n 是指微分階次,省略這個內定是1。
因為mpmath和sympy都有一個diff函數,所以載入時不要用 from sympy import * 的方法
模組 sympy 應該是我們用最多的,後面還會介紹。