分段五次多项式插值(MATLAB实现) 您所在的位置:网站首页 多项拟合法matlab 分段五次多项式插值(MATLAB实现)

分段五次多项式插值(MATLAB实现)

2024-06-29 06:56| 来源: 网络整理| 查看: 265

文章目录 一、问题描述二、推导步骤三、MATLAB代码

一、问题描述

  给定 n + 1 n+1 n+1个点序列 ( t i , p i ) (t_i,p_i) (ti​,pi​),利用分段五次多项式插值,使得分段多项式经过所有点序列。其中, t i t_i ti​必须单调递增, i = 0 , 1 , . . . , n i=0,1,...,n i=0,1,...,n。

二、推导步骤

  起点处一阶导数估计: v 0 = ( p 1 − p 0 ) / ( t 1 − t 0 ) (1) v_0=(p_1-p_0)/(t_1-t_0)\tag 1 v0​=(p1​−p0​)/(t1​−t0​)(1)   终点处一阶导数估计: v n = ( p n − p n − 1 ) / ( t n − t n − 1 ) (2) v_n=(p_n-p_{n-1})/(t_n-t_{n-1})\tag 2 vn​=(pn​−pn−1​)/(tn​−tn−1​)(2)   中间点处一阶导数估计:

v k = ( d k + d k + 1 ) / 2 (3) v_k=(d_k+d_{k+1})/2 \tag 3 vk​=(dk​+dk+1​)/2(3)   其中, d k = ( p k − p k − 1 ) / ( t k − t k − 1 ) d_k=(p_k-p_{k-1})/(t_k-t_{k-1}) dk​=(pk​−pk−1​)/(tk​−tk−1​)。

  起点处二阶导数估计: a c c 0 = ( v 1 − v 0 ) / ( t 1 − t 0 ) (4) acc_0=(v_1-v_0)/(t_1-t_0)\tag 4 acc0​=(v1​−v0​)/(t1​−t0​)(4)   终点处二阶导数估计: a c c n = ( v n − v n − 1 ) / ( t n − t n − 1 ) (5) acc_n=(v_n-v_{n-1})/(t_n-t_{n-1})\tag 5 accn​=(vn​−vn−1​)/(tn​−tn−1​)(5)   中间点处二阶导数估计: a c c k = ( e k + e k + 1 ) / 2 (6) acc_k=(e_k+e_{k+1})/2 \tag 6 acck​=(ek​+ek+1​)/2(6)   其中, e k = ( v k − v k − 1 ) / ( t k − t k − 1 ) e_k=(v_k-v_{k-1})/(t_k-t_{k-1}) ek​=(vk​−vk−1​)/(tk​−tk−1​)。

  设五次多项式为: p ( t ) = a 0 + a 1 ( t − t s ) + a 2 ( t − t s ) 2 + a 3 ( t − t s ) 3 + a 4 ( t − t s ) 4 + a 5 ( t − t s ) 5 p(t) = a_0 + a_1(t -t_s)+ a_2(t -t_s)^2+a_3(t -t_s)^3+a_4(t -t_s)^4+a_5(t -t_s)^5 p(t)=a0​+a1​(t−ts​)+a2​(t−ts​)2+a3​(t−ts​)3+a4​(t−ts​)4+a5​(t−ts​)5,一阶导数: p ′ ( t ) = a 1 + 2 a 2 ( t − t s ) + 3 a 3 ( t − t s ) 2 + 4 a 4 ( t − t s ) 3 + 5 a 5 ( t − t s ) 4 p'(t) = a_1+ 2a_2(t -t_s)+3a_3(t -t_s)^2+4a_4(t -t_s)^3+5a_5(t -t_s)^4 p′(t)=a1​+2a2​(t−ts​)+3a3​(t−ts​)2+4a4​(t−ts​)3+5a5​(t−ts​)4,二阶导数: p ′ ′ ( t ) = 2 a 2 + 6 a 3 ( t − t s ) + 12 a 4 ( t − t s ) 2 + 20 a 5 ( t − t s ) 3 p''(t) = 2a_2+6a_3(t -t_s)+12a_4(t -t_s)^2+20a_5(t -t_s)^3 p′′(t)=2a2​+6a3​(t−ts​)+12a4​(t−ts​)2+20a5​(t−ts​)3。   对于每一段五次多项式,利用端点处约束: { p ( t s ) = p s p ′ ( t s ) = v s p ′ ′ ( t s ) = a s p ( t e ) = p e p ′ ( t e ) = v e p ′ ′ ( t e ) = a e (7) \begin{cases} p(t_s)=p_s \\ p'(t_s)=v_s \\ p''(t_s)=a_s \\ p(t_e)=p_e \\ p'(t_e)=v_e \\ p''(t_e)=a_e \\ \tag 7 \end{cases} ⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧​p(ts​)=ps​p′(ts​)=vs​p′′(ts​)=as​p(te​)=pe​p′(te​)=ve​p′′(te​)=ae​​(7)   容易求得系数: { a 0 = p s a 1 = v s a 2 = a s / 2 a 3 = [ 20 h − ( 8 v e + 12 v s ) T − ( 3 a s − a e ) T 2 ] / ( 2 T 3 ) a 4 = [ − 30 h + ( 14 v e + 16 v s ) T + ( 3 a s − 2 a e ) T 2 ] / ( 2 T 4 ) a 5 = [ 12 h − 6 ( v e + v s ) T − ( a s − a e ) T 2 ] / ( 2 T 5 ) (8) \begin{cases} a_0=p_s \\ a_1=v_s \\ a_2=a_s/2 \\ a_3=[20h-(8v_e+12v_s)T - (3a_s-a_e)T^2]/(2T^3) \\ a_4=[-30h+(14v_e+16v_s)T + (3a_s-2a_e)T^2]/(2T^4) \\ a_5=[12h-6(v_e+v_s)T - (a_s-a_e)T^2]/(2T^5) \\ \tag 8 \end{cases} ⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧​a0​=ps​a1​=vs​a2​=as​/2a3​=[20h−(8ve​+12vs​)T−(3as​−ae​)T2]/(2T3)a4​=[−30h+(14ve​+16vs​)T+(3as​−2ae​)T2]/(2T4)a5​=[12h−6(ve​+vs​)T−(as​−ae​)T2]/(2T5)​(8)   其中, h = p e − p s , T = t e − t s h=p_e-p_s,T=t_e-t_s h=pe​−ps​,T=te​−ts​。

三、MATLAB代码 clc; clear; close all; %{ syms ts te ps pe vs ve as ae T real; a = [1, 0, 0, 0, 0, 0 0, 1, 0, 0, 0, 0 0, 0, 2, 0, 0, 0 1, T, T^2, T^3, T^4, T^5 0, 1, 2*T, 3*T^2, 4*T^3, 5*T^4 0, 0, 2, 6*T, 12*T^2, 20*T^3 ] \ [ps; vs; as; pe; ve; ae]; a = [simplify(a(1)), simplify(a(2)), simplify(a(3)), simplify(a(4)), simplify(a(5)), simplify(a(6))]' %} t = [0, 2, 4, 8, 10]'; pos = [10, 20, 0, 30, 40]'; dt = 0.001; n = length(t); v = zeros(n, 1); acc = zeros(n, 1); v(1) = (pos(2) - pos(1)) / (t(2) - t(1)); v(n) = (pos(n) - pos(n - 1)) / (t(n) - t(n - 1)); for k = 2 : n - 1 v(k) = 0.5 * ((pos(k) - pos(k - 1)) / (t(k) - t(k - 1)) + (pos(k + 1) - pos(k)) / (t(k + 1) - t(k))); end acc(1) = (v(2) - v(1)) / (t(2) - t(1)); acc(n) = (v(n) - v(n - 1)) / (t(n) - t(n - 1)); for k = 2 : n - 1 acc(k) = 0.5 * ((v(k) - v(k - 1)) / (t(k) - t(k - 1)) + (v(k + 1) - v(k)) / (t(k + 1) - t(k))); end tArray = []; posArray = []; velArray = []; accArray = []; tArray = [tArray; t(1)]; posArray = [posArray; pos(1)]; velArray = [velArray; v(1)]; accArray = [accArray; acc(1)]; for i = 1 : n - 1 ts = t(i); te = t(i + 1); ps = pos(i); pe = pos(i + 1); vs = v(i); ve = v(i + 1); as = acc(i); ae = acc(i + 1); h = pe - ps; T = t(i + 1) - t(i); a0 = ps; a1 = vs; a2 = 0.5 * as; a3 = (20.0 * h - (8.0 * ve + 12.0 * vs) * T - (3.0 * as - ae) * T^2) / (2.0 * T^3); a4 = (-30.0 * h + (14.0 * ve + 16.0 * vs) * T + (3.0 * as - 2.0 * ae) * T^2) / (2.0 * T^4); a5 = (12.0 * h - 6.0 * (ve + vs) * T - (as - ae) * T^2) / (2.0 * T^5); tt = (t(i) + dt : dt : t(i + 1))'; if abs(tt(end) - t(i + 1)) > 1.0e-8 tt = [tt; t(i + 1)]; end tArray = [tArray; tt]; posArray = [posArray; a0 + (tt - ts) .* (a1 + (tt - ts) .* (a2 + (tt - ts) .* (a3 + (tt - ts) .* (a4 + a5 .* (tt - ts)))))]; velArray = [velArray; a1 + (tt - ts) .* (2.0 * a2 + (tt - ts) .* (3.0 * a3 + (tt - ts) .* (4.0 * a4 + 5.0 * a5 .* (tt - ts))))]; accArray = [accArray; 2.0 * a2 + (tt - ts) .* (6.0 * a3 + (tt - ts) .* (12.0 * a4 + 20.0 * a5 .* (tt - ts)))]; end figure(1) subplot(3, 1, 1) plot(t, pos, 'ro'); hold on; plot(tArray, posArray); xlabel('t'); ylabel('pos'); subplot(3, 1, 2) plot(tArray, velArray); xlabel('t'); ylabel('vel'); subplot(3, 1, 3) plot(tArray, accArray); xlabel('t'); ylabel('acc');


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有