繁体   English   中英

在3d空间中为1d曲线获得良好的插值/拟合-Python

[英]Getting a good interpolation/fit for 1d curve in 3d space — Python

我有一组3d坐标(x,y,z) ,我想将这些坐标拟合到空间曲线。 有人知道Python中已有的例程吗?

根据我发现的内容( https://docs.scipy.org/doc/scipy/reference/interpolate.html ),现有的模块可以将曲线拟合到一组二维坐标,而其他模块则可以将曲面拟合到3d坐标集。 我想要中间路径-将曲线拟合到一组3d坐标。

编辑-

我在这里的另一篇文章中找到了一个明确的答案,使用interpolate.splprep()interpolate.splenv() 这是我的数据点:

    import numpy as np
    data = np.array([[21.735556483642707,  7.9999120559310359,  -0.7043281314370935],
                    [21.009401429607784,  8.0101161320825103,  -0.16388503829177037],
                    [20.199370045383134,  8.0361339131845497,  0.25664085801558179],
                    [19.318149385194054,  8.0540100864979447,  0.50434139043379278],
                    [18.405497793567243,  8.0621753888918484,  0.57169888018720161],
                    [17.952649703401562,  8.8413995204241491,  0.39316793526155014],
                    [17.539007529982641,  9.6245700151356104,  0.14326173861202204],
                    [17.100154581079089,  10.416295524018977,  0.011339000091976647],
                    [16.645143439968102,  11.208477191735446,  0.070252116425261066],
                    [16.198247656768263,  11.967005154933993,  0.31087815045809558],
                    [16.661378578010989,  12.717314230004659,  0.54140549139204996],
                    [17.126106263351478,  13.503461982612732,  0.57743407626794219],
                    [17.564249250974573, 14.28890107482801, 0.42307198199366186],
                    [17.968265052275274,  15.031985807202176, 0.10156997950061938]])

这是我的代码:

    from scipy import interpolate
    from mpl_toolkits.mplot3d import Axes3D

    data = data.transpose()

    #now we get all the knots and info about the interpolated spline
    tck, u= interpolate.splprep(data, k=5)
    #here we generate the new interpolated dataset, 
    #increase the resolution by increasing the spacing, 500 in this example
    new = interpolate.splev(np.linspace(0,1,500), tck, der=0)

    #now lets plot it!
    fig = plt.figure()
    ax = Axes3D(fig)
    ax.plot(data[0], data[1], data[2], label='originalpoints', lw =2, c='Dodgerblue')
    ax.plot(new[0], new[1], new[2], label='fit', lw =2, c='red')
    ax.legend()
    plt.savefig('junk.png')
    plt.show()

这是图像:

数据和适合度。

您可以看到拟合效果不好,而我已经在使用允许的最大拟合顺序值( k=5 )。 这是因为曲线没有完全凸出吗? 有谁知道我该如何提高身材?

取决于这些点代表什么,但是如果只是位置数据,则可以使用卡尔曼过滤器,例如用python编写的过滤器 您可以随时查询卡尔曼过滤器以获取当时的“期望点”,因此它就像时间的函数一样工作。

如果您确实打算使用卡尔曼滤波器,只需将初始估计值设置为第一个坐标,并将协方差设置为大数字的对角矩阵,这将表明您不确定下一个点的位置,即会很快将过滤器锁定到您的坐标上。

您不希望使用样条线拟合方法,因为样条线将始终遍历您的数据。

您可以将曲线拟合到任何尺寸数据。 曲线拟合/优化算法(例如,在scipy.optimize )都将要建模的观测值视为普通的一维数组,而不管独立变量是什么。 如果将3d数据展平,则每个值将对应一个(x,y,z)元组。 您可以将该信息作为“额外”数据传递给拟合例程,以帮助您计算适合数据的模型曲线。

暂无
暂无

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

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