手把手教用matlab做无人驾驶(一)-三次样条插值生成轨迹

本文介绍了一种使用Matlab实现三次样条插值的方法,包括算法步骤、矩阵方程求解及样条曲线系数计算等内容,并给出了完整的Matlab程序示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

matlab做深度学习会继续更新,这里最近看这个,所有写了这个:

关于理论部分可以看这篇文章,https://blog.youkuaiyun.com/adamshan/article/details/80696881

1.3 算法总结

假定有n+1个数据节点

image

a. 计算步长image (i = 0, 1, …, n-1)

b. 将数据节点和指定的首位端点条件带入矩阵方程

c. 解矩阵方程,求得二次微分值image。该矩阵为三对角矩阵,具体求法参见我的上篇文章:三对角矩阵的求解

d. 计算样条曲线的系数:

image

其中i = 0, 1, …, n-1

e. 在每个子区间image 中,创建方程

image

matlab程序,这里function程序是计算a、b、c、d:

function [a,b,c,d]=cubic(x,y)
%{
这段程序主要是求三次样条插值的系数 y=ax^3+bx^2+cx+d
作者:Robert.Cao
 %}
nx=length(x);  %计算x长度
h=diff(x);  %计算x之间的差
a=y;   %系数a
A=zeros(7,7);
A=[1,1];
for i=2:nx
    if i~=nx
         A(i,i)= 2.0 * (h(i-1) + h(i));
    end
    A(i, i-1)= h(i-1);
    A(i-1, i)= h(i-1);
    A(1,2) = 0.0;
    A(nx,nx - 1)= 0.0;
    A(nx, nx)= 1.0;
end

B=zeros(7,1);
for i=2:nx-1
    B(i,1)=6.0 * (a(i + 1) - a(i)) / h(i) - 6.0 * (a(i) -a(i-1)) / h(i-1);
end
m=inv(A)*B;   %解方程组求m
c=m/2.0;  %系数c
    
for i=1:nx-1
    d(i)=(c(i + 1) - c(i)) / (3.0 * h(i));  %计算系数d
    b(i) = (a(i + 1) - a(i)) / h(i) - h(i) * (c(i + 1) + 2.0 * c(i)) / 3.0;%系数b
end
 

主函数程序:

 

x = [-4., -2, 0.0, 2, 4, 6, 10];
y = [1.2, 0.6, 0.0, 1.5, 3.8, 5.0, 3.0];
[a,b,c,d]=cubic(x,y);


mx=-4:0.01:10;

L=length(mx);
for i=1:L
    rx=mx(i);
    if rx==10
        rx=rx-0.01;
    else
        rx=rx;
    end
    rx=floor(rx);
    if mod(rx,2)==0
        rx=rx;
    else
        rx=rx-1;
    end
    if rx==8
        rx=rx-2;
    else
        rx=rx;
    end
    
    low = 0; 
    high = length(x); 
    while(low <= high)
        mid = (low + high)/2;
        mid=ceil(mid)
        midval = x(mid);
        if midval < rx
            low = mid + 1; 
        elseif midval > rx
            high = mid - 1; 
        else
           nx(i)=mid;
           break;
        end
    end
end

for i=1:L
dx(i)=mx(i)-x(nx(i));
 ry(i) = a(nx(i))+ b(nx(i)) * dx(i)+ c(nx(i))* dx(i) ^ 2.0 +d(nx(i)) * dx(i)^3.0;
end
figure
plot(x,y)
hold on
plot(mx,ry,'-r')
这里查找用了二分法查找。

仿真结果如下:

从图中可以看出拟合的结果。

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值