三次、五次多项式插值(附代码)

这篇具有很好参考价值的文章主要介绍了三次、五次多项式插值(附代码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


  三次、五次多项式插值在工程实践中很常见。求解多项式的系数最直接的方法是根据端点处的约束条件,列出线性方程组,再写成矩阵方程AX=B,然后用通用的方法(如高斯消元法、LU分解等)解矩阵方程。
  本博文利用matlab符号计算的功能,给出三次、五次多项式插值的系数解析解(不需要解矩阵方程),并尽可能减少运算量。

一、三次多项式插值

  设三次多项式的表达式:
f ( u ) = a 0 + a 1 ( u − u s ) + a 2 ( u − u s ) 2 + a 3 ( u − u s ) 3 (1) f(u)=a_0+a_1(u-u_s)+a_2(u-u_s)^2+a_3(u-u_s)^3 \tag 1 f(u)=a0+a1(uus)+a2(uus)2+a3(uus)3(1)
  这里为什么不设三次多项式表达式为 f ( u ) = a 0 + a 1 u + a 2 u 2 + a 3 u 3 f(u)=a_0+a_1u+a_2u^2+a_3u^3 f(u)=a0+a1u+a2u2+a3u3呢?采用式(1)的表达式,可以大大减少求取多项式系数的计算量,读者可以自行尝试加以对比。

  插值的端点条件为:
{ f ( u s ) = p s f ′ ( u s ) = v s f ( u e ) = p e f ′ ( u e ) = v e (2) \begin{cases} f(u_s)=p_s\\ f'(u_s)=v_s\\ f(u_e)=p_e\\ f'(u_e)=v_e\\ \tag 2 \end{cases} f(us)=psf(us)=vsf(ue)=pef(ue)=ve(2)
  利用matlab符号计算功能,解得:
{ a 0 = p s a 1 = v s a 2 = [ 3 ( p e − p s ) + ( 2 v s + v e ) ( u s − u e ) ] / ( u e − u s ) 2 a 3 = − [ 2 ( p e − p s ) + ( v s + v e ) ( u s − u e ) ] / ( u e − u s ) 3 (3) \begin{cases} a_0=p_s\\ a_1=v_s\\ a_2=[3(p_e-p_s)+(2v_s+v_e)(u_s-u_e)]/(u_e-u_s)^2\\ a_3=-[2(p_e-p_s) + (v_s+v_e)(u_s-u_e)]/(u_e-u_s)^3\\ \tag 3 \end{cases} a0=psa1=vsa2=[3(peps)+(2vs+ve)(usue)]/(ueus)2a3=[2(peps)+(vs+ve)(usue)]/(ueus)3(3)

二、五次多项式插值

  设五次多项式的表达式:
f ( u ) = a 0 + a 1 ( u − u s ) + a 2 ( u − u s ) 2 + a 3 ( u − u s ) 3 + a 4 ( u − u s ) 4 + a 5 ( u − u s ) 5 (4) f(u)=a_0+a_1(u-u_s)+a_2(u-u_s)^2+a_3(u-u_s)^3+a_4(u-u_s)^4+a_5(u-u_s)^5 \tag 4 f(u)=a0+a1(uus)+a2(uus)2+a3(uus)3+a4(uus)4+a5(uus)5(4)

  插值的端点条件为:
{ f ( u s ) = p s f ′ ( u s ) = v s f ′ ′ ( u s ) = a s f ( u e ) = p e f ′ ( u e ) = v e f ′ ′ ( u e ) = a e (5) \begin{cases} f(u_s)=p_s\\ f'(u_s)=v_s\\ f''(u_s)=a_s\\ f(u_e)=p_e\\ f'(u_e)=v_e\\ f''(u_e)=a_e\\ \tag 5 \end{cases} f(us)=psf(us)=vsf′′(us)=asf(ue)=pef(ue)=vef′′(ue)=ae(5)

  利用matlab符号计算功能,解得:
{ a 0 = p s a 1 = v s a 2 = a s / 2 a 3 = [ ( 20 ( p e − p s ) + ( 8 v e + 12 v s ) ( u s − u e ) + ( a e − 3 a s ) ( u e 2 + u s 2 ) + ( 6 a s − 2 a e ) u e u s ) ] / [ 2 ( u e − u s ) 3 ] a 4 = [ − ( 30 ( p e − p s ) + ( 14 v e + 16 v s ) ( u s − u e ) + ( 2 a e − 3 a s ) ( u e 2 + u s 2 ) + ( 6 a s − 4 a e ) u e u s ) ] / [ 2 ( u e − u s ) 4 ] a 5 = [ ( 12 ( p e − p s ) + ( 6 v e + 6 v s ) ( u s − u e ) + ( a e − a s ) ( u e 2 + u s 2 ) + ( 2 a s − 2 a e ) u e u s ) ] / [ 2 ( u e − u s ) 5 ] (6) \begin{cases} a_0=p_s\\ a_1=v_s\\ a_2=a_s/2\\ a_3=[(20(p_e - p_s) + (8v_e + 12v_s)(u_s - u_e) + (a_e - 3a_s)(u_e^2 + u_s^2) + (6a_s - 2a_e)u_eu_s)]/[2(u_e-u_s)^3]\\ a_4=[ -(30(p_e - p_s) + (14v_e + 16v_s)(u_s - u_e) + (2a_e - 3a_s)(u_e^2 + u_s^2) + (6a_s - 4a_e)u_eu_s)]/[2(u_e-u_s)^4]\\ a_5=[(12(p_e - p_s) + (6v_e + 6v_s)(u_s - u_e) + (a_e - a_s)(u_e^2 + u_s^2) + (2a_s - 2a_e)u_eu_s)]/[2(u_e-u_s)^5]\\ \tag 6 \end{cases} a0=psa1=vsa2=as/2a3=[(20(peps)+(8ve+12vs)(usue)+(ae3as)(ue2+us2)+(6as2ae)ueus)]/[2(ueus)3]a4=[(30(peps)+(14ve+16vs)(usue)+(2ae3as)(ue2+us2)+(6as4ae)ueus)]/[2(ueus)4]a5=[(12(peps)+(6ve+6vs)(usue)+(aeas)(ue2+us2)+(2as2ae)ueus)]/[2(ueus)5](6)

三、matlab代码

%{
Function: solve_polyInp_coes
Description: 求解三次、五次插值多项式的系数
Input: 插值多项式结构体
Output: 三次、五次插值多项式的系数a,状态sta(1表示成功,0表示失败)
Author: Marc Pony(marc_pony@163.com)
%}
function [a, sta] = solve_polyInp_coes(polyInp)

sta = 1;

us = polyInp.us;
ue = polyInp.ue;
ps = polyInp.ps;
pe = polyInp.pe;
vs = polyInp.vs;
ve = polyInp.ve;
as = polyInp.as;
ae = polyInp.ae;

if abs(ue - us) < 1.0e-8
    sta = 0;
    a = [];
    return;
end

if polyInp.order == 3
    a = zeros(1, 4);
    temp = zeros(1, 2);
    temp(1) = 1.0 / (ue - us) / (ue - us);
    temp(2) = temp(1) / (ue - us);
    a(1) = ps;
    a(2) = vs;
    a(3) = (3*(pe - ps) + (2*vs + ve)*(us - ue)) * temp(1);
    a(4) = -(2*(pe - ps) + (ve + vs)*(us - ue)) * temp(2);
elseif polyInp.order == 5
    a = zeros(1, 6);
    temp = zeros(1, 5);
    temp(1) = 0.5 / (ue - us) / (ue - us) / (ue - us);
    temp(2) = temp(1) / (ue - us);
    temp(3) = temp(2) / (ue - us);
    temp(4) = ue * ue + us * us;
    temp(5) = ue * us;
    
    a(1) = ps;
    a(2) = vs;
    a(3) = 0.5 * as;
    a(4) = (20*(pe - ps) + (8*ve + 12*vs)*(us - ue) + (ae - 3*as)*temp(4) + (6*as - 2*ae)*temp(5)) * temp(1);
    a(5) = -(30*(pe - ps) + (14*ve + 16*vs)*(us - ue) + (2*ae - 3*as)*temp(4) + (6*as - 4*ae)*temp(5)) * temp(2);
    a(6) = (12*(pe - ps) + (6*ve + 6*vs)*(us - ue) + (ae - as)*temp(4) + (2*as - 2*ae)*temp(5)) * temp(3);
else
    disp('仅支持3次,5次多项式')
    sta = 0;
    a = [];
    return;
end

end
clc
clear
close all

%% 求解三次多项式系数符号解
syms us ue ps pe vs ve as ae real

%f(u) = a0 + a1*u + a2*u^2 + a3*u^3
%f'(u) = a1 + 2*a2*u + 3*a3*u^2
A1 = [1, us, us^2, us^3
    0, 1, 2*us, 3*us^2
    1, ue, ue^2, ue^3
    0, 1, 2*ue, 3*ue^2
    ];
B1 = [ps; vs; pe; ve];
a1 = simplify(A1 \ B1)

%f(u) = a0 + a1*(u - us) + a2*(u - us)^2 + a3*(u - us)^3
%f'(u) = a1 + 2*a2*(u - us) + 3*a3*(u - us)^2
A2 = [1, 0, 0, 0
    0, 1, 0, 0
    1, (ue - us), (ue - us)^2, (ue - us)^3
    0, 1, 2*(ue - us), 3*(ue - us)^2
    ];
B2 = [ps; vs; pe; ve];
a2 = simplify(A2 \ B2)

%% 求解五次多项式系数符号解

%f(u) = a0 + a1*u + a2*u^2 + a3*u^3 + a4*u^4 + a5*u^5
%f'(u) = a1 + 2*a2*u + 3*a3*u^2 + 4*a4*u^3 + 5*a5*u^4
%f''(u) = 2*a2 + 6*a3*u + 12*a4*u^2 + 20*a5*u^3
A3 = [1, us, us^2, us^3, us^4, us^5
    0, 1, 2*us, 3*us^2, 4*us^3, 5*us^4
    0, 0, 2, 6*us, 12*us^2, 20*us^3
    1, ue, ue^2, ue^3, ue^4, ue^5
    0, 1, 2*ue, 3*ue^2, 4*ue^3, 5*ue^4
    0, 0, 2, 6*ue, 12*ue^2, 20*ue^3];
B3 = [ps; vs; as; pe; ve; ae];
a3 = simplify(A3 \ B3)


%f(u) = a0 + a1*(u - us) + a2*(u - us)^2 + a3*(u - us)^3 + a4*(u - us)^4 + a5*(u - us)^5
%f'(u) = a1 + 2*a2*(u - us) + 3*a3*(u - us)^2 + 4*a4*(u - us)^3 + 5*a5*(u - us)^4
%f''(u) = 2*a2 + 6*a3*(u - us) + 12*a4*(u - us)^2 + 20*a5*(u - us)^3
A4 = [1, 0, 0, 0, 0, 0
    0, 1, 0, 0, 0, 0
    0, 0, 2, 0, 0, 0
    1, (ue - us), (ue - us)^2, (ue - us)^3, (ue - us)^4, (ue - us)^5
    0, 1, 2*(ue - us), 3*(ue - us)^2, 4*(ue - us)^3, 5*(ue - us)^4
    0, 0, 2, 6*(ue - us), 12*(ue - us)^2, 20*(ue - us)^3];
B4 = [ps; vs; as; pe; ve; ae];
a4 = simplify(A4 \ B4)


%% 三次、五次多项式解析解测试
polyInp = struct();
polyInp.order = 3;
polyInp.us = 1;
polyInp.ue = 5;
polyInp.ps = 3;
polyInp.pe = 7;
polyInp.vs = 2;
polyInp.ve = -1;
polyInp.as = 7;
polyInp.ae = 9;

[a, sta] = solve_polyInp_coes(polyInp);

n = 100;
u = linspace(polyInp.us, polyInp.ue, n);

if polyInp.order == 3
    pos = a(1) + a(2) * (u - polyInp.us) + a(3) * (u - polyInp.us).^2 + a(4) * (u - polyInp.us).^3;
    vel = a(2) + 2.0 * a(3) * (u - polyInp.us) + 3.0 * a(4) * (u - polyInp.us).^2;
    figure
    subplot(2, 1, 1)
    plot(u, pos)
    hold on
    plot(polyInp.us, polyInp.ps, 'o')
    plot(polyInp.ue, polyInp.pe, 'o')
    xlabel('u')
    ylabel('pos')
    title('三次多项式插值')
    subplot(2, 1, 2)
    plot(u, vel)
    hold on
    plot(polyInp.us, polyInp.vs, 'o')
    plot(polyInp.ue, polyInp.ve, 'o')
    xlabel('u')
    ylabel('vel')
elseif polyInp.order == 5
    pos = a(1) + a(2) * (u - polyInp.us) + a(3) * (u - polyInp.us).^2 + a(4) * (u - polyInp.us).^3 + a(5) * (u - polyInp.us).^4 + a(6) * (u - polyInp.us).^5;
    vel = a(2) + 2.0 * a(3) * (u - polyInp.us) + 3.0 * a(4) * (u - polyInp.us).^2 + 4.0 * a(5) * (u - polyInp.us).^3 + 5.0 * a(6) * (u - polyInp.us).^4;
    acc = 2.0 * a(3) + 6.0 * a(4) * (u - polyInp.us) + 12.0 * a(5) * (u - polyInp.us).^2 + 20.0 * a(6) * (u - polyInp.us).^3;
    figure
    subplot(3, 1, 1)
    plot(u, pos)
    hold on
    plot(polyInp.us, polyInp.ps, 'o')
    plot(polyInp.ue, polyInp.pe, 'o')
    xlabel('u')
    ylabel('pos')
    title('五次多项式插值')
    subplot(3, 1, 2)
    plot(u, vel)
    hold on
    plot(polyInp.us, polyInp.vs, 'o')
    plot(polyInp.ue, polyInp.ve, 'o')
    xlabel('u')
    ylabel('vel')
    subplot(3, 1, 3)
    plot(u, acc)
    hold on
    plot(polyInp.us, polyInp.as, 'o')
    plot(polyInp.ue, polyInp.ae, 'o')
    xlabel('u')
    ylabel('acc')
else
    
end

三次、五次多项式插值(附代码)
三次、五次多项式插值(附代码)文章来源地址https://www.toymoban.com/news/detail-464142.html

到了这里,关于三次、五次多项式插值(附代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 自动驾驶——基于五次多项式螺旋线方程的换道曲线规划

    自动驾驶——基于五次多项式螺旋线方程的换道曲线规划

    1.BackGround 已知:换道初始纵坐标y0(横向距离),换道初始航向角tan0,换道时间t,换道结束纵坐标yf,换道结束航向角tanf,车速VehSpd,曲线中点曲率q且曲率变化率为0。求解期望的规划曲线。 2.Algorithm 3.Reference 自动驾驶——ADAS车道线方程推导 基于多项式采样的换道路径规划

    2024年02月08日
    浏览(21)
  • 机械臂速成小指南(十四):多项式插值轨迹规划

    机械臂速成小指南(十四):多项式插值轨迹规划

    👨‍🏫🥰🥳需要机械臂相关资源的同学可以在评论区中留言哦🤖😽🦄   指南目录📖: 🎉🎉机械臂速成小指南(零点五):机械臂相关资源🎉🎉 机械臂速成小指南(零):指南主要内容及分析方法 机械臂速成小指南(一):机械臂发展概况 机械臂速成小指南(二)

    2024年01月25日
    浏览(8)
  • numpy 多项式函数回归与插值拟合模型;ARIMA时间序列模型拟合

    numpy 多项式函数回归与插值拟合模型;ARIMA时间序列模型拟合

    参考: https://blog.csdn.net/mao_hui_fei/article/details/103821601 1、多项式函数回归拟合 x ^3+ x ^2… 2、多项式函数插值拟合 对于插值函数 interp1d(phone_time, phone_x, kind=‘cubic’),无法直接获取多项式的参数与具体函数表达式。这是因为该函数使用样条插值方法,它的内部实现是基于一组数

    2024年02月16日
    浏览(13)
  • 量子退火算法入门(7):如何QUBO中的三次多项式怎么转换?

    量子退火算法入门(7):如何QUBO中的三次多项式怎么转换?

    本文还是大部分截图来自于:《最適化問題とWildqatを用いた量子アニーリング計算入門》 https://booth.pm/ja/items/1415833 终于有人问到怎么将QUBO中的三次多项式转换为二次多项式了。直接以一个例题开始讲解。中间会用到之前文章里的知识,大家最好读了该系列前两篇之后,再阅

    2023年04月14日
    浏览(9)
  • 曲线生成 | 基于多项式插值的轨迹规划(附ROS C++/Python/Matlab仿真)

    🔥附C++/Python/Matlab全套代码🔥课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。 🚀详情:图解自动驾驶中的运动规划(Motion Planning),附几十种规划算法 多项式插值(polynomial

    2024年02月03日
    浏览(8)
  • MATLAB仿真UR5机器人simulink simscape 自制建模 正向运动学,逆向运动学关节空间轨迹规划 五次多项式轨迹规划

    MATLAB仿真UR5机器人simulink simscape 自制建模 正向运动学,逆向运动学关节空间轨迹规划 五次多项式轨迹规划

    MATLAB仿真UR5机器人simulink simscape 自制建模  正向运动学,逆向运动学 关节空间轨迹规划 五次多项式轨迹规划 笛卡尔空间轨迹规划 直线插补    还包含机器人工具箱建立的模型对比 MATLAB仿真UR5机器人simulink simscape 自制建模及运动学规划 摘要:本文介绍了利用MATLAB仿真UR5机器

    2024年02月04日
    浏览(18)
  • 支持向量机SVM(包括线性核、多项式核、高斯核)python手写实现+代码框架说明

    理论参考《统计学习方法》Chapter.7 支持向量机(SVM) 完整代码见github仓库:https://github.com/wjtgoo/SVM-python 借鉴sklearn的代码构架,整体功能实现在SVM类中,包括各种类属性,以及常用的模型训练函数 SVM.fit(x,y,iterations) ,以及预测函数 SVM.predict(x) , 类输入参数 kernal: 默认:线性

    2023年04月17日
    浏览(15)
  • AA@有理系数多项式@整系数多项式@本原多项式@有理多项式可约问题

    有理数域上一元多项式的因式分解. 作为 因式分解定理 的一个特殊情形,我们有结论: 每个次数大等于1的 有理系数多项式 都能 唯一地 分解成 不可约的有理系数多项式 的乘积. 有理数域版本中,从一般数域具体到了\\\" 有理系数 \\\" 我们讨论多项式的时候,都假设多项式是在某个数

    2024年02月16日
    浏览(13)
  • 南京邮电大学数据结构实验一(线性表的基本运算及多项式的算术运算)(代码篇)

    小伙伴们要多多体会,不要全部借鉴哦!

    2024年02月08日
    浏览(13)
  • P4725 【模板】多项式对数函数(多项式 ln)

    洛谷P4725 【模板】多项式对数函数(多项式 ln) 题目大意 给你一个 n − 1 n-1 n − 1 次多项式 A ( x ) A(x) A ( x ) ,求一个   m o d   x n bmod x^n mod x n 下的多项式 B ( x ) B(x) B ( x ) ,满足 B ( x ) ≡ ln ⁡ A ( x ) B(x)equiv ln A(x) B ( x ) ≡ ln A ( x ) 。 在   m o d   998244353 bmod 998244353 mo

    2024年02月03日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包