插值法Interpolate

      在〈插值法Interpolate〉中尚無留言

熟記

interp1d(x, y):產生線性插值方程式
interp1d(x, y, kind='cubic'):取得三次插值法函數

繪製圓點

底下的代碼, 先產生0~10之間10個數, 再用sin產生正弦波10個點, 然後使用亂數加入雜訊噪音, 最後將這10個點繪製在圖表上.

plt.plot()第一參數為x軸, 第二參數為y軸的值, 第三參數”bo” 解說如下
第一字元 : b 藍色, g 綠色, r 紅色, y黃色
第二字元 : o 圓點, s 方塊, ^ 三角型

import numpy as np
import pylab as plt

time = np.linspace(0, 10, 10)
noise = (np.random.random(10)*2 - 1) * 0.1
value = np.sin(2 * np.pi * time) + noise
plt.plot(time, value, 'b^', ms=6, label='real value')

matplotlib_2

線性插值(Interpolate [ɪnˋtɝpə͵let])

當我們在表現資料時,常常會有需要比實際量測點上的值更細密的情況,或者是有需要在範圍外預測其值。比方說天氣圖的繪製,不論是氣壓或是雨量,都不可能做到處處都有測量站,又例如我們關心一天之中溫度隨時間的變化,但是實際上記錄氣溫的動作可能只是每小時一次,則我們要作一個連續的圖時,就會用到插值法。

數學的數值分析領域中,內插或稱插值(interpolation)是一種通過已知的、離散的數據點,在範圍內推求新數據點的方法. 通過採樣或實驗取得的數據點是有限的. 若希望在有限的數據中獲得一個連續的函數(也就是曲線), 則可使用插值法. 插值法當然會有誤差, 但其效能遠大於精度的損失. 

繼上面的代碼, 再加入如下, 即可繪制更細的點或線

from scipy.interpolate import interp1d # 注意喔, 是數字的 1
f1 = interp1d(time, value) #產生線性插值函數
x = np.linspace(0, 10, 50)#將間隔細分為50個區段
y = f1(x)#利用線性插值函數產生50個插值
plt.plot(x, y, "ro", label='linear interplot')

matplotlib_3

f1 = interp1d(time, value) #產生線性插值函數
x = np.linspace(0, 10, 50)#將間隔細分為50個區段
y = linear_interp(x)#利用線性插值函數產生50個插值
plt.plot(x, y, label='linear interplot')

matplotlib_4

多項式插值法

三次插值法(cubic interpolation method)又稱多項式插值法, 逐次以三次曲線φ(t)=a0+a1t+a2t2+a3t3極小點逼近尋求函數f(t)極小點的一種方法.具體做法是:假設t1<t2 在搜索區間[t1,t2]中以φ(t)擬合f(t), 使滿足φ(ti)=f(ti),φ'(ti)=f'(ti), (i=1,2)(此式記為(1)式)對φ(t)求導並令其等於零, 求得φ(t)在[t1,t2]中由a0,a1,a2和a3表示的極小點運算式, 再由方程組(1)解得a0,a1,a2和a3,將其代入此運算式, 便得f(t)的近似極小點, 逐次反覆運算, 當φ(t)在近似極小點處的導數值的絕對值小於某給定誤差時, 反覆運算停止. 三次插值法尋求極小點比二次插值法(抛物線插值法)有更快的收斂速度, 但其每一輪反覆運算的計算量則比二次插值法要大.

請將下面代碼加入, 即可獲得平滑的曲線

x=np.linspace(0, 10, 200)
f3 = interp1d(time, value, kind='cubic')#取得三次插值法函數
y = f3(x)#取得三次插值的值
plt.plot(x, y, label='cubic interpolate')

matplotlib_5

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *