插值方法:
拉格朗日插值和牛顿插值仅仅要求插值多项式在插值节点处与被插函数有相等的函数值,而这种插值多项式却不能全面反映被插值函数的性态。
然而在许多实际问题中,不仅要求插值函数与被插值函数在所有节点处有相同的函数值,它也需要在一个或全部节点上插值多项式与被插 函数有相同的低阶甚至高阶的导数值。不但要求在节点上的函数值相等,而且还要求对应的导数值也相等,甚至要求高阶导数也相等,满足这种要求的插值多项式就是埃尔米特插值多项式。
直接使用 Hermite 插值得到的多项式次数较高,也存在着龙格现象,因此在实际应用中,往往使用分段三次 Hermite 插值多项式 (PCHIP) 。
1.分段三次埃尔米特插值
Matlab 有内置的函数:p = pchip(x,y, new_x)x 是已知的样本点的横坐标 ;y 是已知的样本点的纵坐标 ;new_x 是要插入处对应的横坐标
代码如下:
clc,clear
x=-pi:pi;
y=sin(x);
new_x=-pi:0.1:pi;
p=pchip(x,y,new_x);
plot(x,y,'o',new_x,p,'r-')
得到结果:
plot 函数用法 :plot(x1,y1,x2,y2)线方式: ‐ 实线 : 点线 ‐. 虚点线 ‐ ‐ 波折线点方式: . 圆点 + 加号 * 星号 x x 形 o 小圆颜色: y 黄; r 红 ; g 绿; b 蓝; w 白; k 黑; m 紫; c 青
2.三次样条插值
Matlab 有内置的函数:p = spline (x,y, new_x)x 是已知的样本点的横坐标 ;y 是已知的样本点的纵坐标 ;new_x 是要插入处对应的横坐标
代码如下:
clc,clear
x=-pi:pi;
y=sin(x);
new_x=-pi:0.1:pi;
p1=pchip(x,y,new_x);
p2=spline(x,y,new_x);
plot(x,y,'o',new_x,p1,'r-',new_x,p2,'b-')
legend('sample point','pchip','spline','Location','SouthEast')
得到结果:
legend(string1,string2,string3, …)
分别将字符串 1 、字符串 2 、字符串 3…… 标注到图中,每个字符串对应的图标为画图时的图标。‘Location’ 用来指定标注显示的位置。
n维数据的插值
p = interpn( x1,x2,...,xn , y , new_x1,new_x2,...,new_xn , method )x1,x2,...,xn 是已知的样本点的横坐标y 是已知的样本点的纵坐标坐标new_x1,new_x2,...,new_xn 是要插入点的横坐标
method 是要插值的方法‘linear’ :线性插值(默认算法);‘ cubic’ :三次插值;‘ spline’ :三次样条插值法; ( 最为精准 )‘ nearest’ :最邻近插值算法。
代码如下:
clc,clear
x=-pi:pi;
y=sinx;
y=sin(x);
new_x=-pi:0.1:pi;
p=interpn(x,y,new_x,'spline'); %等价于p=spline(x,y,new_x);
plot(x,y,'o',new_x,p,'r-')
得到结果:
拟合方法
拟合的结果是得到一个确定的曲线,不一定经过每个样本点,但保证误差足够小。
确定拟合曲线(最小二乘法):
设这些样本点为
我们设置的拟合曲线为
问:k和b取何值时,样本点和拟合曲线最接近
另:不用四次方的原因:(1)避免极端数据对拟合曲线的影响
(2)最小二乘法得到的结果和MLE极大似然估计一致
不用奇数次方的原因:误差会正负相抵。
clc,clear
plot(x,y,'o')
xlabel('x的值')
ylabel('y的值')
n=size(x,1)
k=(n*sum(x.*y)-sum(x)*sum(y))/(n*sum(x.*x)-sum(x)*sum(x));
b=((sum(x.*x)*sum(y)-sum(x)*sum(x.*y))/(n*sum(x.*x)-sum(x)*sum(x)));
hold on %继续在之前的图形上作图
grid on %显示网格线
f=@(x)k*x+b;
fplot(f,[2.5,7]);
legend('sample figure','fitting curve','location','SouthEast')
如何评价拟合的好坏:
拟合优度(可决系数):
总体平方和:
误差平方和:
回归平方和:
拟合优度:
越接近1,说明误差平方和越接近0,误差越小说明拟合的越好。
测试代码如下:
y_hat=k*x+b; %拟合系数
ssr=sum((y_hat-mean(y)).^2);
sse=sum((y_hat-y).^2);
sst=sum((y-mean(y).^2);
r_2=ssr/sst; %拟合优度
另:matlab中的cftool工具箱
clc,clear
x = rand(30,1) * 10;
y = 3 * exp(0.5*x) -5 + normrnd(0,1,30,1);
cftool
注:当拟合函数不是“线性”函数是,可以用SSE作为拟合优度。