首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >二维椭圆与给定点的拟合方法

二维椭圆与给定点的拟合方法
EN

Stack Overflow用户
提问于 2017-12-18 17:44:17
回答 3查看 25.8K关注 0票数 13

我想用椭圆函数来拟合二维阵列(x /a)2+ (y /b)2= 1 ->(因此得到a和b)

然后,可以在我的图表上重绘它。我在网上找到了很多例子,但是没有人用这个简单的笛卡尔方程。我可能搜索得很糟糕!我认为解决这个问题的基本办法可以帮助很多人。

以下是数据的一个示例:

可悲的是,我不能把这些价值观..。让我们假设,我有一个X,Y数组,定义每个点的坐标,

EN

Stack Overflow用户

发布于 2017-12-18 21:13:20

按照ErroriSalvo的建议,下面是用奇异值分解拟合椭圆的完整过程。数组x,y是给定点的坐标,假设有N个点。然后由形状(2,N)的中心坐标阵的SVD得到U,S,V。因此,U是2×2正交矩阵(旋转),S是长度为2的向量(奇异值),V是N乘N的正交矩阵。

将单位圆转化为最佳拟合椭圆的线性映射是

代码语言:javascript
复制
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,才能得到单位圆。

代码语言:javascript
复制
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就是你所需要的,这就是椭圆方程中的ab

票数 13
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47873759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档