泰勒公式:
通過泰勒公式可以找到一個函數的近似值,以sin爲例
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from scipy.misc import derivative
#模擬泰勒公式,使用scipy.misc模塊下的derivative方法函數可以求導
#另外 python求導見http://liao.cpython.org/scipy17/
plt.rcParams['font.sans-serif']=['SimHei'] # 用於正常顯示中文標籤
plt.rcParams['axes.unicode_minus']=False # 用來正常顯示負號
ax=plt.gca()
# 移位置 設爲原點相交
ax.xaxis.set_ticks_position('bottom') # 設置爲底部
ax.spines['bottom'].set_position(('data', 0)) # 獲取底部軸設置其位置,表示設置底部軸移動到豎軸的0座標位置
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))
#獲取x座標
X=np.linspace(-np.pi,np.pi,256,endpoint=True)
#獲取y座標
sin=np.sin(X)
plt.plot(X,sin,"b-",lw=2.5,label="正弦")
#開始驗證泰勒(畫散點圖) 該求導函數詳見那個網站
x_data = np.linspace(-np.pi,np.pi,30,endpoint=True)
y_data = []
y_data2 = []
y_data3 = []
def f(x):
return np.sin(x)
#加到3階導數
for i in range(len(x_data)):
y = np.sin(0) + derivative(f, 0,dx=1e-6, n=1)*(x_data[i]-0) + derivative(f, 0, dx=1e-6, n=2)*((x_data[i]-0)**2)/2
y = y + derivative(f, 0, dx=1e-6, n=3,order=5) * ((x_data[i] - 0) ** 3) / 6 #這個地方,求三階導的時候,order要設置爲5,因爲去看源文件,發現order要>n+1且爲奇數
y_data.append(y)
plt.scatter(x_data,y_data,c='r')
#加到2階導數
for i in range(len(x_data)):
y = np.sin(0) + derivative(f, 0,dx=1e-6, n=1)*(x_data[i]-0) + derivative(f, 0, dx=1e-6, n=2)*((x_data[i]-0)**2)/2
y_data2.append(y)
plt.scatter(x_data, y_data2, c='g')
plt.show()
結果爲:
綠色散點是泰勒公式加到2階導數的結果,紅色散點是加到3階導數的結果,可以看到在擬合度逐漸變高。
以上是當x0 = 0的時候。
將x0 = 0改爲x0 = x_data[10],結果是:
依然可以擬合,只不過擬合程度在x_data[10]處達到最好。
所以在使用泰勒公式時,可以根據要目的選擇x0的取值。
編程問題:
使用到了 derivative 函數,這個函數參數爲:
Parameters ---------- func : function Input function. x0 : float The point at which `n`-th derivative is found. dx : float, optional Spacing. n : int, optional Order of the derivative. Default is 1. args : tuple, optional Arguments order : int, optional Number of points to use, must be odd.
在求三階導數的時候,order要設置爲5.
不過這個函數有點坑,求多項式的導數還好,求像這個sin的函數,到4階就會誤差非常大,不能忍受。