Curve Fitting
曲線擬合是一種把現有數據透過數學方法來代入一條數式的表示方式。
科學和工程問題可以通過諸如採樣、實驗等方法獲得若干離散的數據,
根據這些數據,我們往往希望得到一個連續的函數(也就是曲線)或者
更加密集的離散方程與已知數據相吻合,這過程就叫做擬合 (fitting)。
方程
在笛卡兒平面上是一條直線,而這條直線的
斜率是
a。
因為任何兩點可以決定一條直線,因此總能找到次數不多於1的多項式來
串起任何兩個x值相異的點。
如果把多次式的次數增加到2
那麼只要給定x值各異的3點,總會有次數不多於2的多項式可以把它們串起。
如果把多次式的次數再增加到3
那麼只要給定x值各異的4點,總會有次數不多於3的多項式可以把它們串起。
我以3次曲線來示範,假如我有以下的點
x | y |
52010 | -3.89177 |
52104 | -2.756 |
52198 | -2.11687 |
52292 | -1.91851 |
52386 | -2.12506 |
52480 | -2.70859 |
52574 | -3.62756 |
用Excel畫出來圖形如下
我可以透過Curve Fitting來求出曲線上的點,以python做示範
import numpy as np
x = np.array([52010,52104,52198,52292,52386,52480,52574])
y=np.array([-3.89177,-2.756,-2.11687,-1.91851,-2.12506,-2.70859,-3.62756])
z = np.polyfit(x, y, 3)
print z
會求出4個系數,分別是a,b,c,d
[ 7.52449150e-09 -1.20358144e-03 6.41491191e+01 -1.13927772e+06]
也就是
y'=
7.52449150e-09 X^3 + -1.20358144e-03 X^2 + 6.41491191e+01 X + -1.13927772e+06
我們再用excel把x值代入求y'看看,我們就可以求得曲線上原本沒有量測到的數據的
預估值。
x | y' |
52010 | -3.89E+00 |
52020 | -3.75E+00 |
52030 | -3.61E+00 |
52040 | -3.47E+00 |
52050 | -3.35E+00 |
52060 | -3.23E+00 |
52070 | -3.11E+00 |
52080 | -3.00E+00 |
52090 | -2.90E+00 |
52100 | -2.80E+00 |
52110 | -2.70E+00 |
52120 | -2.62E+00 |
52130 | -2.53E+00 |
52140 | -2.46E+00 |
52150 | -2.39E+00 |
52160 | -2.32E+00 |
52170 | -2.26E+00 |
52180 | -2.20E+00 |
52190 | -2.15E+00 |
52200 | -2.11E+00 |
52210 | -2.06E+00 |
52220 | -2.03E+00 |
52230 | -2.00E+00 |
52240 | -1.97E+00 |
52250 | -1.95E+00 |
52260 | -1.93E+00 |
52270 | -1.92E+00 |
52280 | -1.92E+00 |
52290 | -1.92E+00 |
52300 | -1.92E+00 |
52310 | -1.93E+00 |
52320 | -1.94E+00 |
52330 | -1.95E+00 |
52340 | -1.97E+00 |
52350 | -2.00E+00 |
52360 | -2.03E+00 |
52370 | -2.06E+00 |
52380 | -2.10E+00 |
52390 | -2.14E+00 |
52400 | -2.19E+00 |
52410 | -2.24E+00 |
52420 | -2.30E+00 |
52430 | -2.35E+00 |
52440 | -2.42E+00 |
52450 | -2.48E+00 |
52460 | -2.56E+00 |
52470 | -2.63E+00 |
52480 | -2.71E+00 |
52490 | -2.79E+00 |
52500 | -2.88E+00 |
52510 | -2.97E+00 |
52520 | -3.06E+00 |
52530 | -3.16E+00 |
52540 | -3.26E+00 |
52550 | -3.36E+00 |
52560 | -3.47E+00 |
52570 | -3.58E+00 |
52580 | -3.69E+00 |
52590 | -3.81E+00 |
52600 | -3.93E+00 |
點多了,畫出來的曲線就比較圓滑了
我們比較一下原本有量測的y值,與Curve Fitting出來的y'值其實蠻接近的,
但仍有些許差異,求出來的點僅供參考,並非一定等於實際量測出來的值。
x | y | y' |
52010 | -3.89177 | -3.89E+00 |
52104 | -2.756 | -2.76E+00 |
52198 | -2.11687 | -2.11E+00 |
52292 | -1.91851 | -1.92E+00 |
52386 | -2.12506 | -2.13E+00 |
52480 | -2.70859 | -2.71E+00 |
52574 | -3.62756 | -3.63E+00 |
y和y'圖形幾乎是疊在一起的
如果在運算過中發生異常,建議先將x及y做normalize
當我們求出a,b,c,d四個系數後,可以求得極值(X軸對應極值位置、Y軸極值的值)。
3次曲線有2個極值,所以你要判斷那一個才是你要的。例如我要找最靠近0的那一個極值。
求Xe時,需要先注意一下
與
是否有任何一個為0 ,若有一個為0 ,則代表我要找的極值為0,也就是原始資料中的
X軸資料52292。
否則為
或
其中一個靠近0的值
Ye為以下公式
資料來源: