我想用椭圆函数来拟合二维阵列:(x /a)2+ (y /b)2= 1 ->(因此得到a和b)。
然后,可以在我的图表上重绘它。我在网上找到了很多例子,但是没有人用这个简单的笛卡尔方程。我可能搜索得很糟糕!我认为解决这个问题的基本办法可以帮助很多人。
以下是数据的一个示例:

可悲的是,我不能把这些价值观..。让我们假设,我有一个X,Y数组,定义每个点的坐标,。
发布于 2017-12-18 21:13:20
按照ErroriSalvo的建议,下面是用奇异值分解拟合椭圆的完整过程。数组x,y是给定点的坐标,假设有N个点。然后由形状(2,N)的中心坐标阵的SVD得到U,S,V。因此,U是2×2正交矩阵(旋转),S是长度为2的向量(奇异值),V是N乘N的正交矩阵。
将单位圆转化为最佳拟合椭圆的线性映射是
sqrt(2/N) * U * diag(S) 其中diag(S)是对角线上具有奇异值的对角线矩阵。为了了解为什么需要sqrt(2/N)的因子,假设点x,y是从单位圆中均匀取出来的。然后sum(x**2) + sum(y**2)是N,因此坐标矩阵由长度为sqrt(N/2)的两个正交行组成,因此它的范数(最大奇异值)是sqrt(N/2)。我们需要把这个降到1,才能得到单位圆。
N = 300
t = np.linspace(0, 2*np.pi, N)
x = 5*np.cos(t) + 0.2*np.random.normal(size=N) + 1
y = 4*np.sin(t+0.5) + 0.2*np.random.normal(size=N)
plt.plot(x, y, '.') # given points
xmean, ymean = x.mean(), y.mean()
x -= xmean
y -= ymean
U, S, V = np.linalg.svd(np.stack((x, y)))
tt = np.linspace(0, 2*np.pi, 1000)
circle = np.stack((np.cos(tt), np.sin(tt))) # unit circle
transform = np.sqrt(2/N) * U.dot(np.diag(S)) # transformation matrix
fit = transform.dot(circle) + np.array([[xmean], [ymean]])
plt.plot(fit[0, :], fit[1, :], 'r')
plt.show()

但是如果你假设没有旋转,那么np.sqrt(2/N) * S就是你所需要的,这就是椭圆方程中的a和b。
https://stackoverflow.com/questions/47873759
复制相似问题