數(shù)值計算day6-曲線擬合與插值

上節(jié)課主要介紹了特征值與特征向量的概念凡桥,低階矩陣的特征值可以通過列出特征方程求解蟀伸,高階矩陣則可以通過冪法與反冪法迭代求解出最大特征值與最小特征值(模),要求出矩陣的全部特征值則需要借助矩陣的 QR分解來將矩陣相似化為一個上三角矩陣缅刽,相似化過程不改變矩陣的特征值啊掏,因此轉化后的上三角矩陣的對角線元素即為原矩陣的特征值。本節(jié)課主要介紹曲線擬合(機器學習中的線性回歸算法)與插值算法衰猛。

1. 擬合與插值(Fitting, Interpolation)

  • 曲線擬合是給定一個數(shù)據(jù)集迟蜜,構建一個數(shù)學方程能夠最好的匹配這些數(shù)據(jù)點
  • 插值則是構建一個多項式方程來完美地契合給定的數(shù)據(jù)集,當數(shù)據(jù)點比較少的時候啡省,一個簡單的多項式方程就可以實現(xiàn)插值娜睛,而數(shù)據(jù)點比較多的時候髓霞,更多地采用的是樣條插值,在各個區(qū)間構建不同的多項式方程
Fitting and Interpolation.png

2. 線性曲線擬合

線性曲線擬合是使用如下線性方程(一元一階多項式畦戒,對應機器學習線性回歸算法中只有一個特征的情況)來擬合給定的數(shù)據(jù)集:f(x)=a_1x+a_0 若數(shù)據(jù)集中只有兩個點方库,則該線性方程可以準確求解出來,通過這兩個點障斋;當數(shù)據(jù)集超過兩個點時薪捍,該線性方程無法通過所有的數(shù)據(jù)點,此時需要找出擬合數(shù)據(jù)點最好的那個方程配喳。

image.png

如何衡量擬合的準確度?對數(shù)據(jù)點凳干,定義和的差值為殘差:
image.png

一個可選的衡量測度是計算殘差和: 然而這種測度有時候會不好用晴裹,因為當有些點殘差為很大的正數(shù),而有些點殘差為很小的負數(shù)時救赐,將會給出一個接近于的殘差和涧团,
image.png

另外一個可選的測度是殘差的絕對值和: 該測度總是正的,可以用來衡量擬合的精度经磅,但無法用來確定哪個是最好的擬合曲線泌绣,因為不同的擬合曲線有可能給出相同的殘差絕對值和。
image.png

因此预厌,一個誤差函數(shù)應該既能夠衡量擬合曲線的好壞阿迈,又能夠用來確定出唯一地擬合曲線,目前廣泛采用的是殘差的平方和: 采用線性最小二乘回歸算法就可以找出使得上述誤差最小的那條擬合曲線轧叽。給定數(shù)據(jù)集苗沧,是關于的非線性方程,結合微積分相關概念炭晒,可知取最小值的點滿足: 化簡有: 其解為: 如果定義 則有
MATLAB實現(xiàn):

function [a1,a0] = LinearRegression(x, y)
% LinearRegration calculates the coefficients a1 and a0 of the linear
% equation y = a1*x + a0 that best fit n data points.
% Input variables:
% x    A vector with the coordinates x of the data points.
% y    A vector with the coordinates y of the data points.
% Output variable:
% a1   The coefficient a1.
% a0   The coefficient a0.

nx = length(x);
ny = length(y);
if nx ~= ny
    disp('ERROR: The number of elements in x must be the same as in y.')
    a1 = 'Error';
    a0 = 'Error';
else
Sx = sum(x);
Sy = sum(y);
Sxy = sum(x.*y);
Sxx = sum(x.^2);
a1 = (nx*Sxy - Sx*Sy)/(nx*Sxx - Sx^2);
a0 = (Sxx*Sy - Sxy*Sx)/(nx*Sxx - Sx^2);
end

3. 非線性曲線擬合

很多實際應用中待逞,使用線性方程的擬合效果不夠好,采用非線性擬合則能夠達到比較好的效果网严。
image.png
3.1 常見的幾種非線性方程

(這里同線性擬合類似识樱,只考慮單變量的情況,對應線性回歸算法中的一個特征):y=bx^m y=be^{mx} y=\frac{1}{mx+b} 對非線性擬合震束,很容易將其改寫為線性形式:ln(y)=mln(x)+ln(b) ln(y) = mx+ln(b) \frac{1}{y}=mx+b 將數(shù)據(jù)集進行相應的特征變換后怜庸,采用線性最小二乘法求解相應的參數(shù)。然而驴一,對于給定的數(shù)據(jù)集休雌,如何判斷使用哪一種非線性方程進行擬合呢?一個可行的方案是首先通過繪制數(shù)據(jù)集中的點(當特征很多時肝断,很難可視化)杈曲,確定是選擇線性還是非線性進行擬合驰凛,如果選擇非線性擬合,具體選擇哪一種非線性方程則要取決于其背后的物理現(xiàn)象和數(shù)學原理担扑。同樣的恰响,可以通過以特定的方式繪制數(shù)據(jù)點并檢查這些點是否符合直線來預測所提出的非線性函數(shù)是否具有很好的擬合能力。
MATLAB實現(xiàn):

texp = 2:2:30;
vexp = [9.7 8.1 6.6 5.1 4.4 3.7 2.8 2.4 2.0 1.6 1.4 1.1 0.85 0.69 0.6];
vexpLOG = log(vexp);
R = 5E6;
[a1,a0] = LinearRegression(texp, vexpLOG)
b = exp(a0)
C = -1/(R*a1)
t = 0:0.5:30;
v = b*exp(a1*t);
plot(t,v,texp,vexp,'or')
image.png
3.2 二次及高階多項式擬合

多項式是指具有如下形式的函數(shù)(單變量):f(x)=a_nx^n+a_{n-1}x^{n-1}+...+a_1x+a_0 n稱作多項式的階數(shù)涌献。如果給定數(shù)據(jù)集中有n個點胚宦,則可以確定n-1個從1階到n-1階的擬合多項式,其中n-1階多項式可以實現(xiàn)通過每一個數(shù)據(jù)點燕垃,但并不是多項式的階數(shù)越高越好枢劝,這取決于實際問題,當數(shù)據(jù)集點本身就具有噪聲污染時卜壕,提高擬合的階數(shù)并沒有意義您旁。(同機器學習中的過擬合,overfitting類似)

image.png

對多項式擬合轴捎,采用多項式回歸算法來確定各個參數(shù)鹤盒。給定個數(shù)據(jù)點,想要使用階多項式對其進行擬合: 以為例侦副,首先定義總誤差: 要讓總誤差最小侦锯,取對應的導數(shù)為即可: 將其更改為線性系統(tǒng)形式:
該線性系統(tǒng)的解即為多項式的各個參數(shù)。
MATLAB實現(xiàn):

clear, clc
x = 0:0.4:6;
%x=1:4
y = [0 3 4.5 5.8 5.9 5.8 6.2 7.4 9.6 15.6 20.7 26.7 31.1 35.6 39.3 41.5];
n = length(x);
m = 4;
for i = 1:2*m
    xsum(i) = sum(x.^(i));
end
% Beginning of Step 3
a(1,1) = n;
b(1,1)= sum(y);
for j= 2:m+1
    a(1,j)=xsum(j-1);
end
for i = 2:m+1
    for j=1:m+1
        a(i,j)= xsum(j+i-2);
    end
    b(i,1) = sum(x.^(i-1).*y);
end
% Step 4
p=(a\b)'
for i = 1:m+1
    Pcoef(i) = p(m+2-i);
end
epsilon=0:0.1:6;
stressfit=polyval(Pcoef,epsilon);
plot(x,y,'ro',epsilon,stressfit,'k','linewidth',2)
xlabel('Strain','fontsize',20)
ylabel('Stress (MPa)','fontsize',20)
%%%%%%%%%%%%%%%%%%%%
>> help polyval
polyval - 多項式計算

  此 MATLAB 函數(shù) 返回在 x 處計算的 n 次多項式的值秦驯。輸入?yún)?shù) p 是長為 n+1 的向量尺碰,
其元素是按要計算的多項式降冪排序的系數(shù)。

    y = polyval(p,x)
    [y,delta] = polyval(p,x,S)
    y = polyval(p,x,[],mu)
    [y,delta] = polyval(p,x,S,mu)

    See also polyder, polyfit, polyint, polyvalm

    Reference page for polyval
    Other functions named polyval
image.png

上述多項式擬合可以擴展到更一般的情況:f(x)=c_1f_1(x)+c_2f_2(x)+...+c_mf_m(x) 定義總誤差為 E=\sum^n_{i=1} [y_i-\sum^m_{j=1}c_jf_j(x_i)]^2 令偏導為0 \frac{\partial E}{\partial c_k} = 2\sum^n_{i=1}(y_i-\sum^m_{j=1}C_jf_j(x_i))(-f_k(x_i))=0,k=1,...,m 改為線性系統(tǒng)形式译隘,有\sum^n_{i=1}\sum^m_{j=1}c_{j}f_j(x_i)f_k(x_i)=\sum^n_{i=1}y_if_k(x_i),k=1,...,m 矩陣形式為 \begin{bmatrix}\sum^n_{i=1}f^2_1(x_i) & \sum^n_{i=1}f_1(x_i)f_2(x_i) & \cdots & \sum^n_{i=1}f_m(x_i)f_1(x_i) \\ \sum^n_{i=1}f_1(x_i)f_2(x_i) & \sum^n_{i=1}f^2_2(x_i) & \cdots & \sum^n_{i=1}f_m(x_i)f_2(x_i)\\ \vdots & \vdots & \ddots & \vdots\\ \sum^n_{i=1}f_1(x_i)f_m(x_i) & \sum^n_{i=1}f_2(x_i)f_m(x_i) & \cdots & \sum^n_{i=1}f^2_m(x_i) \end{bmatrix}\begin{bmatrix}c_1\\c_2\\ \vdots \\ c_m \end{bmatrix}=\begin{bmatrix}\sum^n_{i=1}y_if_1(x_i)\\\sum^n_{i=1}y_if_2(x_i) \\ \vdots \\ \sum^n_{i=1}y_if_m(x_i) \end{bmatrix}
MATLAB實現(xiàn):
f(x)=\frac{A}{x}+\frac{Be^{-2x^2}}{x}

clear all
x = [0.6 0.8 0.85 0.95 1.0 1.1 1.2 1.3 1.45 1.6 1.8];
y = [0.08 0.06 0.07 0.07 0.07 0.06 0.06 0.06 0.05 0.05 0.04];
a(1,1) = sum(1./x.^2);
a(1,2) = sum(exp(-2*x.^2)./x.^2);
a(2,1) = a(1,2);
a(2,2) = sum(exp(-4*x.^2)./x.^2);
b(1,1) = sum(y./x);
b(2,1) = sum((y.*exp(-2*x.^2))./x);
AB = a\b
xfit = 0.6:0.02:1.8;
yfit = AB(1)./xfit + AB(2)*exp(-2*xfit.^2)./xfit;
plot(x,y,'o',xfit,yfit)
image.png

4. 多項式插值

如前所述葱蝗,插值是讓擬合的曲線通過所有給定的數(shù)據(jù)點(總誤差為0,機器學習中的E_{in}0)细燎,對n個點两曼,總是能找到一個n-1階的多項式函數(shù)通過所有的點:P(x) = a_0+a_1x+...+a_mx^m=y 矩陣形式 \begin{bmatrix}x_1^m & x_1^{m-1} & \cdots & x_1 & 1\\ x_2^m & x_2^{m-1} & \cdots & x_2 & 1\\ \vdots & \vdots & \ddots & \vdots & \vdots\\ x_n^m & x_n^{m-1} & \cdots & x_n & 1 \end{bmatrix}\begin{bmatrix}a_m \\ a_{m-1}\\ \vdots \\ a_0\end{bmatrix}=\begin{bmatrix}y_1 \\ y_2\\ \vdots \\ y_n\end{bmatrix}

4.1 多項式插值的拉格朗日形式:
image.png

考慮兩個點(x_1,y_1), (x_2,y_2),其一階拉格朗日多項式具有如下形式:y=a_1(x-x_2)+a_2(x-x_1) 令該函數(shù)通過這兩個點玻驻,得 a_1=\frac{y_1}{x_1-x_2}, a_2=\frac{y_2}{x_2-x_1} 因此多項式為:y=\frac{y_1(x-x_2)}{x_1-x_2}+\frac{y_2(x-x_1)}{x_2-x_1} 類似地悼凑,對三個點(x_1,y_1),(x_2,y_2),(x_3,y_3),可得其二階拉格朗日具有形式y=\frac{(x-x_2)(x-x_3)}{(x_2-x_1)(x_3-x_1)}y_1+\frac{(x-x_1)(x-x_3)}{(x_1-x_2)(x_3-x_2)}y_2+\frac{(x-x_1)(x-x_2)}{(x_1-x_3)(x_1-x_3)}y_3 因此璧瞬,拉格朗日多項式的通解形式為:f(x)=\sum^n_{i=1}y_i\prod_{j\neq i}\frac{(x-x_j)}{(x_i-x_j)} MATLAB實現(xiàn):

function Yint = LagrangeINT(x,y,Xint)
% LagrangeINT fits a Lagrange polynomial to a set of given points and
% uses the polynomial to determines the interpolated value of a point.
% Input variables:
% x  A vector with the x coordinates of the given points.
% y  A vector with the y coordinates of the given points.
% Xint  The x coordinate of the point to be interpolated.
% Output variable:
% Yint  The interpolated value of Xint.

n = length(x);
for i = 1:n
    L(i) = 1;
    for j = 1:n
        if j ~= i
            L(i)= L(i)*(Xint-x(j))/(x(i)-x(j));
        end
    end
end
y.*L
Yint = sum(y.*L);
%%%%%%%%
>> x = [1 2 4 5 7];
>> y = [52 5 -5 -40 10];
>> Yinterpolated = LagrangeINT(x,y,3)

ans =

   -5.7778    2.6667   -4.4444   13.3333    0.2222

Yinterpolated =

    6.0000

>> i=1;
>> for x1=0:0.1:10
y1(i)=LagrangeINT(x,y,x1);
i = i+1;
end
>> x1 = 0:0.1:10;
>> plot(x,y,'*',x1,y1)
image.png
4.2 牛頓多項式插值

上述拉格朗日多項式插值有一個缺陷户辫,當數(shù)據(jù)集增加一個插值點時,每個系數(shù)都需要重新計算嗤锉,而牛頓多項式插值則不需要重新計算:f(x)=a_1+a_2(x-x_1)+a_3(x-x_1)(x-x_2)+...+a_n(x-x_1)(x-x_2)...(x-x_{n-1})

image.png

以兩個數(shù)據(jù)點為例 , 容易計算出 當增加一個數(shù)據(jù)點時渔欢, 可以看到 , ,這兩個參數(shù)都沒有發(fā)生變化瘟忱,因此只需計算奥额,通過得苫幢, 一直進行下去,就可以得到牛頓多項式插值的通解形式:
第一層: 其中
第二層: 其中
第三層: 其中
image.png

MATLAB實現(xiàn):

function Yint = NewtonsINT(x,y,Xint)
% NewtonsINT fits a Newtons polynomial to a set of given points and
% uses the polynomial to determines the interpolated value of a point.
% Input variables:
% x  A vector with the x coordinates of the given points.
% y  A vector with the y coordinates of the given points.
% Xint  The x coordinate of the point to be interpolated.
% Output variable:
% Yint  The interpolated value of Xint.

n = length(x);
a(1) = y(1);
for i = 1:n-1
    divDIF(i,1) = (y(i+1)-y(i))/(x(i+1)-x(i));
end
for j = 2:n-1
    for i = 1:n-j
        divDIF(i,j) = (divDIF(i+1,j-1) - divDIF(i,j-1))/(x(j+i) - x(i));
    end
end
for j=2:n
    a(j)=divDIF(1,j-1);
end
Yint=a(1);
xn=1;
for k=2:n
    xn=xn*(Xint-x(k-1));
    Yint=Yint+a(k)*xn;
end

5. 樣條插值

5.1 線性樣條插值

當數(shù)據(jù)點比較少時垫挨,使用低階多項式就可以實現(xiàn)插值韩肝,然而當數(shù)據(jù)點比較多時,插值的多項式需要很高的階數(shù)九榔,這會造成插值點不準確(同回歸中預測不準確)哀峻。因此,這個時候可以采用區(qū)間插值的方法哲泊,即每兩個或三個相鄰點之間剩蟀,構建具有不同參數(shù)的插值多項式(階數(shù)一致)。

線性插值就是每兩個相鄰的點之間構建各自的線性函數(shù)進行插值切威。此時喻旷,第一個點(x_1,y_1)與第二個點(x_2,y_2)之間的插值函數(shù)(拉格朗日插值公式)為:f_1(x)=\frac{x-x_2}{x_1-x_2}y_1+\frac{x-x_1}{x_2-x_1}y_2,同樣地牢屋,很容易得到第i個點(x_i,y_i)與第i+1個點之間的插值函數(shù)為:f_i(x)=\frac{x-x_{i+1}}{x_i-x_{i+1}}y_i+\frac{x-x_i}{x_{i+1}-x_i}y_{i+1},i=1,...,n-1

image.png
可以看到,線性插值是一種連續(xù)插值槽袄,因為相鄰的兩個多項式在同一節(jié)點的值相同烙无,但在該節(jié)點處的斜率(導數(shù))是不連續(xù)的。
MATLAB實現(xiàn):

function Yint = LinearSpline(x, y, Xint)
% LinearSpline calculates interpolation using linear splines.
% Input variables:
% x    A vector with the coordinates x of the data points.
% y    A vector with the coordinates y of the data points.
% Xint The x coordinate of the interpolated point. 
% Output variable:
% Yint The y value of the interpolated point.

n = length(x);
for i = 2:n
    if Xint < x(i)
        break
    end
end
Yint = (Xint - x(i))*y(i-1)/(x(i-1)-x(i)) + (Xint - x(i-1))*y(i)/(x(i)-x(i-1));
5.2 二次樣條插值

給定n個數(shù)據(jù)點遍尺,二次樣條插值是在n-1個區(qū)間內(nèi)各自構建一個二次曲線插值數(shù)據(jù):f_i(x)=a_ix^2+b_ix+c_i,i=1,2,...,n-1 可以看到每個多項式有3個待定系數(shù),共有3n-3個待定系數(shù),因此求解規(guī)則包括:

  • 每個二次曲線在區(qū)間兩端點x_ix_{i+1}的值為y_i,y_{i+1}f_i(x_i)=a_ix^2_i+b_ix_i+c_i=y_i,i=1,2,...,n-1 f_{i}(x_{i+1})=a_{i}x^2_{i+1}+b_ix_{i+1}+c_{i}=y_{i+1},i=1,2,...,n-1 共構建出2n-2個方程
  • 每兩個相鄰區(qū)間的節(jié)點處耳幢,對應多項式的斜率相同(保證導數(shù)連續(xù)):f'_i(x_{i+1})=2a_ix_i+b_i=f'_{i+1}(x_{i+1})=2a_{i+1}x_{i+1}+b_{i+1},i=1,2,...,n-2 共構建n-2個方程
  • 上述條件共構建了3n-4個方程斑粱,想要求解3n-3個參數(shù),還少一個條件鼓择,因此三幻,通常假設第一個點或者最后一個點的二階導數(shù)為零:f''_1(x_1)=2a_1=0 即第一個或最后一個多項式為線性多項式
    image.png
5.3 三次樣條插值

n個數(shù)據(jù)點,三次樣條插值是在n-1個區(qū)間內(nèi)各自構建一個三次多項式進行插值呐能。三次樣條插值包含標準形式與拉格朗日形式念搬。考慮如下標準形式:f_i(x)=a_ix^3+b_ix^2+c_ix+d_i,i=1,2,...,n-1 共有4n-4個待定參數(shù)摆出。求解規(guī)則:

  • 每個三次曲線在區(qū)間兩端點x_ix_{i+1}的值為y_i,y_{i+1}f_i(x_i)=a_ix^3_i+b_ix^2_i+c_ix_i+d_i=y_i,i=1,2,...,n-1 f_{i}(x_{i+1})=a_{i}x^3_{i+1}+b_ix^2_{i+1}+c_{i}x_{i+1}+d_i=y_{i+1},i=1,2,...,n-1 共構建出2n-2個方程
  • 每兩個相鄰區(qū)間的節(jié)點處朗徊,對應多項式的斜率相同(保證一階導數(shù)連續(xù)):f'_i(x_{i+1})=3a_ix^2_i+2b_ix_i+c_i=f'_{i+1}(x_{i+1})=3a_{i+1}x^2_{i+1}+2b_{i+1}x_{i+1}+c_{i+1},i=1,2,...,n-2 共構建n-2個方程
  • 每兩個相鄰區(qū)間的節(jié)點處,對應多項式的二階導數(shù)相同(當從一條曲線轉換為下一條曲線時偎漫,斜率的變化是連續(xù)的):f''_i(x_{i+1})=6a_ix_i+2b_i=f''_{i+1}(x_{i+1})=6a_{i+1}x_{i+1}+2b_{i+1},i=1,2,...,n-2 共構建n-2個方程
  • 上述條件共構建了4n-6個方程爷恳,還差兩個條件,通常要求第一個點和最后一個點的二階導數(shù)為零(自然三次樣條插值象踊,natural cubic splines):6a_1x_1+2b_1=0 6a_{n-1}x_n+2b_{n-1}=0

image.png
三次樣條插值的標準形式易于理解温亲,使用簡單棚壁,但需要求解個線性方程,計算復雜铸豁」嗍铮考慮三次樣條的拉格朗日形式:

  • 從三次多項式的二階導數(shù)出發(fā),三次多項式的二階導數(shù)f''_i(x)是一個線性函數(shù)节芥,采用拉格朗日多項式插值形式(點(x_i,f''_i(x_i)),(x_{i+1},f''_i(x_{i+1}))):f''_i(x)=\frac{x-x_{i+1}}{x_i-x_{i+1}}f''_i(x_i)+\frac{x-x_{i}}{x_{i+1}-x_i}f''_i(x_{i+1}) 積分可得:f'_i(x)=\frac{(x-x_{i+1})^2}{2(x_i-x_{i+1})}f''_i(x_i)+\frac{(x-x_i)^2}{2(x_{i+1}-x_{i})}f''_i(x_{i+1})+C_1 再次積分在刺,有 f_i(x)=\frac{(x-x_{i+1})^3}{6(x_i-x_{i+1})}f''_i(x_i)+\frac{(x-x_{i})^3}{6(x_{i+1}-x_{i})}f''_i(x_{i+1})+C_1x+C_2f_i(x_i)=y_i,f_i(x_{i+1})=y_{i+1} 解得
    C_1=\frac{y_{i+1}-y_i}{x_{i+1}-x_i}+\frac{x_{i+1}-x_{i}}{6}f''_i(x_i)-\frac{x_{i+1}-x_{i}}{6}f''_i(x_{i+1})
    C_2=\frac{y_ix_{i+1}-y_{i+1}x_i}{x_{i+1}-x_i}-\frac{(x_{i+1}-x_i)}{6}f''_i(x_i)x_{i+1}+\frac{(x_{i+1}-x_i)}{6}f''_i(x_{i+1})x_i 因此 \begin{aligned}f_i(x)&=\frac{(x_{i+1}-x)^3}{6(x_{i+1}-x_i)}f''_i(x_i)+\frac{(x-x_{i})^3}{6(x_{i+1}-x_{i})}f''_i(x_{i+1})+C_1x+C_2\\ &=\frac{(x_{i+1}-x)^3}{6(x_{i+1}-x_i)}f''_i(x_i)+\frac{(x-x_{i})^3}{6(x_{i+1}-x_{i})}f''_i(x_{i+1})\\ &+[\frac{y_i}{x_{i+1}-x_i}-\frac{(x_{i+1}-x_i)f''_i(x_i)}{6}](x_{i+1}-x)\\ & +[\frac{y_{i+1}}{x_{i+1}-x_i}-\frac{(x_{i+1}-x_i)f''_i(x_{i+1})}{6}](x-x_{i})\end{aligned},i=1,2,...,n-1 定義 h_i=x_{i+1}-x_i,a_i=f''(x_i),則f_i(x)=\frac{a_i}{6h_i}(x_{i+1}-x)^3+\frac{a_{i+1}}{6h_i}(x-x_i)^3+[\frac{y_i}{h_i}-\frac{h_ia_i}{6}](x_{i+1}-x)+[\frac{y_{i+1}}{h_i}-\frac{h_ia_{i+1}}{6}](x-x_{i}) 進一步利用 f'_i(x_{i+1})=f'_{i+1}(x_{i+1}),i=1,...,n-2头镊,可得:6[\frac{y_{i+2}-y_{i+1}}{h_{i+1}}-\frac{y_{i+1}-y_i}{h_i}]=h_ia_i+2(h_i+h_{i+1})a_{i+1}+h_{i+1}a_{i+2} 注意a_1,a_2,...,a_{n-1},a_n是待定數(shù)蚣驼,然而這里只有n-2個方程,還需要兩個條件相艇,利用標準形式中的最后一個條件颖杏,即第一個點和最后一個點的二階導數(shù)為零,可得a_1=0,a_n=0坛芽。

MATLAB實現(xiàn):

function Yint = CubicSplines(x,y,xint)
n = length(x);
a1=0;
an=0;
A = zeros(n-2,n-2);
b = zeros(n-2,1);
for i=1:n-2
    h(i) = x(i+1)-x(i);
    h(i+1) = x(i+2)-x(i+1);
    if i == 1
       A(i,i) = 2*(h(i)+h(i+1));
       A(i,i+1) =  h(i+1);
       b(i,1) = 6*((y(i+2)-y(i+1))/h(i+1)-(y(i+1)-y(i))/h(i));
    elseif i == n-2
        A(i,i-1) = h(i);
        A(i,i) = 2*(h(i)+h(i+1));
        b(i,1) = 6*((y(i+2)-y(i+1))/h(i+1)-(y(i+1)-y(i))/h(i));
    else
        A(i,i-1) = h(i); 
        A(i,i) = 2*(h(i)+h(i+1));
        A(i,i+1) = h(i+1);
        b(i,1) = 6*((y(i+2)-y(i+1))/h(i+1)-(y(i+1)-y(i))/h(i));
    end
end
 p = A\b;
 a(1) = 0;
 a(n) = 0;
 for i=1:n-2
    a(1+i) = p(i);
 end
 
 for i = 2:n
    if xint <= x(i)
        break
    end
 end
  h(i) = x(i)-x(i-1);
  Yint = a(i-1)/(6*h(i))*(x(i)-xint)^3+a(i)/(6*h(i))*(xint-x(i-1))^3+(y(i-1)/h(i)-a(i-1)*h(i)/6)*(x(i)-xint)+(y(i)/h(i)-a(i)*h(i)/6)*(xint-x(i-1));
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
x = [5 7.5 10 12.5 15 17.5 20 22.5 25 27.5 30];
h = [3.3 7.5 41.8 51.8 61 101.1 132.9 145.5 171.4 225.8 260.9];


xint = 5:0.5:30;
l = length(xint);
yint = zeros(l,1);
for i = 1:l
    yint(i) = CubicSplines(x,h,xint(i));
end
figure
subplot(1,2,1)
plot(x,h,'k*',xint,yint,'r-')
title('cubic')

p = interp1(x,h,xint,'spline');
subplot(1,2,2)
plot(x,h,'k*',xint,p,'r-')
title('spline')
image.png

6. 總結

本節(jié)課主要介紹了曲線的擬合與插值留储,與機器學習中的回歸算法相似。給定一組數(shù)據(jù)集咙轩,擬合是找到最好的曲線來匹配數(shù)據(jù)集中的點(線性回歸获讳,非線性回歸),插值則是找到通過所有數(shù)據(jù)點的曲線活喊。線性回歸是最簡單的曲線擬合算法丐膝,非線性回歸可以通過特征變換轉化為線性回歸,而其中的高階多項式擬合還可以進一步擴展到更一般的情形钾菊,求解方法均是基于最優(yōu)點處的導數(shù)為零得到帅矗。對于插值,任意n個點都可以找到一個n-1階的多項式函數(shù)通過所有數(shù)據(jù)點煞烫,求解方法有拉格朗日法和牛頓法浑此, 拉格朗日法計算簡單,但增加數(shù)據(jù)點時滞详,所有參數(shù)均需重新計算尤勋,而牛頓法則不需要重新計算,但計算較為復雜茵宪。另一方面最冰,當數(shù)據(jù)點比較少時,多項式插值較為簡單稀火,但對于數(shù)據(jù)點較多的情況暖哨,多項式的階數(shù)需要很高,計算復雜,并且插值時并不可靠(過擬合)篇裁。樣條插值是在每個區(qū)間內(nèi)構建各自的多項式插值函數(shù)沛慢,一般有線性樣條插值、二次樣條插值以及三次樣條插值达布。其中為求解簡便团甲,三次樣條插值除了標準形式外,還有一個便于求解的拉格朗日形式黍聂。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末躺苦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子产还,更是在濱河造成了極大的恐慌匹厘,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脐区,死亡現(xiàn)場離奇詭異愈诚,居然都是意外死亡,警方通過查閱死者的電腦和手機牛隅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門炕柔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人媒佣,你說我怎么就攤上這事匕累。” “怎么了丈攒?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長授霸。 經(jīng)常有香客問我巡验,道長,這世上最難降的妖魔是什么碘耳? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任显设,我火速辦了婚禮,結果婚禮上辛辨,老公的妹妹穿的比我還像新娘捕捂。我一直安慰自己,他們只是感情好斗搞,可當我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布指攒。 她就那樣靜靜地躺著,像睡著了一般僻焚。 火紅的嫁衣襯著肌膚如雪允悦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天虑啤,我揣著相機與錄音隙弛,去河邊找鬼架馋。 笑死,一個胖子當著我的面吹牛全闷,可吹牛的內(nèi)容都是我干的叉寂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼总珠,長吁一口氣:“原來是場噩夢啊……” “哼屏鳍!你這毒婦竟也來了?” 一聲冷哼從身側響起姚淆,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤孕蝉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后腌逢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體降淮,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年搏讶,在試婚紗的時候發(fā)現(xiàn)自己被綠了佳鳖。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡媒惕,死狀恐怖系吩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情妒蔚,我是刑警寧澤穿挨,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站肴盏,受9級特大地震影響科盛,放射性物質發(fā)生泄漏。R本人自食惡果不足惜菜皂,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一贞绵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恍飘,春花似錦榨崩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至乳怎,卻和暖如春溯祸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工焦辅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留博杖,地道東北人。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓筷登,卻偏偏與公主長得像剃根,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子前方,可洞房花燭夜當晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容