《用 Python 學微積分》原文見參考資料 1。
1、多項式
f(x)=x3-5x2+9

def f(x): return x**3 - 5*x**2 + 9 print f(3) print f(1) import numpy as np x = np.linspace(-5, 5, num = 100) y = f(x) import matplotlib.pyplot as plt plt.plot(x,y) plt.show()
2、指數函數
exp(x)=ex

import numpy as np import matplotlib.pyplot as plt def exp(x): return np.e**x print exp(2) print np.exp(2) x = np.linspace(-5, 5, num = 100) y = exp(x) plt.plot(x,y) plt.show()
3、對數函數

import numpy as np import matplotlib.pyplot as plt x = np.linspace(0.1,10,99,endpoint = False) y1 = np.log2(x) y2 = np.log(x) y3 = np.log10(x) plt.plot(x,y1,'red',x,y2,'yellow',x,y3,'blue') plt.show()
4、三角函數
sin(x)

import numpy as np import matplotlib.pyplot as plt plt.plot(np.linspace(-2*np.pi,2*np.pi),np.sin(np.linspace(-2*np.pi,2*np.pi))) plt.show()
5、函數的復合
h(x)=x2+1

import numpy as np import matplotlib.pyplot as plt def f(x): return x+1 def g(x): return x**2 def h(x): return f(g(x)) x = np.array(range(-10,10)) y = np.array([h(i) for i in x]) plt.plot(x, y, 'bo') # h2 = lambda x: f(g(x)) # plt.plot(x,h2(x),'rs') plt.show()
6、逆函數
w=x2
winv(x)=x1/2

import numpy as np import matplotlib.pyplot as plt w = lambda x: x**2 winv = lambda x: np.sqrt(x) x = np.linspace(0,2,100) plt.plot(x, w(x),'b',x,winv(x),'r',x,x,'g-.') plt.show()
7、高階函數
x2 和 (x-2)2

import numpy as np import matplotlib.pyplot as plt def g(x): return x**2 def horizontal_shift(f,H): return lambda x: f(x-H) x = np.linspace(-10,10,100) shifted_g = horizontal_shift(g,2) plt.plot(x,g(x),'b',x,shifted_g(x),'r') plt.show()
8、歐拉公式
指數函數的多項式:
$$e^x =1+\frac{x}{1!}+\frac{x^2}{2!}+\dots = \sum_{k = 0}^{\infty}\frac{x^k}{k!}$$
三角函數:
$$sin(x) = \frac{x}{1!}-\frac{x^3}{3!}+\frac{x^5}{5!}-\frac{x^7}{7!}+\dots = \sum_{k = 0}^{\infty}{(-1)}^k\frac{x^{(2k+1)}}{(2k+1)!}$$
$$cos(x) = \frac{x^0}{0!}-\frac{x^2}{2!}+\frac{x^4}{4!}-\frac{x^6}{6!}+\dots = \sum_{k = 0}^{\infty}{(-1)}^k\frac{x^{2k}}{(2k)!}$$
虛函數的基本運算規則:
$$i^0=1,\quad i^1=i,\quad i^2=-1,\quad i^3=-i$$
$$i^4=1,\quad i^5=i,\quad i^6=-1,\quad i^7=-i$$
將 ix 代入指數函數的公式中:
$$e^{ix}=\frac{(ix)^0}{0!}+\frac{(ix)^1}{1!}+\frac{(ix)^2}{2!}+\frac{(ix)^3}{3!}+\frac{(ix)^4}{4!}+\frac{(ix)^5}{5!}+\frac{(ix)^6}{6!}+\frac{(ix)^7}{7!}+\dots$$
$$\qquad =\frac{i^0x^0}{0!}+\frac{i^1x^1}{1!}+\frac{i^2x^2}{2!}+\frac{i^3x^3}{3!}+\frac{i^4x^4}{4!}+\frac{i^5x^5}{5!}+\frac{i^6x^6}{6!}+\frac{i^7x^7}{7!}+\dots$$
$$\qquad = 1\frac{x^0}{0!}+i\frac{x^1}{1!}-1\frac{x^2}{2!}-i\frac{x^3}{3!}+1\frac{x^4}{4!}+i\frac{x^5}{5!}-1\frac{x^6}{6!}-i\frac{x^7}{7!}+\dots$$
$$\qquad = (\frac{x^0}{0!}-\frac{x^2}{2!}+\frac{x^4}{4!}-\frac{x^6}{6!}+\dots)+i(\frac{x}{1!}-\frac{x^3}{3!}+\frac{x^5}{5!}-\frac{x^7}{7!}+\dots)$$
$$\qquad = cos(x)+isin(x)$$
此時便得歐拉公式:
$$e^{ix} = cos(x)+isin(x)$$
令 x=π,得:
$$e^{i\pi}+1=0$$

import numpy as np import sympy import matplotlib.pyplot as plt x = np.linspace(-np.pi,np.pi) lhs = np.e**(1j*x) rhs = np.cos(x)+1j*np.sin(x) print sum(lhs==rhs)==len(x) z = sympy.Symbol('z', real = True) sympy.expand(sympy.E**(sympy.I*z), complex = True) for p in np.e**(1j*x): plt.polar([0, np.angle(p)],[0, abs(p)], marker = 'o') plt.show()
9、泰勒級數
函數 f(x) 在 x=0 處展開的泰勒級數的定義為:
$$f(x)=f(0)+\frac{f'(0)}{1!}x+\frac{f''(0)}{2!}x^2+\frac{f'''(0)}{3!}x^3+\dots=\sum_{k=0}^{\infty}\frac{f^{(k)}(0)}{k!}x^k$$
ex,sin(x) 和 cos(x) 的多項式形式,都是它們自己在 x=0 處展開的泰勒級數。其中 ex 在 x=0 的展開為:
$$exp(x)=exp(0)+\frac{exp'(0)}{1!}x+\frac{exp''(0)}{2!}x^2+\frac{exp'''(0)}{3!}x^3+\dots$$
$$\qquad =1 + \frac{x}{1!}+\frac{x^2}{2!}+\frac{x^3}{3!}+\dots$$
$$\qquad =\sum_{k=0}^{\infty}\frac{x^k}{k!}$$
泰勒級數可以把非常復雜的函數轉變成無限項的和的形式。通常,我們可以只計算泰勒級數的前幾項之和,便能夠獲得原函數的局部近似了。在做這樣的多項式近似時,我們所計算的項越多,則近似的結果越精確。
下圖是 e 在 x=0 處展開的泰勒級數分別取前 5、10 和 15 項時的值跟真實值的對比,可以看出,所計算的項越多,則近似的結果越精確。

import numpy as np import sympy import matplotlib.pyplot as plt x = sympy.Symbol('x') exp = np.e**x def polyApprox(func,num_terms): # 當我們需要反復做類似的步驟的時候,最好將步驟定義為一個函數 sums = 0 for i in range(num_terms): numerator = func.diff(x,i) numerator = numerator.evalf(subs={x:0}) denominator = np.math.factorial(i) sums += numerator/denominator*x**i return sums sum5 = polyApprox(exp,5) sum10 = polyApprox(exp,10) sum15 = exp.series(x,0,15).removeO() xvals = np.linspace(5,10,100) for xval in xvals: plt.plot(xval,exp.evalf(subs={x:xval}),'bo',\ xval,sum5.evalf(subs={x:xval}),'ro',\ xval,sum10.evalf(subs={x:xval}),'go',\ xval,sum15.evalf(subs={x:xval}),'yo') plt.show()
10、極限
定義:若要稱函數 f(x) 在 x=a 處的極限為 L,即:
$$\lim_{x\rightarrow a}f(x)=L$$
則需要:對任意一個 ε>0,都能找到 δ>0,使得當 x 的取值滿足 0<|x-a|<δ 時,|f(x)-L|<ε。

import numpy as np import sympy import matplotlib.pyplot as plt f = lambda x: x**2-2*x-6 x = np.linspace(0,5,100) y = f(x) plt.plot(x,y,'red') plt.grid('off') l = plt.axhline(-8,0,1,linewidth = 2, color = 'black') l = plt.axvline(0,0,1,linewidth = 2, color = 'black') l = plt.axhline(y=2,xmin=0,xmax=0.8,linestyle="--") l = plt.axvline(x=4,ymin=0,ymax=float(5)/9, linestyle = "--") l = plt.axhline(-6,3.7/5,4.3/5,linewidth = 2, color = 'black') l = plt.axvline(1,6.0/18,14.0/18,linewidth = 2, color = 'black') p = plt.axhspan(-2,6,0,(1+np.sqrt(13))/5,alpha = 0.15, ec = 'none') p = plt.axvspan((1+np.sqrt(5)),(1+np.sqrt(13)),0,1.0/3,alpha = 0.15, ec = 'none') p = plt.axhspan(f(3.7),f(4.3),0,4.3/5,alpha = 0.3, ec = 'none') p = plt.axvspan(3.7,4.3,0,(f(3.7)+8)/18,alpha = 0.3, ec = 'none') plt.axis([0,5,-8,10]) plt.text(0.8,-1,r"$\epsilon$", fontsize = 18) plt.text(0.8,4,r"$\epsilon$", fontsize = 18) plt.text(3.75,-7.0,r"$\delta$", fontsize = 18) plt.text(4.1,-7.0,r"$\delta$", fontsize = 18) plt.text(3.95,-7.8,r"$a$", fontsize = 18) plt.text(4.5,8.5,r"$f(x)$", fontsize = 18,color="red") plt.show()
現在用上面的定義來證明:
$$\lim_{x\rightarrow 4}x^2-2x-6=2$$
即對於任意的 ε>0,能找到一個 δ>0,使得 0<|x-4|<δ 時,有 |f(x)-2|<ε。
證明:注意到 |f(x)-2|=|x2-2x-6-2|=|(x-4)(x+2)|=|x-4|·|x+2|,已知 |x-4|<δ,根據三角形不等式,|x+2|=|x-4+6|≤|x-4|+6<δ+6,所以
|f(x)-2|=|x-4|·|x+2|<δ·(δ+6),現在只需找到一個 δ,滿足 δ·(δ+6)<ε 即可,用二元一次方程知識就可以證明這樣的 δ>0 是存在的。
或者只要令 δ=min(1,ε/7),即可使得 δ≤ε/7 且 δ+6≤7,使得 δ·(δ+6)<ε。
11、泰勒級數用於極限計算
我們在中學課本中一定記憶了常見的極限,以及極限計算的規則,這里我們便不再贅言。泰勒級數也可以用於計算一些形式比較復雜的函數的極限。這里,僅舉一例:
$$\lim_{x\rightarrow 0}\frac{sin(x)}{x}=\lim_{x\rightarrow 0}{\frac{\frac{x}{1!}-\frac{x^3}{3!}+\frac{x^5}{5!}-\frac{x^7}{7!}+\dots}{x}}$$
$$\qquad = \lim_{x\rightarrow 0}{\frac{x(1-\frac{x^2}{3!}+\frac{x^4}{5!}-\frac{x^6}{7!}+\dots)}{x}}$$
$$\qquad = \lim_{x\rightarrow 0}{1-\frac{x^2}{3!}+\frac{x^4}{5!}-\frac{x^6}{7!}+\dots}$$
$$\qquad = 1$$
12、洛必達法則
利用泰勒級數來計算極限,有時也會陷入困境,例如:求極限的位置是在我們不知道泰勒展開的位置,或者所求極限是無窮的。通常遇到這些情況我們會使用各種形式的洛必達法則。
這里我們僅嘗試說明
$$\frac{0}{0}$$
形式的洛必達法則為何成立。
如果 f 和 g 是連續函數,且
$$\lim_{x\rightarrow a}f(x)=0,\quad \lim_{x\rightarrow a}g(x)=0$$
若
$$\lim_{x\rightarrow a}\frac{f'(x)}{g'(x)}$$
存在,則:
$$\lim_{x\rightarrow a}\frac{f(x)}{g(x)}=\lim_{x\rightarrow a}\frac{f'(x)}{g'(x)}$$
如果分子分母求導后仍然是 0/0 形式,那么重復該過程,直至問題解決。
運用泰勒級數,我們很容易可以理解洛必達法則為什么會成立:
$$\lim_{x\rightarrow a}{\frac{f(x)}{g(x)}}=\lim_{x\rightarrow a}{\frac{f(a)+\frac{f'(a)}{1!}(x-a)+\frac{f''(a)}{2!}(x-a)^2+\frac{f'''(a)}{3!}(x-a)^3+\dots}{g(a)+\frac{g'(a)}{1!}(x-a)+\frac{g''(a)}{2!}(x-a)^2+\frac{g'''(a)}{3!}(x-a)^3+\dots}}$$
$$\qquad = \lim_{x\rightarrow a}{\frac{\frac{f'(a)}{1!}(x-a)+\frac{f''(a)}{2!}(x-a)^2+\frac{f'''(a)}{3!}(x-a)^3+\dots}{\frac{g'(a)}{1!}(x-a)+\frac{g''(a)}{2!}(x-a)^2+\frac{g'''(a)}{3!}(x-a)^3+\dots}}$$
$$\qquad =\lim_{x\rightarrow a}{\frac{f'(a)+\frac{f''(a)}{2!}(x-a)+\frac{f'''(a)}{3!}(x-a)^2+\dots}{g'(a)+\frac{g''(a)}{2!}(x-a)+\frac{g'''(a)}{3!}(x-a)^2+\dots}}$$
$$\qquad = \lim_{x\rightarrow a}\frac{f'(x)}{g'(x)}$$
參考資料:
[1] https://ryancheunggit.gitbooks.io/calculus-with-python/content/