埃尔米特(Hermite)插值

     Hermite插值满足在节点上等于给定函数值,而且在节点上的导数值也等于给定的导数值。对于高阶导数的情况,Hermite插值多项式比较复杂,在实际情况中,常常遇到的是函数值与一阶导数给定的情况。在此情况下,n个节点x1,x2,…,xn的Hermite插值多项式的表达式如下:


其中:

埃尔米特(Hermite)插值_第1张图片

这样就很容易写出代码了,关键就是记住公式。

matlab中的实现:

Hermite.m

function f = Hermite(x,y,y_1,x0)
%求已知数据点的向后差分牛顿插值多项式
%已知数据点的x 坐标向量:x
%已知数据点的y 坐标向量:y
%已知数据点的导数向量:y_1
%求得的Hermite插值多项式或x0处的插值:f
syms t;
f = 0.0;

if(length(x) == length(y))
    if(length(y) == length(y_1))
        n = length(x);
    else
        disp('y和y的导数的维数不相等!');
        return;
    end
else
    disp('x和y的维数不相等!');
    return;
end
for i=1:n
    h = 1.0;
    a = 0.0;
    
    %%计算hi和ai
    for j=1:n
        if( j ~= i)
            h = h*(t-x(j))^2/((x(i)-x(j))^2);
            a = a + 1/(x(i)-x(j));
        end
    end
    
    f = f + h*((x(i)-t)*(2*a*y(i)-y_1(i))+y(i));
    
    if(i==n)
        if(nargin == 4)
            f = subs(f,'t',x0);
        else
            f = vpa(f,6);
        end
    end
end


HermiteInsert.m

x=1:0.2:1.8;
y=[1 1.0954 1.1832 1.2649 1.3416];
y_1=[0.5 0.4564 0.4226 0.3953 0.3727];
f=Hermite(x,y,y_1)
f=Hermite(x,y,y_1,1.44)

x1=0:2*pi;
y1=sin(x1);
y1_1=cos(x1);
xx=0:0.5:2*pi;
yy=Hermite(x1,y1,y1_1,xx);
plot(x1,y1,'o',xx,yy,'r')

埃尔米特(Hermite)插值_第2张图片


你可能感兴趣的:(算法,matlab,插值)