模拟5个三维离散点作为物体运动轨迹上的点,在每相邻两个点中插入50个点并绘制非线性拟合曲线,最后使用滤波使曲线变平滑,给出所有的python代码
时间: 2024-02-24 19:55:24 浏览: 145
离散数据的曲线拟合程序
5星 · 资源好评率100%
好的,我来为您提供Python代码。首先,我们需要导入所需的库:numpy、matplotlib和scipy。
```python
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import make_interp_spline, BSpline
from scipy.signal import savgol_filter
```
接下来,我们可以随机生成5个三维离散点,并将它们绘制出来。
```python
# 随机生成5个三维离散点
x = np.random.rand(5, 3) * 10
# 绘制三维散点图
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x[:, 0], x[:, 1], x[:, 2], c='r', marker='o')
plt.show()
```
接下来,我们需要在每相邻两个点中插入50个点。我们可以使用numpy中的linspace函数来实现。
```python
# 在每相邻两个点中插入50个点
t = np.linspace(0, 1, 55)
x_new = np.zeros((20, 3))
for i in range(4):
t1, t2 = t[i*55:(i+1)*55], t[(i+1)*55:(i+2)*55]
x1, x2 = x[i], x[i+1]
x_new[i*5:(i+1)*5] = x1 + (x2 - x1) * t1[:-5, np.newaxis]
x_new[(i+1)*5:(i+2)*5] = x1 + (x2 - x1) * t2[5:, np.newaxis]
```
现在,我们可以使用scipy库中的插值函数来拟合非线性曲线。我们可以使用make_interp_spline函数来创建样条插值对象,并使用BSpline函数来评估插值点。
```python
# 创建样条插值对象
t_new = np.linspace(0, 1, 100)
spl = make_interp_spline(t, x_new, k=3)
# 评估插值点
x_smooth = spl(t_new)
# 绘制平滑曲线
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot(x_smooth[:, 0], x_smooth[:, 1], x_smooth[:, 2], 'b')
plt.show()
```
最后,我们可以使用savgol_filter函数来对曲线进行平滑处理。
```python
# 对曲线进行平滑处理
x_smooth = savgol_filter(x_smooth, window_length=7, polyorder=3)
# 绘制平滑曲线
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot(x_smooth[:, 0], x_smooth[:, 1], x_smooth[:, 2], 'b')
plt.show()
```
完整代码如下:
阅读全文