【发布时间】:2021-09-20 07:16:59
【问题描述】:
我有一些数据可以绘制二维轨迹。我想为这些数据拟合一条插值曲线,我认为每组三个连续点之间的三次样条曲线会很好用。但是,scipy 中的插值函数让我有点困惑。这是我目前拥有的:
import scipy.interpolate as interpolate
import matplotlib.pyplot as plt
xs = [398.01543948 400.99034244 402.36995272 401.05813953 398.65277778
395.97260274 393.08474576 390.325 387.42105263 384.17073171
380.42028986 377.20754717 373.80769231 370.04545455 366.796875
363.33823529 359.63636364 356.22033898 352.95555556 349.41176471
345.87878788 341.89189189 337.91666667 334.84482759 331.60273973
328. 296.51515152 293.91176471 290.31111111 287.16666667
283.97222222 281.56 278.79591837 276.32631579 273.65195849
271.53191489 270.25503356 279.75497404 276.09359445 270.42035064
298.7761194 298.74285714]
ys = [172.76204179 176.63910967 179.49095377 180.34710744 180.82075472
181.04255319 181.07368421 181.06382979 181.1875 181.21875
181.15909091 181.06410256 181. 181.01923077 180.84615385
180.8125 180.69135802 180.69565217 180.68 180.68571429
180.69117647 180.62264151 180.87323944 180.71666667 180.63333333
180.64788732 181.4137931 180.94871795 181.31372549 181.25
181.02 180.53030303 180.63541667 180.73529412 180.72631579
180.00884956 179.03915758 172.17751105 171.69548635 173.73376084
156.93617021 156.52671756]
tck, u = interpolate.splprep([xs, ys])
x_i, y_i = interpolate.splev(np.linspace(0, 1, 100), tck)
plt.plot(x_i, y_i)
plt.scatter(xs, ys, c='r')
plt.show()
现在我知道一切都像宣传的那样工作,但我想知道是否有某种方法可以对导数或生成的样条曲线的平滑度设置限制,以消除像那个丑陋的尖峰这样的伪影。
非常感谢!
【问题讨论】:
标签: scipy interpolation