Python库中三次样条不同形式使用比较

devtools/2025/1/1 12:13:42/

文章目录

  • Python库中三次样条不同形式使用比较
    • Python库中三次样条不同形式使用比较
      • 位置比较示意图
      • 速度比较示意图
      • 加速度比较示意图
    • 介绍如何使用三次样条的预测功能实现一个画圆的功能
    • 提供一阶或者二阶导致来对轨迹进行精确拟合功能

Python库中三次样条不同形式使用比较

Python库中三次样条不同形式使用比较

python">import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate as spi
from IPython import embed
data = [[0, 0],
[1, 1],
[5, 2],
[10, 3],
[20, 4],
[40, 5],
[100, 6],
[101, 7],
[101, 8],
[101, 9],
[60, 10],
[40, 11],
[-100, 12],
[40, 13],
[50, 14],
[60, 15],
[70, 16],
[80, 17],
[90, 18],
[100, 19],
[110, 20],
[100, 21],
[90, 22],
[50, 23],
[10, 24],
[0, 25]]
Y = [row[0] for row in data]
X = [row[1] for row in data]
time_list = np.arange(0, X[-1],0.001) 
# 1:三次样条: 自然边界,边界点的二阶导为0
# 2:三次样条: 固定边界,边界点导数给定
# 3:三次样条: 非节点边界,使边界点的三阶导与这两边界端点的邻近点的三阶导相等
# 4:三次样条: 预测,需要 Y的第一个点和最后一个点一直,否则会报错c1_i_f = spi.CubicSpline(X, Y, bc_type= 'natural')
## 这两个结果是一样的,指定起点和终点的二阶导数为 0
# c1_i_f = spi.CubicSpline(X, Y, bc_type=((2, 0), (2, 0)))
c1_pos = c1_i_f(time_list)
c1_vel = np.dot(np.diff(c1_pos), 1000)
c1_acc = np.dot(np.diff(c1_vel), 1000)c2_i_f = spi.CubicSpline(X, Y, bc_type= 'clamped')
## 这两个结果是一样的,指定起点和终点的一阶导数为 0
# c2_i_f = spi.CubicSpline(X, Y, bc_type=((1, 0), (1, 0)))
c2_pos = c2_i_f(time_list)
c2_vel = np.dot(np.diff(c2_pos), 1000)
c2_acc = np.dot(np.diff(c2_vel), 1000)c3_i_f = spi.CubicSpline(X, Y, bc_type= 'not-a-knot')
c3_pos = c3_i_f(time_list)
c3_vel = np.dot(np.diff(c3_pos), 1000)
c3_acc = np.dot(np.diff(c3_vel), 1000)c4_i_f = spi.CubicSpline(X, Y, bc_type= 'periodic')
c4_pos = c4_i_f(time_list)
c4_vel = np.dot(np.diff(c4_pos), 1000)
c4_acc = np.dot(np.diff(c4_vel), 1000)plt.figure()
plt.plot(X, Y, 'ro', label='given pos')
plt.plot(time_list, c1_pos, label='cubic natural')
plt.plot(time_list, c2_pos, label='cubic clamped')
plt.plot(time_list, c3_pos, label='cubic not-a-knot')
plt.plot(time_list, c4_pos, label='cubic periodic')
plt.grid('on')
plt.legend(loc='upper right')
plt.xlabel('time[s]')
plt.show()plt.figure()
plt.plot(time_list[:-1], c1_vel, label='cubic natural')
plt.plot(time_list[:-1], c2_vel, label='cubic clamped')
plt.plot(time_list[:-1], c3_vel, label='cubic not-a-knot')
plt.plot(time_list[:-1], c4_vel, label='cubic periodic')
plt.grid('on')
plt.legend(loc='upper right')
plt.xlabel('time[s]')
plt.show()plt.figure()
plt.plot(time_list[:-2], c1_acc, label='cubic natural')
plt.plot(time_list[:-2], c2_acc, label='cubic clamped')
plt.plot(time_list[:-2], c3_acc, label='cubic not-a-knot')
plt.plot(time_list[:-2], c4_acc, label='cubic periodic')
plt.grid('on')
plt.legend(loc='upper right')
plt.xlabel('time[s]')
plt.show()

位置比较示意图

在这里插入图片描述

速度比较示意图

在这里插入图片描述

加速度比较示意图

在这里插入图片描述

介绍如何使用三次样条的预测功能实现一个画圆的功能

python">import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate as spi
from IPython import embed
## 介绍如何使用三次样条的预测功能实现一个画圆的功能
## 为了增加轨迹精度,需要提供更多的轨迹点
theta = 2 * np.pi * np.linspace(0, 1, 5)
y = np.c_[np.cos(theta), np.sin(theta)]
cs_1 = spi.CubicSpline(theta, y, bc_type='natural')
cs_2 = spi.CubicSpline(theta, y, bc_type='clamped')
cs_3 = spi.CubicSpline(theta, y, bc_type='not-a-knot')
cs_4 = spi.CubicSpline(theta, y, bc_type='periodic')
print("ds/dx={:.1f} ds/dy={:.1f}".format(cs_4(0, 1)[0], cs_4(0, 1)[1]))
xs = 2 * np.pi * np.linspace(0, 1, 100)
fig, ax = plt.subplots(figsize=(6.5, 4))
ax.plot(y[:, 0], y[:, 1], 'o', label='data')
ax.plot(np.cos(xs), np.sin(xs), label='true')
ax.plot(cs_1(xs)[:, 0], cs_1(xs)[:, 1], label='natural')
ax.plot(cs_2(xs)[:, 0], cs_2(xs)[:, 1], label='clamped')
ax.plot(cs_3(xs)[:, 0], cs_3(xs)[:, 1], label='not-a-knot')
ax.plot(cs_4(xs)[:, 0], cs_4(xs)[:, 1], label='periodic')
ax.axes.set_aspect('equal')
ax.legend(loc='center')
plt.show()

从这个图中可以看出,只有 periodic 得出的轨迹和实际的圆轨迹比较接近,这还是在只有4个插值点的情况下。

在这里插入图片描述

当把插值点增加100个的时候,得到的轨迹就很接近一个圆了。
在这里插入图片描述

提供一阶或者二阶导致来对轨迹进行精确拟合功能

python">import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate as spi
from IPython import embed
# 拟合 y = x^3 的曲线
# x = 0, y = 0, dy = 0, ddy = 0
# x = 1,  y = 1, dy = 3, ddy = 6
# bc_type 中第一个数组对应着轨迹起点的一阶导致以及对应的导数值,或者二阶导数以及对应的导数值
# bc_type 中第二个数组对应着轨迹终点的一阶导致以及对应的导数值,或者二阶导数以及对应的导数值
# bc_type=((1, 0), (1, 3)
# 表示起点的一阶导数为0, 终点的一阶导致为3
# bc_type=((2, 0), (2, 6)
# 表示起点的二阶导数为0, 终点的二阶导致为6
cs_1 = spi.CubicSpline([0, 1], [0, 1], bc_type=((1, 0), (1, 3)))
cs_2 = spi.CubicSpline([0, 1], [0, 1], bc_type=((1, 0), (2, 6)))
x = np.linspace(0, 1, 10)
np.allclose(x**3, cs_1(x))
plt.plot(x, x**3,  label='true')
plt.plot(x, cs_1(x), label='cubic 1')
plt.plot(x, cs_2(x), label='cubic 2')
plt.legend(loc='center')
plt.show()

在这里插入图片描述

提供两个点位数据

python">import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate as spi
from IPython import embed# y = x**3 + 2 * x**2 + 3 * x + 4
cs_1= spi.CubicSpline([0, 1], [4, 10], bc_type='natural')
cs_2 = spi.CubicSpline([0, 1], [4, 10], bc_type=((1, 3), (1, 10)))
cs_3 = spi.CubicSpline([0, 1], [4, 10], bc_type=((2, 4), (2, 10)))
x = np.linspace(0, 1, 10)
np.allclose(x**3 + 2 * x**2 + 3 * x + 4, cs_1(x))
plt.plot(x, x**3 + 2 * x**2 + 3 * x + 4, label='true')
plt.plot(x, cs_1(x), label='cubic natural')
# plt.plot(x, cs_2(x), label='cubic 1')
# plt.plot(x, cs_3(x), label='cubic 2')
plt.legend(loc='center')
plt.show()plt.plot(x, x**3 + 2 * x**2 + 3 * x + 4, label='true')
# plt.plot(x, cs_1(x), label='cubic natural')
plt.plot(x, cs_2(x), label='cubic 1')
plt.plot(x, cs_3(x), label='cubic 2')
plt.legend(loc='center')
plt.show()

在这里插入图片描述
在这里插入图片描述

提供三个点位数据

python">import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate as spi
from IPython import embed# y = x**3 + 2 * x**2 + 3 * x + 4
cs_1= spi.CubicSpline([0, 1, 10], [4, 10, 1234], bc_type='natural')
cs_2 = spi.CubicSpline([0, 1, 10], [4, 10, 1234], bc_type=((1, 3), (1, 343)))
cs_3 = spi.CubicSpline([0, 1, 10], [4, 10, 1234], bc_type=((2, 4), (2, 64)))
x = np.linspace(0, 10, 20)
np.allclose(x**3 + 2 * x**2 + 3 * x + 4, cs_1(x))
plt.plot(x, x**3 + 2 * x**2 + 3 * x + 4, label='true')
plt.plot(x, cs_1(x), label='cubic natural')
# plt.plot(x, cs_2(x), label='cubic 1')
# plt.plot(x, cs_3(x), label='cubic 2')
plt.legend(loc='center')
plt.show()plt.plot(x, x**3 + 2 * x**2 + 3 * x + 4, label='true')
# plt.plot(x, cs_1(x), label='cubic natural')
plt.plot(x, cs_2(x), label='cubic 1')
plt.plot(x, cs_3(x), label='cubic 2')
plt.legend(loc='center')
plt.show()

在这里插入图片描述
在这里插入图片描述

python"># y = x**3 + 2 * x**2 + 3 * x + 4
cs_1= spi.CubicSpline(X, Y, bc_type='clamped')
cs_2 = spi.CubicSpline(X, Y, bc_type=((1, 0), (1, 0)))c1_pos=  spi.CubicSpline(X, Y, bc_type='natural')
c2_pos = spi.CubicSpline(X, Y, bc_type=((2, 0), (2, 0)))c1_vel = np.dot(np.diff(c1_pos(time_list)), 1000)
c1_acc = np.dot(np.diff(c1_vel), 1000)
c2_vel = np.dot(np.diff(c2_pos(time_list)), 1000)
c2_acc = np.dot(np.diff(c2_vel), 1000)plt.figure()
plt.plot(time_list, c1_pos(time_list), label='cubic natural')
plt.plot(time_list, c2_pos(time_list), label='cubic bc type')
plt.grid('on')
plt.legend(loc='upper right')
plt.xlabel('time[s]')
plt.show()plt.figure()
plt.plot(time_list[:-1], c1_vel, label='cubic natural')
plt.plot(time_list[:-1], c2_vel, label='cubic bc type')
plt.grid('on')
plt.legend(loc='upper right')
plt.xlabel('time[s]')
plt.show()plt.figure()
plt.plot(time_list[:-2], c1_acc, label='cubic natural')
plt.plot(time_list[:-2], c2_acc, label='cubic  bc type')
plt.grid('on')
plt.legend(loc='upper right')
plt.xlabel('time[s]')
plt.show()# y = x**3 + 2 * x**2 + 3 * x + 4
c1_pos= spi.CubicSpline(X, Y, bc_type='clamped')
c2_pos = spi.CubicSpline(X, Y, bc_type=((1, 0), (1, 0)))c1_vel = np.dot(np.diff(c1_pos(time_list)), 1000)
c1_acc = np.dot(np.diff(c1_vel), 1000)
c2_vel = np.dot(np.diff(c2_pos(time_list)), 1000)
c2_acc = np.dot(np.diff(c2_vel), 1000)plt.figure()
plt.plot(time_list, c1_pos(time_list), label='cubic clamped')
plt.plot(time_list, c2_pos(time_list), label='cubic bc type')
plt.grid('on')
plt.legend(loc='upper right')
plt.xlabel('time[s]')
plt.show()plt.figure()
plt.plot(time_list[:-1], c1_vel, label='cubic clamped')
plt.plot(time_list[:-1], c2_vel, label='cubic bc type')
plt.grid('on')
plt.legend(loc='upper right')
plt.xlabel('time[s]')
plt.show()plt.figure()
plt.plot(time_list[:-2], c1_acc, label='cubic clamped')
plt.plot(time_list[:-2], c2_acc, label='cubic  bc type')
plt.grid('on')
plt.legend(loc='upper right')
plt.xlabel('time[s]')
plt.show()

http://www.ppmy.cn/devtools/146452.html

相关文章

node.js文件压缩包解析,反馈解析进度,解析后的文件字节正常

场景:当我处理electron解析压缩包实现进度条的过程中发现最终的文件字节数有缺失,且有些字节为0,使用tar库研究未果! 解决方案:引入其余库解决tar-fs/tar-stream/zlib // 如果你也需要在electron中使用可以参考&#x…

设计模式-创建型-工厂方法模式

什么是工厂方法模式? 工厂方法模式(Factory Method Pattern)是 创建型设计模式之一,目的是通过定义一个用于创建对象的接口,让子类决定实例化哪个类。简而言之,工厂方法模式通过延迟对象的创建过程到子类来…

一种基于XC7V690T的在轨抗单粒子翻转系统(一)

介绍一种基于XC7V690T的在轨抗单粒子翻转系统架构,可以提高XC7V690T在轨抗单粒子翻转的能力及配置文件注数修改的灵活性。 1.硬件架构 某航天器通信机采用侧向层叠结构形式,共分为4个模块,由后至前依次为电源模块、射频模块、刷新模块及信号…

Redis——数据过期策略

文章目录 1. 引入2. 数据过期策略2.1 策略一:惰性删除2.1.1 原理2.1.2 优点2.1.3 缺点 2.2 策略二:定期删除2.2.1 原理2.2.2 模式2.2.3 优点2.2.4 缺点 2.3 两种策略的比较 3. 总结 1. 引入 Redis 是一个 高性能 的非关系型数据库,由于 Redi…

Spire.PDF for .NET【页面设置】演示:重新排列 PDF 中的页面

对于页面顺序混乱的 PDF 文档,重新排列页面可以避免读者感到困惑,还可以使文档更有条理。本文将演示如何使用Spire.PDF for .NET以编程方式重新排列现有 PDF 文档中的页面。 Spire.PDF for .NET 是一款独立 PDF 控件,用于 .NET 程序中创建、…

服务器与电脑主机各自的优势

人们经常认为服务器与电脑主机是同一种网络设备,但是两者之间还是有着明显的区别的,服务器是为了处理大量数据信息和网络服务所设计的,一般用于数据中心或者是大型的企业环境当中;电脑主机则是面向个人用户,主要用于日…

ADC(模拟数字转化器)

一、工作原理: 简单介绍: ADC 用于将模拟值从现实世界转换为数字值,如1和0。那么这些模拟值是什么?这些是我们在日常生活中看到的,比如温度、速度、亮度等。但是ADC 能否将温度和速度直接转换为0和1等数字值&#xff…

mysql-二进制安装方式

目录 1. 安装组件即依赖包 2. 创建用户 3. 关闭防火墙 4. 解压mysql二进制源码包 5. 创建文件夹并赋予权限 6. 编译安装mysql,安装完成最后面,会有一串英文,那是登录数据库的密码 7. 设置配置文件 8. 将mysql添加进环境变量 9. 复制…