登山第八梯:三次样条拟合——滑溜的很

一 简介

四 代码演示

        此处以固定边界为例,进行代码演示

function [x2,y2]=Spline_3(x,y)  
n=len(x);
if n<=3
    disp('数组长度过短!')
    return
end
if n~=len(y)
    disp('两个数组长度必须相同!')
    return
end
 
if nargin==2
    dx=zeros(1,2);
    dx(1)=(y(2)-y(1))/(x(2)-x(1));
    dx(2)=(y(n)-y(n-1))/(x(n)-x(n-1));
    %指定末端点的导数值
else
    return;
end
%========预分配内存空间===============================
h=zeros(n-1,1);  %步长
delta_y=zeros(n-1,1);   %增量
%解对应的系数
A=zeros(n-1,1);
B=zeros(n-1,1);
C=zeros(n-1,1);
D=zeros(n-1,1);
%G和f为需要解的n*n矩阵及其数值
G=zeros(n,n);  %是 n*n 矩阵,右端有n个二阶导数值
f=zeros(n,1);  % f是右边的矩阵
%=========================
 
for i=1:1:n-1
    h(i)=x(i+1)-x(i);
    delta_y(i)=y(i+1)-y(i); %每次y的增量
end
%   A是y(i)而B是导数
 
%if nargin==2     %这个留在后续可能要加三弯矩时使用
%采用三转角构造方式
    G(1,1)=2*h(1);
    G(1,2)=h(1);
    %n个数据共有n个导数值,这里取第n个来列方程(b(n)是倒数第一个)
    %参考资料的b(n-1)有误,应当是b(n)
    G(n,n-1)=h(n-1); 
    G(n,n)=2*h(n-1);
    a=dx(1);
    b=dx(2);
%=============构造矩阵=====================
    %填写G矩阵中其余的参数()
    for i=2:1:n-1  %从2行到n-1行的数据
        G(i,i-1)=h(i-1);
        G(i,i)=2*(h(i)+h(i-1));
        G(i,i+1)=h(i);
    end
    
    f(1)=6*( delta_y(1)/h(1) - a  ) ;    
    %在默认情况下,采用最前方的斜率代替导数值时,f(1)必然为0
    f(n)=6*(  b-delta_y(n-1)/h(n-1)  );
    %同理默认情况下  f(n-1)=0
    for i = 2:1:n-1
        f(i)=6*(delta_y(i)/h(i)-delta_y(i-1)/h(i));
    end
    %m为二阶导数值
    m=G\f;   
    %是G\f(实际上是inv(G)*f  )解出m 的值(这个看错检查我好长时间QAQ)
    m=m';
    
%=====================================================
    %计算每段样条插值的系数:
    for i=1:1:n-1
        A(i)=y(i);
        B(i)=  (y(i+1)-y(i))/h(i) -h(i)*m(i)/2 - h(i)/6*(m(i+1)-m(i));
        C(i)=m(i)/2;
        D(i)=(m(i+1)-m(i))/(6*h(i));
    end
    
%*******注意:从这里设置插值后绘制函数的精度*****可以有不同的要求,
%这里设为0.001
    x_2=min(x):0.001:max(x);  %如果用x2会有问题
    x_2=x_2';   %行向量
    %绘制插值曲线
    y2=zeros(len(x_2),1);
    j=1;

        
    for i=1:1:len(x_2)
        while x_2(i)>x(j+1)  %变换插值函数
            j=j+1;
        end
        y2(i)=A(j)   +B(j)*(x_2(i)-x(j))  +C(j)*(x_2(i)-x(j))^2  +  D(j)*(x_2(i)-x(j))^3;
    end
 
%end    %三转角构造方式
x2=x_2;
 
 
end
clear all;
close all;
clc;
t_raw = 0:0.01:10;
y_raw = cos(t_raw);
t=0:1:10;
y=cos(t);
[t2,y2]=Spline_3(t,y)
plot(t2,y2,'r-')
hold on 
plot(t_raw,y_raw,'g-')

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点云登山者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值