Python Tutorials

Part 1. 程式基礎與數學篇

Programming Basics and Math Python

 

Section 2. 極限與微分

 

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/2

2-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 應該是我們用最多的,後面還會介紹。