首页 > 解决方案 > Python 的 3 维样条曲线

问题描述

我正在寻找一个在他们的曲线拟合工具箱中模仿 MATLAB 函数的cscvn函数,适用于 3D 空间中的点。我发现的最接近的函数是scipy.interpolate.splprep,它能够计算 3 维,但由于数据点较少而失去了准确性。如果平滑度降低到拟合点的点,则曲线有扭结。

我有一个由要建模的物理点(高程数据)组成的离散数据集,因此样条曲线必须通过这些点。在彼此不同的弦长处存在有限数量的点。

这是我为测试 Python 样条而编写的快速测试函数的示例。不幸的是,我无法分享我的 MATLAB 代码,但cscvn函数样条曲线平滑并通过所有数据点。

import scipy as sp
import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import splprep, splev, interp2d

x = np.linspace(0, 10, num = 20)   #list of known x coordinates
y = 2*x   #list of known y coordinates
z = x*x   #list of known z coordinates
## Note: You must have more points than degree of the spline. if k = 3, must have 4 points min.

print([x,y,z])

tck, u = splprep([x,y,z], s = 26)  # Generate function out of provided points, default k = 3
newPoints = splev(u, tck)          # Creating spline points
print(newPoints)

ax = plt.axes(projection = "3d")
ax.plot3D(x, y, z, 'go')     # Green is the actual 3D function
ax.plot3D(newPoints[:][0], newPoints[:][1], newPoints[:][2], 'r-')   # Red is the spline
plt.show()

这是创建平滑曲线(红色)的许多点的示例,但该线与物理数据点(绿色)不对齐。

很多点,样条未命中

这是由太少的数据点(绿色)创建的样条曲线(红色)中的扭结示例。这更类似于我的数据集的样子。

点太少,样条扭结

标签: pythonmatlabscipycurve-fittingspline

解决方案


将您的 U 更改为:

新 = np.arange(0, 1.00, 0.005)


推荐阅读