python - 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()
这是创建平滑曲线(红色)的许多点的示例,但该线与物理数据点(绿色)不对齐。
这是由太少的数据点(绿色)创建的样条曲线(红色)中的扭结示例。这更类似于我的数据集的样子。
解决方案
将您的 U 更改为:
新 = np.arange(0, 1.00, 0.005)
推荐阅读
- java - 如何实现一种方法来查找我的 5x5 矩阵中每一行和每一列的最大元素?
- html - Flexbox:填充空间,同时使每个孩子的宽度相同
- bash - 如果另一列的条件为真,如何在 bash shell 中将一列划分为一个数字?
- laravel - 使用 where 子句的值来触发函数
- pandas - Get_dummies 产生的列比预期的多
- python - 使用请求安全处理潜在的恶意 URL
- vba - 显示运行时错误 2471 的访问表单中连接到按钮的代码问题
- python - Python中的SOLID
- javascript - NodeJS (Windows) - 语法错误:缺少 X
- c# - 在 C# 中返回 JSON 对象数组