如何在R中绘制给定一般方程的椭圆?
椭圆一般方程:如何在R中绘制给定一般方程的椭圆?,r,math,plot,ellipse,R,Math,Plot,Ellipse,椭圆一般方程: a * x ^ 2 + b * y ^ 2 + c * x * y + d * x + e * y + f = 0 我们可以从椭圆的参数方程开始(以下一个来自维基百科),我们需要5个参数:中心(xc,yc)或(h,k)在另一种表示法中,轴长度a,b和x轴与长轴之间的角度phi或另一种符号中的tau 对于步骤(2),使用以下代码: t <- seq(0, 2*pi, 0.01) x <- xc + a*cos(t)*cos(phi) - b*sin(t)*sin(
a * x ^ 2 + b * y ^ 2 + c * x * y + d * x + e * y + f = 0
我们可以从
椭圆的参数方程开始(以下一个来自维基百科),我们需要5个参数:中心(xc,yc)
或(h,k)
在另一种表示法中,轴长度a,b
和x轴与长轴之间的角度phi
或另一种符号中的tau
对于步骤(2),使用以下代码:
t <- seq(0, 2*pi, 0.01)
x <- xc + a*cos(t)*cos(phi) - b*sin(t)*sin(phi)
y <- yc + a*cos(t)*cos(phi) + b*sin(t)*cos(phi)
plot(x,y,pch=19, col='blue')
t我们可以从椭圆的参数方程开始(以下一个来自维基百科),我们需要5个参数:中心(xc,yc)
或(h,k)
在另一种表示法中,轴长度a,b
和x轴与长轴之间的角度phi
或另一种符号中的tau
对于步骤(2),使用以下代码:
t <- seq(0, 2*pi, 0.01)
x <- xc + a*cos(t)*cos(phi) - b*sin(t)*sin(phi)
y <- yc + a*cos(t)*cos(phi) + b*sin(t)*cos(phi)
plot(x,y,pch=19, col='blue')
t另一个答案向您展示了当您知道椭圆的中心轴和长轴时如何绘制椭圆。但从一般的椭圆方程来看,它们并不明显。在这里,我将从头开始
省略数学推导,您需要从以下等式中求解中心:
a * x ^ 2 + b * y ^ 2 + c * x * y + d * x + e * y + f = 0
(oops:应该是“generatev
”而不是“generateu
”;我无法修复它,因为原来的LaTeX现在丢失了,我不想再键入了……)
下面是一个R函数,用于执行此操作:
plot.ellipse <- function (a, b, c, d, e, f, n.points = 1000) {
## solve for centre
A <- matrix(c(a, c / 2, c / 2, b), 2L)
B <- c(-d / 2, -e / 2)
mu <- solve(A, B)
## generate points on circle
r <- sqrt(a * mu[1] ^ 2 + b * mu[2] ^ 2 + c * mu[1] * mu[2] - f)
theta <- seq(0, 2 * pi, length = n.points)
v <- rbind(r * cos(theta), r * sin(theta))
## transform for points on ellipse
z <- backsolve(chol(A), v) + mu
## plot points
plot(t(z), type = "l")
}
plot.eliple另一个答案向您展示了当您知道椭圆的中心轴和长轴时如何绘制椭圆。但从一般的椭圆方程来看,它们并不明显。在这里,我将从头开始
省略数学推导,您需要从以下等式中求解中心:
a * x ^ 2 + b * y ^ 2 + c * x * y + d * x + e * y + f = 0
(oops:应该是“generatev
”而不是“generateu
”;我无法修复它,因为原来的LaTeX现在丢失了,我不想再键入了……)
下面是一个R函数,用于执行此操作:
plot.ellipse <- function (a, b, c, d, e, f, n.points = 1000) {
## solve for centre
A <- matrix(c(a, c / 2, c / 2, b), 2L)
B <- c(-d / 2, -e / 2)
mu <- solve(A, B)
## generate points on circle
r <- sqrt(a * mu[1] ^ 2 + b * mu[2] ^ 2 + c * mu[1] * mu[2] - f)
theta <- seq(0, 2 * pi, length = n.points)
v <- rbind(r * cos(theta), r * sin(theta))
## transform for points on ellipse
z <- backsolve(chol(A), v) + mu
## plot points
plot(t(z), type = "l")
}
plot.eliple您可以使用我的软件包(希望很快在CRAN上):
库(平面几何)
ell您可以使用我的软件包(希望很快就可以使用CRAN):
库(平面几何)
在R中有哪些函数可以绘制椭圆?我对他们的论点很感兴趣。R中的椭圆包可能对你有帮助。请浏览此链接-帖子上的更正:*a和b是半轴*坐标是(sin(phi)
而不是下面第二行的cos(phi)
)x通常的方法是在x值范围内循环,计算y值,并要求绘图软件在点之间绘制直线或样条曲线。这里唯一的关键是你必须做两次:一次是椭圆的上曲线,一次是下曲线。在R中有什么函数可以用来画椭圆?我对他们的论点很感兴趣。R中的椭圆包可能对你有帮助。请浏览此链接-帖子上的更正:*a和b是半轴*坐标是(sin(phi)
而不是下面第二行的cos(phi)
)x通常的方法是在x值范围内循环,计算y值,并要求绘图软件在点之间绘制直线或样条曲线。这里唯一的症结是你必须做两次:一次是椭圆的上曲线,另一次是下曲线。答案很好!问题:为什么原始问题有“f”参数,而您的解决方案没有?它退学了吗?我的错。我只看了第一个矩阵方程。因此,如果我加上一个正定性检查,那么就可以确保用户输入的任何任意参数对于椭圆都是正确的吗?@好奇猫这些参数必须保持:a>0
<代码>4ab-c^2>0
;另外,r^2>0
。这是一个工作示例:plot.eliple(1,3,2,12,-5,50)
回答得很好!问题:为什么原始问题有“f”参数,而您的解决方案没有?它退学了吗?我的错。我只看了第一个矩阵方程。因此,如果我加上一个正定性检查,那么就可以确保用户输入的任何任意参数对于椭圆都是正确的吗?@好奇猫这些参数必须保持:a>0
<代码>4ab-c^2>0
;另外,r^2>0
。这是一个工作示例:plot.ellipse(1,3,2,12,-5,50)
关于代码本身的三条注释:y错误:等式(位于文章顶部的图像)和y代码之间的差异在步骤2的2个位置从y代码中删除错误我相信您有一个打字错误,它应该是:y关于代码本身的三个注释:y错误:等式(位于文章顶部的图像)和y代码之间的差异在第2步中从y代码中删除错误。我相信您有一个打字错误,它应该是:y