【问题标题】:Generate data inside ellipse and rectangle在椭圆和矩形内生成数据
【发布时间】:2022-01-05 21:15:41
【问题描述】:

我需要生成数据,我应该在以下计算中使用这些数据。我的数据的一部分应该包括 15000 个点,这些点在椭圆内均匀分布(R 中的 runif)。这是椭圆的方程: 另一部分数据应该包括矩形内的 10000 个点。这是矩形的方程:How can I do this?

【问题讨论】:

  • 你有没有尝试过?我建议您在每个形状的 extremes 内生成随机数据,然后过滤这些点以仅包含实际方程定义的形状内的那些点。这意味着您需要生成比确保获得足够的随机数据更多的随机数。
  • @r2evans 我试着只画椭圆,从那里我已经遇到了问题,你能给我看一些代码的例子吗?我数学不太好
  • 绘制数据与生成随机数据无关。
  • @r2evans 我需要可视化来更好地理解,关于生成数据,我只知道这样的代码:c<-runif(10000,1,1000)我不知道如何将它与椭圆匹配

标签: r math distribution rectangles ellipse


【解决方案1】:

均匀分布的点

这是一个日食数据的例子(你可以按照类似的想法来处理矩形)

n <- 1.5e4
feclipse <- function(x, y) 2 * (x - 6)^2 + 3 * (y - 4)^2 - 10
res <- c()
repeat {
  if (length(res) / 2 == n) break
  x <- runif(1, 6 - sqrt(5), 6 + sqrt(5))
  y <- runif(1, 4 - sqrt(10 / 3), 4 + sqrt(10 / 3))
  if (feclipse(x, y) <= 0) {
    res <- rbind(res, c(X = x, Y = y))
  }
}

plot(res) 给了


非均匀分布点

另一种选择是根据x 使用y 的解析解来生成随机元组

x <- runif(n, 6 - sqrt(5), 6 + sqrt(5))
y <- runif(n, 4 - sqrt((10 - 2 * (x - 6)^2) / 3), 4 + sqrt((10 - 2 * (x - 6)^2) / 3))

plot(x, y)

给了

或者,您可以使用极坐标表示来生成点

theta <- runif(n, 0, 2 * pi)
rho <- runif(n)
x <- rho * sqrt(5) * sin(theta) + 6
y <- rho * sqrt(10 / 3) * cos(theta) + 4
plot(cbind(x, y))

给了

【讨论】:

  • 不错。我特别喜欢均匀分布与非均匀分布的对比。
  • 你能举一个矩形(均匀分布的点)的例子吗?
  • @Vorrven 我认为 jblood94 stackoverflow.com/a/70156321/12158757 的答案为矩形中的均匀点提供了一个非常好的答案。
  • @ThomasIsCoding 好的,我会用它,非常感谢你的帮助!
【解决方案2】:

这些都可以使用转换后的统一变量进行采样而不会拒绝。

矩形:

set.seed(94)
u <- runif(1.5e4, max = 3)
v <- runif(1.5e4, max = 2)
x <- u + v - 10
y <- v - u + 8
# sanity check
range(x + y)
#[1] -1.999774  1.999826
range(x - y + 15)
#[1] -2.999646  2.999692
plot(x, y)

椭圆(见Algorithm: Calculate pseudo-random point inside an ellipse):

phi <- runif(1e4, max = 2*pi)
rho <- sqrt(runif(1e4))
x <- sqrt(5)*rho*cos(phi) + 6
y <- sqrt(10/3)*rho*sin(phi) + 4
# sanity check
range(2*(x - 6)^2 + 3*(y - 4)^2)
#[1] 0.001536582 9.999425234
plot(x, y)

派生更新:

矩形:
矩形由以下线条界定:
y = -2 - x
y = 2 - x
y = x + 12
y = x + 18
矩形的最左边点是通过第一条线和最后一条线相交的点 (-10, 8) 找到的。

矩形的尺寸为 3*sqrt(2) 和 2*sqrt(2),因此请从具有以下尺寸的矩形中取样:
u = 3*sqrt(2)*U1
v = 2*sqrt(2)*U2
其中 U1 和 U2 是标准的均匀随机变量(即runif)。

由于边界线的斜率为 -1 和 1,我们可以将矩形视为围绕原点轴旋转 -90°。将 u 和 v 旋转 -90° 以将包含 (u, v) 的矩形定向到与所需矩形相同的方向:
x = u*cos(-90°) - v*sin(-90°) = sqrt(2)*(u + v)/2 = 3*U1 - 2*U2
y = v*cos(-90°) + u*sin(-90°) = sqrt(2)*(v - u)/2 = 3*U1 + 2*U2

(x, y) 的最左边的点仍然在原点,因此将点平移 (-10, 8) 以匹配所需的矩形:
x = 3*U1 - 2*U2 - 10
y = 3*U1 + 2*U2 + 8

椭圆:
x - 6y - 4 表示您的椭圆以 (6, 4) 为中心。

忽略 6 和 4,使椭圆居中于原点,然后以标准形式写出椭圆的方程:
x^2/a^2 + y^2/b^2 = 1
a = sqrt(5)
b = sqrt(10/3)
a 和 b 是椭圆的尺寸。

【讨论】:

  • 你能解释一下,在矩形中你如何计算x和y?为什么要使用数字 10 和 8?
  • 还有一个问题:你能解释一下用 sqrt 和数字 6 和 4 计算椭圆吗?
  • 我担心你会这么问。我在更新的答案中尽力而为,但对于math.stackexchange.com,推导可能是一个更好的问题
  • 抱歉再次打扰您。例如,如果我有 |x|u <- runif(500, max = 20) v <- runif(500, max = 20) x <- u + v - 20 y <- v - u?
  • x &lt;- runif(500, -20, 20); y &lt;- runif(500, -20, 20)df &lt;- setNames(as.data.frame(matrix(runif(1000, -20, 20), ncol = 2)), c("x", "y"))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
  • 1970-01-01
  • 2020-04-14
  • 1970-01-01
  • 2014-09-22
  • 2018-07-03
  • 2012-03-19
相关资源
最近更新 更多