正交多项式曲线拟合(MATLAB代码)

正交多项式曲线拟合(MATLAB代码)文章目录一 正交多项式曲线拟合 1 曲线不经过起点与终点 2 曲线经过起点与终点二 参考文献一 正交多项式曲线拟合 1 曲线不经过起点与终点 2 曲线经过起点与终点二 参考文献 TrajectoryPl 中章节 4 2OrthogonalP

一、 正交多项式曲线拟合

1.曲线不经过起点与终点

%{ 
    Function: calculate_orthogonal_polynomial_params Description: 利用递推关系计算正交多项式参数alpha,beta(曲线不经过起点与终点) Input: 点序列(ti, qi)的横坐标序列t,多项式次数m Output: 正交多项式参数alpha,beta Author: Marc Pony(marc_pony@163.com) %} function [alpha, beta] = calculate_orthogonal_polynomial_params(t, m) if m == 0 alpha = []; beta = []; return; end if m == 1 p = ones(size(t)); alpha = sum(t .* p.^2) / sum(p.^2); beta = []; return; end alpha = zeros(m, 1); beta = zeros(m - 1, 1); p0 = ones(size(t)); alpha(1) = sum(t .* p0.^2) / sum(p0.^2); p1 = (t - alpha(1)) .* p0; for i = 2 : m alpha(i) = sum(t .* p1.^2) / sum(p1.^2); beta(i - 1) = sum(p1.^2) / sum(p0.^2); p2 = (t - alpha(i)) .* p1 - beta(i - 1) * p0; p0 = p1; p1 = p2; end end 
%{ 
    Function: evaluate_orthogonal_polynomial Description: 利用递推关系计算正交多项式pm在t处自0阶到2阶导数值(曲线不经过起点与终点) Input: 横坐标t,多项式次数m,正交多项式参数alpha与beta Output: 正交多项式pm在t处自0阶到2阶导数值p, dp, ddp Author: Marc Pony(marc_pony@163.com) %} function [p, dp, ddp] = evaluate_orthogonal_polynomial(t, m, alpha, beta) p0 = 1.0; dp0 = 0.0; ddp0 = 0.0; p = p0; dp = dp0; ddp = ddp0; if m == 0 return; end p1 = (t - alpha(1)) * p0; dp1 = p0 + (t - alpha(1)) * dp0; ddp1 = 2.0 * dp0 + (t - alpha(1)) * ddp0; p = p1; dp = dp1; ddp = ddp1; if m == 1 return; end for i = 2 : m p2 = (t - alpha(i)) * p1 - beta(i - 1) * p0; dp2 = p1 + (t - alpha(i)) * dp1 - beta(i - 1) * dp0; ddp2 = 2.0 * dp1 + (t - alpha(i)) * ddp1 - beta(i - 1) * ddp0; p0 = p1; dp0 = dp1; ddp0 = ddp1; p1 = p2; dp1 = dp2; ddp1 = ddp2; end p = p2; dp = dp2; ddp = ddp2; end 
%{ 
    Function: evaluate_orthogonal_polynomial_and_derivatives Description: 利用递推关系计算正交多项式p0~pm在t处自0阶到2阶导数值(曲线不经过起点与终点) Input: 横坐标t,多项式次数m,正交多项式参数alpha与beta Output: 正交多项式p0~pm在t处自0阶到2阶导数值p, dp, ddp Author: Marc Pony(marc_pony@163.com) %} function [p, dp, ddp] = evaluate_orthogonal_polynomial_and_derivatives(t, m, alpha, beta) p = zeros(m + 1, 1); dp = zeros(m + 1, 1); ddp = zeros(m + 1, 1); p0 = 1.0; dp0 = 0.0; ddp0 = 0.0; p(1) = p0; dp(1) = dp0; ddp(1) = ddp0; if m == 0 return; end p1 = (t - alpha(1)) * p0; dp1 = p0 + (t - alpha(1)) * dp0; ddp1 = 2.0 * dp0 + (t - alpha(1)) * ddp0; p(2) = p1; dp(2) = dp1; ddp(2) = ddp1; if m == 1 return; end for i = 2 : m p2 = (t - alpha(i)) * p1 - beta(i - 1) * p0; dp2 = p1 + (t - alpha(i)) * dp1 - beta(i - 1) * dp0; ddp2 = 2.0 * dp1 + (t - alpha(i)) * ddp1 - beta(i - 1) * ddp0; p(i + 1) = p2; dp(i + 1) = dp2; ddp(i + 1) = ddp2; p0 = p1; dp0 = dp1; ddp0 = ddp1; p1 = p2; dp1 = dp2; ddp1 = ddp2; end end 
clc; clear; close all; t = [0, 1, 3, 7, 8, 10]'; %单调递增时间序列 q = [2, 3, 5, 6, 8, 9]'; m = 4; %多项式阶数(非负整数) dt = 0.001; n = length(t); [alpha, beta] = calculate_orthogonal_polynomial_params(t, m); a = zeros(m + 1, 1); for j = 0 : m sumValue = zeros(2, 1); for k = 1 : n [pj, ~, ~] = evaluate_orthogonal_polynomial(t(k), j, alpha, beta); sumValue(1) = sumValue(1) + q(k) * pj; sumValue(2) = sumValue(2) + pj^2; end if abs(sumValue(2)) > 1.0e-20 a(j + 1) = sumValue(1) / sumValue(2); else a(j + 1) = 0.0 end end posArray = []; velArray = []; accArray = []; tArray = (t(1) : dt : t(end))'; for i = 1 : length(tArray) tt = tArray(i); [p, dp, ddp] = evaluate_orthogonal_polynomial_and_derivatives(tt, m, alpha, beta); pos = dot(a, p); vel = dot(a, dp); acc = dot(a, ddp); posArray = [posArray; pos]; velArray = [velArray; vel]; accArray = [accArray; acc]; end if abs(tArray(end) - t(end)) > 1.0e-8 [p, dp, ddp] = evaluate_orthogonal_polynomial_and_derivatives(t(end), m, alpha, beta); pos = dot(a, p); vel = dot(a, dp); acc = dot(a, ddp); tArray = [tArray; t(end)]; posArray = [posArray; pos]; velArray = [velArray; vel]; accArray = [accArray; acc]; end figure(1) subplot(3, 1, 1) plot(tArray, posArray); hold on plot(t, q, '+'); xlabel('t'); ylabel('Position'); subplot(3, 1, 2) plot(tArray, velArray); xlabel('t'); ylabel('Velocity'); subplot(3, 1, 3) plot(tArray, accArray); xlabel('t'); ylabel('Acceleration'); 

在这里插入图片描述

2.曲线经过起点与终点

%{ 
    Function: calculate_orthogonal_polynomial_params2 Description: 利用递推关系计算正交多项式参数alpha,beta(曲线经过起点与终点) Input: 归一化后的点序列横坐标tau,多项式次数m Output: 正交多项式参数alpha,beta Author: Marc Pony(marc_pony@163.com) %} function [alpha, beta] = calculate_orthogonal_polynomial_params2(tau, m) if m == 0 alpha = []; beta = []; return; end if m == 1 p = tau .* (1.0 - tau); alpha = sum(tau .* p.^2) / sum(p.^2); beta = []; return; end alpha = zeros(m, 1); beta = zeros(m - 1, 1); p0 = tau .* (1.0 - tau); alpha(1) = sum(tau .* p0.^2) / sum(p0.^2); p1 = (tau - alpha(1)) .* p0; for i = 2 : m alpha(i) = sum(tau .* p1.^2) / sum(p1.^2); beta(i - 1) = sum(p1.^2) / sum(p0.^2); p2 = (tau - alpha(i)) .* p1 - beta(i - 1) * p0; p0 = p1; p1 = p2; end end 
%{ 
    Function: evaluate_orthogonal_polynomial2 Description: 利用递推关系计算正交多项式pm在t处自0阶到2阶导数值(曲线经过起点与终点) Input: 归一化横坐标tau,多项式次数m,正交多项式参数alpha与beta Output: 正交多项式pm在t处自0阶到2阶导数值p, dp, ddp Author: Marc Pony(marc_pony@163.com) %} function [p, dp, ddp] = evaluate_orthogonal_polynomial2(tau, m, alpha, beta) p0 = tau * (1.0 - tau); dp0 = 1.0 - 2.0 * tau; ddp0 = -2.0; p = p0; dp = dp0; ddp = ddp0; if m == 0 return; end p1 = (tau - alpha(1)) * p0; dp1 = p0 + (tau - alpha(1)) * dp0; ddp1 = 2.0 * dp0 + (tau - alpha(1)) * ddp0; p = p1; dp = dp1; ddp = ddp1; if m == 1 return; end for i = 2 : m p2 = (tau - alpha(i)) * p1 - beta(i - 1) * p0; dp2 = p1 + (tau - alpha(i)) * dp1 - beta(i - 1) * dp0; ddp2 = 2.0 * dp1 + (tau - alpha(i)) * ddp1 - beta(i - 1) * ddp0; p0 = p1; dp0 = dp1; ddp0 = ddp1; p1 = p2; dp1 = dp2; ddp1 = ddp2; end p = p2; dp = dp2; ddp = ddp2; end 
%{ 
    Function: evaluate_orthogonal_polynomial_and_derivatives2 Description: 利用递推关系计算正交多项式p0~pm在t处自0阶到2阶导数值(曲线经过起点与终点) Input: 归一化横坐标tau,多项式次数m,正交多项式参数alpha与beta Output: 正交多项式p0~pm在t处自0阶到2阶导数值p, dp, ddp Author: Marc Pony(marc_pony@163.com) %} function [p, dp, ddp] = evaluate_orthogonal_polynomial_and_derivatives2(tau, m, alpha, beta) p = zeros(m + 1, 1); dp = zeros(m + 1, 1); ddp = zeros(m + 1, 1); p0 = tau * (1.0 - tau); dp0 = 1.0 - 2.0 * tau; ddp0 = -2.0; p(1) = p0; dp(1) = dp0; ddp(1) = ddp0; if m == 0 return; end p1 = (tau - alpha(1)) * p0; dp1 = p0 + (tau - alpha(1)) * dp0; ddp1 = 2.0 * dp0 + (tau - alpha(1)) * ddp0; p(2) = p1; dp(2) = dp1; ddp(2) = ddp1; if m == 1 return; end for i = 2 : m p2 = (tau - alpha(i)) * p1 - beta(i - 1) * p0; dp2 = p1 + (tau - alpha(i)) * dp1 - beta(i - 1) * dp0; ddp2 = 2.0 * dp1 + (tau - alpha(i)) * ddp1 - beta(i - 1) * ddp0; p(i + 1) = p2; dp(i + 1) = dp2; ddp(i + 1) = ddp2; p0 = p1; dp0 = dp1; ddp0 = ddp1; p1 = p2; dp1 = dp2; ddp1 = ddp2; end end 
clc; clear; close all; t = [0, 1, 3, 7, 8, 10]'; %单调递增时间序列 q = [2, 3, 5, 6, 8, 9]'; m = 4; %多项式阶数(非负整数) dt = 0.001; n = length(t); tau = (t - t(1)) / (t(n) - t(1)); q_ = q - q(1) * (1 - tau) - q(n) * tau; [alpha, beta] = calculate_orthogonal_polynomial_params2(tau, m); a = zeros(m + 1, 1); for j = 0 : m sumValue = zeros(2, 1); for k = 1 : n [pj, ~, ~] = evaluate_orthogonal_polynomial2(tau(k), j, alpha, beta); sumValue(1) = sumValue(1) + q_(k) * pj; sumValue(2) = sumValue(2) + pj^2; end if abs(sumValue(2)) > 1.0e-20 a(j + 1) = sumValue(1) / sumValue(2); else a(j + 1) = 0.0; end end posArray = []; velArray = []; accArray = []; tArray = (t(1) : dt : t(end))'; for i = 1 : length(tArray) tau = (tArray(i) - t(1)) / (t(n) - t(1)); [p, dp, ddp] = evaluate_orthogonal_polynomial_and_derivatives2(tau, m, alpha, beta); pos = dot(a, p) + q(1) * (1.0 - tau^2) + q(n) * tau^2; vel = dot(a, dp) + 2.0 * tau * (q(n) - q(1)); acc = dot(a, ddp) + 2.0 * (q(n) - q(1)); posArray = [posArray; pos]; velArray = [velArray; vel]; accArray = [accArray; acc]; end if abs(tArray(end) - t(end)) > 1.0e-8 [p, dp, ddp] = evaluate_orthogonal_polynomial_and_derivatives2(1.0, m, alpha, beta); pos = dot(a, p) + q(n); vel = dot(a, dp) + 2.0 * (q(n) - q(1)); acc = dot(a, ddp) + 2.0 * (q(n) - q(1)); tArray = [tArray; t(end)]; posArray = [posArray; pos]; velArray = [velArray; vel]; accArray = [accArray; acc]; end figure(1) subplot(3, 1, 1) plot(tArray, posArray); hold on plot(t, q, '+'); xlabel('t'); ylabel('Position'); subplot(3, 1, 2) plot(tArray, velArray); xlabel('t'); ylabel('Velocity'); subplot(3, 1, 3) plot(tArray, accArray); xlabel('t'); ylabel('Acceleration'); 

在这里插入图片描述

二、参考文献

Trajectory Planning for Automatic Machines and Robots中章节:4.2 Orthogonal Polynomials

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208094.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午12:22
下一篇 2026年3月19日 下午12:22


相关推荐

  • 分布式日志传输系统Databus(一)–系统介绍「建议收藏」

    分布式日志传输系统Databus(一)–系统介绍「建议收藏」Databus系统是微博DIP团队开源的分布式日志传输系统。它是一个分布式、高可用的,用于采集和移动大量日志数据的服务。它基于流式数据的简单而灵活的架构,具备健壮性和容错性,具有故障转移与恢复机制。它

    2022年7月2日
    24
  • 关于charles抓包https乱码的设置[通俗易懂]

    关于charles抓包https乱码的设置[通俗易懂]关于charles抓包https乱码的设置charles安装本地证书首先我们点击help->SSLProxying->InstallCharlesRootCertificate安装证书。默认安装证书是不受信任的,双击打开证书,打开信任选择项,将使用此证书时这是为始终信任。安装手机证书点击help->SSLProxying->Inst…

    2022年6月4日
    100
  • 猴子吃桃

    猴子吃桃猴子吃桃

    2022年4月24日
    49
  • ubuntu16.04 svn配置「建议收藏」

    ubuntu16.04 svn配置「建议收藏」虽然目前最流行的项目托管平台是github,其分布式的存储思想非常先进,对于项目的敏捷开发也非常有好处。但缺点在于操作略显复杂,上手需要一定成本。而svn相比git操作简单许多,上手几乎无难度,适用于项目的管理。虽然目前有很多svn的使用方法,但对其使用却描述不够具体或者不够连续,接下来详细写出本人在ubuntu16.04下配置svn并上传至taocode托管平台的步骤:首先安装

    2025年11月6日
    4
  • Python关键字及其含义

    Python关键字及其含义关键字含义 False 布尔类型的值 表示假 与 True 相对 None 表示什么也没有 自己的数据类型 NoneTypeTrue 布尔类型的值 表示真 与 False 相反 and 用于表达式运算 逻辑与操作 as 用于类型转换 assert 断言 用于判断变量或者条件表达式的值是否为真 break 中断循环语句的执行 class 用于定义类 cont

    2026年3月18日
    1
  • 为何把2点半比作是神奇的2点半? 为什么炒股的人叫14:30分,叫神奇的2点[通俗易懂]

    为何把2点半比作是神奇的2点半? 为什么炒股的人叫14:30分,叫神奇的2点[通俗易懂]为何把14:30分称作神奇的2点半?为什么炒股的人叫14:30分,叫神奇的2点半?这个得从头开始说起!第一个是早盘:9:30-9:50,请一般散户不要参与!这是主力展示盘口语言的时间段,自认为水平

    2022年7月1日
    30

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号