三次样条插值算法

   在[a,b]上分为n段,共n+1个点。插入3次多项式,并使其二阶导数连续的方法称为三次样条插值算法。

思路:

1.二阶导数为线性函数。

2.插值点的函数值已知、一阶导数、二阶导数连续。

3.加上边界条件即可求解。

边界条件

1.夹持条件:已知起点和终点的速度。

2.自然边界条件:已知奇点和终点的加速度。

3.周期性条件:假设f为以b-a为周期的周期函数        

 

插值方法:

假设:第i个点的二阶导数为Mi,则在[xi-1,xi]上,其二阶导数为线性函数

则在[xi-1,xi]上进行线性插值

 

进行二次积分得到原函数 

 

线性插值有:

 得到原函数:

对各段函数求导 

 

由连续性条件 

两边同乘 

则可写成

添加边界条件1 

 

可写成

可写成

写成矩阵形式

结合以下五个式子即可求解

 

实例matlab介绍 

%三次样条插值
x=[0 1 4 5];
y=[0 -2 -8 -4];
dy1=5/2;
dy4=19/4;
n=4;

%计算h
for i=2:n
    h(i)=x(i)-x(i-1);
end

%计算u,v,g
for i=2:n-1
    u(i)=h(i)/(h(i)+h(i+1));
    v(i)=1-u(i);
    g(i)=6/(h(i)+h(i+1))*((y(i+1)-y(i))/h(i+1)-(y(i)-y(i-1))/h(i));%明天修改
end

g(1)=6/h(2)*((y(2)-y(1))/h(2)-dy1);
g(4)=6/h(4)*(dy4-(y(4)-y(3))/h(4));


%系数矩阵
A=zeros(4,4);
for i=1:n
    if i==1
        A(i,1)=2;
        A(i,2)=1;
    else if i==n
            A(i,n-1)=1;
            A(i,n)=2;
        else 
            A(i,i)=2;
            A(i,i-1)=u(i);
            A(i,i+1)=v(i);
        end
    end
end
 
m=inv(A)*g';

syms t
for i=2:4
    a(i)=m(i-1)/(6*h(i));
    b(i)=m(i)/(6*h(i));
    c(i)=(y(i-1)-m(i-1)*h(i)^2/6)/h(i);
    d(i)=(y(i)-m(i)*h(i)^2/6)/h(i);
end

t1=0:0.01:1;
t2=1:0.01:4;
t3=4:0.01:5;
plot(t1,fthreesample(m,x,y,h,2,t1))
hold on
plot(t2,fthreesample(m,x,y,h,3,t2))
plot(t3,fthreesample(m,x,y,h,4,t3))
function f=fthreesample(m,x,y,h,k,t)
% 
for i=2:4
    a(i)=m(i-1)/(6*h(i));
    b(i)=m(i)/(6*h(i));
    c(i)=(y(i-1)-m(i-1)*h(i)^2/6)/h(i);
    d(i)=(y(i)-m(i)*h(i)^2/6)/h(i);
end

f=a(k)*(x(k)-t).^3+b(k)*(t-x(k-1)).^3+c(k)*(x(k)-t)+d(k)*(t-x(k-1))

插值结果如下:

  • 12
    点赞
  • 151
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值