Python 旋转抛物面曲面拟合

Python 旋转抛物面曲面拟合,python,matlab,curve-fitting,least-squares,surface,Python,Matlab,Curve Fitting,Least Squares,Surface,我有一组实验确定的(x,y,z)点,它们对应于一条抛物线。不幸的是,数据未沿任何特定轴对齐,因此对应于旋转抛物线 我有以下一般表面: Ax^2+By^2+Cz^2+Dxy+Gyz+Hzx+Ix+Jy+Kz+L=0 我需要制作一个模型,可以准确地表示抛物线使用(我假设)最小二乘拟合。我似乎不明白这是怎么回事。我想旋转抛物线,直到它的中心轴与z轴对齐,但我不知道这个轴是什么。Matlab的cftool似乎只适合z=f(x,y)形式的方程,我不知道python中有任何东西可以解决这个问题。 我还尝试用

我有一组实验确定的(x,y,z)点,它们对应于一条抛物线。不幸的是,数据未沿任何特定轴对齐,因此对应于旋转抛物线

我有以下一般表面: Ax^2+By^2+Cz^2+Dxy+Gyz+Hzx+Ix+Jy+Kz+L=0

我需要制作一个模型,可以准确地表示抛物线使用(我假设)最小二乘拟合。我似乎不明白这是怎么回事。我想旋转抛物线,直到它的中心轴与z轴对齐,但我不知道这个轴是什么。Matlab的cftool似乎只适合z=f(x,y)形式的方程,我不知道python中有任何东西可以解决这个问题。 我还尝试用数值方法求解参数。当我试着把它变成一个矩阵方程并用最小二乘法求解时,矩阵是可逆的,因此我的参数都是零。我也被困在这个问题上,任何帮助都将不胜感激。我并不介意这种方法,因为我熟悉matlab、python和线性代数(如果需要的话)


谢谢

您是否有足够的数据点来适应所有10个参数-您至少需要10个


我还怀疑,10个参数对于描述一般抛物面来说是非常重要的,这意味着一些参数是相关的。我的观点是,一个经过平移和旋转的抛物面需要7个参数(虽然我不是很确定)

不要使用任何工具箱、GUI或特殊函数来解决这个问题。你的问题很常见,你提供的方程式可以很直接地解决。线性最小二乘问题的解决方案可以概括为:

  • 向量空间的基是x^2,y^2,z^2,xy,yz,zx,x,y,z,1。因此,向量有10维
  • 您的问题可以表示为Ap=b,其中p=[ab C D E F G H I J K L]^T是包含您的参数的向量。右侧b应为全零,但由于模型误差、数据不确定性或数值原因,将包含一些残差。必须尽量减少这种残留
  • 矩阵A的维数为N×10,其中N表示抛物线表面上已知点的数目
  • A=[x(1)^2Y(1)^2…y(1)z(1)1

    x(N)^2 y(N)^2…y(N)z(N)1]

  • 通过计算p=A\b来求解超定线性方程组

  • 你在python中看到过吗?我使用scipy的曲线拟合。它接受x的向量值,所以我将3D数据表示为1D表。嗨,双元音,我构造了这个矩阵,它的大小为120 x 10矩阵。我还把b作为一个120x1的向量。当我试着解这个方程时,我只得到矩阵是可逆的,因此系数向量都是零。我知道问题很可能是由于您的步骤2。我不知道你所说的“右侧b……由于模型错误,将包含一些残余物……”是什么意思。换句话说,我怎么能得到一个非零的b呢?事实证明你的系数是线性相关的。当然,最简单的解决方案是所有的都是零。您需要去掉一个参数。我建议你定义L=-1。然后你可以把矩阵A的最后一列放在右边。新矩阵A*的维数应为nx9,新矩阵b*的维数应为1。如果您成功使用此修改,我将相应地编辑我的帖子,因此如果您这样做,请让我知道。我定义了常量参数,如您所说(L=-1)。这给了我一个1的向量。正如你所说,我的新矩阵是nx9。当我解这个方程时,我得到所有的参数都是零,除了x,y和z分量,当然还有常数参数(定义为L=1)。这当然对应于一个平面,当我需要一个抛物面时。我想知道你对此有什么建议吗?试着计算剩余的r=A*p-b。如果为零或非常小,则抛物线方程成立,至少对于选定的点是如此。在这种情况下,您需要分析这是如何发生的。如果残差是非零的,那么最小二乘问题就没有得到正确的解决。我有超过一百个点,所以我相信它应该是可以的。我还确信,10参数方程对应于二次曲面的完整一般曲面。如果其中有些确实是不必要的,我想有些会变成零——我有足够的点来保证这一点。一个完整的一般二次曲面可以是抛物面以外的其他曲面。曲面上的约束使其成为抛物面,从而减少了参数的数量(到7?)。在你的方程中,一个参数可以通过除法立即消除,所以即使对于一般的二次型方程,它也最多是9个独立的参数。此外,一般的二次曲面可能位于复数空间,从而使拟合更加复杂。为了有助于拟合,请重写方程并删除一些参数以对应于抛物面。