埃尔米特插值算法运用
Hermite插值法是解决数学建模中预测类问题的最常用的方法,可以有效的解决“已知数据”数量不够的问题。
但是,直接使用Hermite插值得到的多项式次数较高,也存在着“龙格现象(Runge phenomenon)”。因此,在实际应用中,往往使用分段三次Hermite插值多项式(PCHIP),来提高“模拟数据的准确性”。
这里要说明一下“龙格现象(Runge phenomenon)”,
龙格现象(Runge phenomenon)
简单的解释为:插值多项式的震荡,即在两段处波动极大,产生明显的震荡。
Hermite插值法的含义
保持插值曲线在节点处有切线(光滑),使得插值函数和被插值函数的密合程度更好。
不但要求在节点处上的函数值相等,而且还要求对应的导数值也相等,甚至要求高阶导数也相等,满足这种要求的插值多项式就是“Hermite插值多项式”。
Hermite插值原理
Hermite插值法的代码实现
function y=hermite(x0,y0,y1,x)
n=length(x0);
m=length(x);
for k=1:m
yy=0.0;
for i=1:n
h=1.0;
a=0.0;
for j=1:n
if j~=i
h=h*((x(k)-x0(j))/(x0(i)-x0(j)))^2;
a=1/(x0(i)-x0(j))+a;
end
end
yy=yy+h*((x0(i)-x(k))*(2*a*y0(i)-y1(i))+y0(i));
end
y(k)=yy;
end
end
例题应用
给定如下数据,试构造Hermite多项式求出sin0.34的近似值。并画图与标准值对比。
x 0.3 0.32 0.35
sinx 0.29552 0.31457 0.34290
(sinx)’ 0.95534 0.94924 0.93937
解:
MATLAB代码如下:
clc;clear;
x0=[0.3,0.32,0.35];
y0=[0.29552,0.31457,0.34290]; %函数值
y1=[0.95534,0.94924,0.93937]; %导数值
format long;
y=hermite(x0,y0,y1,0.34)
%画图
x=[0.3:0.005:0.35];
y=hermite(x0,y0,y1,x);
plot(x,y,'b') %蓝色为插值计算结果
y2=sin(x); %标准值
hold on
plot(x,y2,'r--') %红色为标准值
%函数部分
function y=hermite(x0,y0,y1,x)
n=length(x0);
m=length(x);
for k=1:m
yy=0.0;
for i=1:n
h=1.0;
a=0.0;
for j=1:n
if j~=i
h=h*((x(k)-x0(j))/(x0(i)-x0(j)))^2;
a=1/(x0(i)-x0(j))+a;
end
end
yy=yy+h*((x0(i)-x(k))*(2*a*y0(i)-y1(i))+y0(i));
end
y(k)=yy;
end
end
运行结果: