matplotlib 觀察泰勒公式

泰勒公式:

通過泰勒公式可以找到一個函數的近似值,以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階就會誤差非常大,不能忍受。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章