Python:沿着三次样条找到x(返回y),它产生相等距离的连续(x,y)对

时间:2018-01-24 13:51:49

标签: python scipy cubic-spline

假设我有一个从[0,0]到[10,10]的三次样条曲线,边界值为零导数:

spl = scipy.interpolate.CubicSpline(x = [0,10], y = [0,10], bc_type=((1,0),(1,0)))

如果我将在x处评估的样条曲线的输出作为y坐标,我会得到一条路径'从起点到终点:

y_coordinate = spl(x_coordinate)

现在,通过numpy.linspace评估此样条曲线是非常简单的,例如使用numpy.linspace。

如果我有兴趣找到连续点之间(x,y)空间中的欧几里德距离相等的x序列,我该怎么办?

1 个答案:

答案 0 :(得分:1)

当我想要几个相同的东西时,我把它们放在一个数组中并要求SciPy最小化该数组的方差。它往往运作良好。

在下面的代码中,我决定(无论好坏)仅使用内部点作为变量(称为t),在计算距离之前插入端点a,b。另一种方法是将所有点用作变量,但强加t[0] == at[-1] == b的约束。

import numpy as np
from scipy import interpolate, optimize
import matplotlib.pyplot as plt
spl = interpolate.CubicSpline(x = [0, 10], y = [0, 10], bc_type=((1, 0), (1, 0)))
def distances_var(t, a, b):
    atb = np.concatenate(([a], t, [b]))   # added endpoints
    y = spl(atb)
    dist_squared = np.diff(atb)**2 + np.diff(y)**2
    return np.var(dist_squared)
a, b = 0, 10
n = 7        # how many points to put
res = optimize.minimize(distances_var, np.linspace(a, b, n)[1:-1], args=(a, b))
x = np.concatenate(([a], res.x, [b]))  # the points we want
xx = np.linspace(a, b, 500)            # for plotting the curve
plt.axes().set_aspect('equal')
plt.plot(xx, spl(xx))
plt.plot(x, spl(x), 'ro')
plt.show()

spline