当前位置:   article > 正文

三次样条插值算法

三次样条插值

   在[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介绍 

  1. %三次样条插值
  2. x=[0 1 4 5];
  3. y=[0 -2 -8 -4];
  4. dy1=5/2;
  5. dy4=19/4;
  6. n=4;
  7. %计算h
  8. for i=2:n
  9. h(i)=x(i)-x(i-1);
  10. end
  11. %计算u,v,g
  12. for i=2:n-1
  13. u(i)=h(i)/(h(i)+h(i+1));
  14. v(i)=1-u(i);
  15. g(i)=6/(h(i)+h(i+1))*((y(i+1)-y(i))/h(i+1)-(y(i)-y(i-1))/h(i));%明天修改
  16. end
  17. g(1)=6/h(2)*((y(2)-y(1))/h(2)-dy1);
  18. g(4)=6/h(4)*(dy4-(y(4)-y(3))/h(4));
  19. %系数矩阵
  20. A=zeros(4,4);
  21. for i=1:n
  22. if i==1
  23. A(i,1)=2;
  24. A(i,2)=1;
  25. else if i==n
  26. A(i,n-1)=1;
  27. A(i,n)=2;
  28. else
  29. A(i,i)=2;
  30. A(i,i-1)=u(i);
  31. A(i,i+1)=v(i);
  32. end
  33. end
  34. end
  35. m=inv(A)*g';
  36. syms t
  37. for i=2:4
  38. a(i)=m(i-1)/(6*h(i));
  39. b(i)=m(i)/(6*h(i));
  40. c(i)=(y(i-1)-m(i-1)*h(i)^2/6)/h(i);
  41. d(i)=(y(i)-m(i)*h(i)^2/6)/h(i);
  42. end
  43. t1=0:0.01:1;
  44. t2=1:0.01:4;
  45. t3=4:0.01:5;
  46. plot(t1,fthreesample(m,x,y,h,2,t1))
  47. hold on
  48. plot(t2,fthreesample(m,x,y,h,3,t2))
  49. plot(t3,fthreesample(m,x,y,h,4,t3))
  1. function f=fthreesample(m,x,y,h,k,t)
  2. %
  3. for i=2:4
  4. a(i)=m(i-1)/(6*h(i));
  5. b(i)=m(i)/(6*h(i));
  6. c(i)=(y(i-1)-m(i-1)*h(i)^2/6)/h(i);
  7. d(i)=(y(i)-m(i)*h(i)^2/6)/h(i);
  8. end
  9. 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))

插值结果如下:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/193323
推荐阅读
相关标签
  

闽ICP备14008679号