繁体   English   中英

三维空间中直线曲线的样条插值系数

[英]spline interpolation coefficients of a line curve in 3d space

我是python的新手。 我在由一组给定点定义的3D空间中有一条直线曲线。 任何人都可以建议我如何使用scipy包的样条函数插值来获得曲线的样条系数,就像MATLAB中的spline.coeff函数一样? 谢谢!

编辑:

我用过了

tck = interpolate.SmoothBivariateSpline(pts2[:,0], pts2[:,1], pts2[:,2])
test_pts = pts2[:,2]-tck.ev(pts2[:,0], pts2[:,1])
print test_pts

但是这对于表面来说显然不适用于线条曲线pts2是一个包含点坐标的Nx3 numpy array

好吧我弄清楚我做错了什么。 我的输入点太少了。 现在我有另一个问题。 函数get_coeffs应该返回每个没有的样条系数。 这些系数返回的顺序是什么? 我有一个79 tx和79 ty的数组代表结,当我调用函数调用结时,我得到一个1x5625的数组

我也是python的新手,但是我最近的搜索让我得到了一个非常有用的scipy插值教程 从我的阅读中我发现,BivariateSpline系列类/函数用于插入3D曲面而不是3D曲线。

对于我的3D曲线拟合问题(我认为它与你的非常相似,但又想要消除噪音)我最终使用了scipy.interpolate.splprep (不要与scipy.interpolate.splrep混淆)。 从上面链接的教程中,您正在寻找的样条系数由splprep返回。

正常输出是3元组,(t,c,k),包含结点,t,系数c和样条的阶数k。

文档将这些过程函数称为“较旧的,非面向对象的FITPACK包装”,而不是“更新的,面向对象的”UnivariateSpline和BivariateSpline类。 我自己会更喜欢“更新,面向对象”,但据我所知,UnivariateSpline只处理1-D情况,而splprep直接处理ND数据。

下面是一个简单的测试用例,我用它来弄清楚这些函数:

import numpy as np
import matplotlib.pyplot as plt
from scipy import interpolate
from mpl_toolkits.mplot3d import Axes3D


# 3D example
total_rad = 10
z_factor = 3
noise = 0.1

num_true_pts = 200
s_true = np.linspace(0, total_rad, num_true_pts)
x_true = np.cos(s_true)
y_true = np.sin(s_true)
z_true = s_true/z_factor

num_sample_pts = 80
s_sample = np.linspace(0, total_rad, num_sample_pts)
x_sample = np.cos(s_sample) + noise * np.random.randn(num_sample_pts)
y_sample = np.sin(s_sample) + noise * np.random.randn(num_sample_pts)
z_sample = s_sample/z_factor + noise * np.random.randn(num_sample_pts)

tck, u = interpolate.splprep([x_sample,y_sample,z_sample], s=2)
x_knots, y_knots, z_knots = interpolate.splev(tck[0], tck)
u_fine = np.linspace(0,1,num_true_pts)
x_fine, y_fine, z_fine = interpolate.splev(u_fine, tck)

fig2 = plt.figure(2)
ax3d = fig2.add_subplot(111, projection='3d')
ax3d.plot(x_true, y_true, z_true, 'b')
ax3d.plot(x_sample, y_sample, z_sample, 'r*')
ax3d.plot(x_knots, y_knots, z_knots, 'go')
ax3d.plot(x_fine, y_fine, z_fine, 'g')
fig2.show()
plt.show()

输出图

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM