问题:当给定一堆点时推导椭圆公式的最佳方法(比如连接时绘制椭圆的 60 个点)?
背景:使用 R Momocs 库函数conf_ell返回置信椭圆坐标。将这些点抽象成公式会很好。
您可以在下图中看到我的椭圆点;
任何建议都非常感谢,谢谢
问题:当给定一堆点时推导椭圆公式的最佳方法(比如连接时绘制椭圆的 60 个点)?
背景:使用 R Momocs 库函数conf_ell返回置信椭圆坐标。将这些点抽象成公式会很好。
您可以在下图中看到我的椭圆点;
任何建议都非常感谢,谢谢
一种直接的方法,特别是当您期望点恰好落在椭圆上时(但即使它们不这样做也有效),是观察椭圆是二阶多项式的零集
因此,您可以使用最小二乘法(没有常数项)从五个或更多点(x_i,\,y_i)估计系数。响应变量是一个向量,而解释变量是。
拟合显示为黑色椭圆。绘制了真实基础椭圆的中心和轴以供参考。
当已知点落在椭圆上时,您可以使用任意五个点来估计其参数。(当您计算出正规方程时,您将根据这十个坐标获得椭圆的明确公式。)最好选择椭圆周围广泛分布的点,而不是聚集在一个地方。
这是R用于完成工作的代码。“估计参数”之后中间的三行说明了使用最小二乘法来求系数。
center <- c(1,2)
axis.main <- c(3,1)
axis.lengths <- c(4/3, 1/2)
sigma <- 1/20 # Error SD in each coordinate
n <- 60 # Number of points to generate
set.seed(17)
#
# Compute the axes.
#
axis.main <- axis.main / sqrt(crossprod(axis.main))
axis.aux <- c(-axis.main[2], axis.main[1]) * axis.lengths[2]
axis.main <- axis.main * axis.lengths[1]
axes <- cbind(axis.main, axis.aux)
#
# Generate points along the ellipse.
#
s <- seq(0, 2*pi, length.out=n+1)[-1]
s.c <- cos(s)
s.s <- sin(s)
x <- axis.main[1] * s.c + axis.aux[1] * s.s + center[1] + rnorm(n, sd=sigma)
y <- axis.main[2] * s.c + axis.aux[2] * s.s + center[2] + rnorm(n, sd=sigma)
#
# Estimate the parameters.
#
X <- as.data.frame(cbind(One=1, x, y, xy=x*y, x2=x^2, y2=y^2))
fit <- lm(One ~ . - 1, X)
beta.hat <- coef(fit)
#
# Plot the estimate, the point, and the original axes.
#
evaluate <- function(x, y, beta) {
if (missing(y)) {
y <- x[, 2]; x <- x[, 1]
}
as.vector(cbind(x, y, x*y, x^2, y^2) %*% beta - 1)
}
e.x <- diff(range(x)) / 40
e.y <- diff(range(y)) / 40
n.x <- 100
n.y <- 60
u <- seq(min(x)-e.x, max(x)+e.x, length.out=n.x)
v <- seq(min(y)-e.y, max(y)+e.y, length.out=n.y)
z <- matrix(evaluate(as.matrix(expand.grid(u, v)), beta=beta.hat), n.x)
contour(u, v, z, levels=0, lwd=2, xlab="x", ylab="y", asp=1)
arrows(center[1], center[2], axis.main[1]+center[1], axis.main[2]+center[2],
length=0.15, angle=15)
arrows(center[1], center[2], axis.aux[1]+center[1], axis.aux[2]+center[2],
length=0.15, angle=15)
points(center[1], center[2])
points(x,y, pch=19, col="Red")