我一直在尝试生成随机值,以便构建一个圆圈。 期望x和y的值满足以下等式
x ^ 2 + y ^ 2 = 1
这是我使用的代码。
par(type = "s")
x <- runif(1000, min = -1, max = 1)
y <- sqrt(1 - x^2)
z <- NULL
z$x <- x
z$y <- y
z <- as.data.frame(z)
plot.new()
plot(z$x, z$y, type = "p")
plot.window(xlim = c(-10,10), ylim = c(-10,10), asp = 1)
但我得到的图表并不是我所预期的。
答案 0 :(得分:3)
问题出在您的代码的这一部分:
x <- runif(1000, min = -1, max = 1)
y <- sqrt(1 - x^2)enter code here
这个问题源于将两个不同的数学实体解释为相同(函数和方程是两个不同的事物)。函数f接受输入x,并返回单个输出f(x)。方程式不具有此限制,因此如果您将此等式编码为函数,将丢失圆圈中的一半点,您将生成上半圆中的所有点。 / p>
由于圆形方程对于任何x值都有两个 y输出,因此您可以为均匀分布生成的每个点生成两对坐标,如下所示:
x1 = runif(1000, min = -1, max = 1)
x2 = x1
y1 = sqrt(1 - x1^2)
y2 = (-1)*y1
x = c(x1,x2)
y = c(y1,y2)
plot(x,y, asp=1)
正如John Coleman在评论中所建议的,我更喜欢使用参数/极坐标。生成0到2pi之间的弧度角度,然后使用生成的角度和所需的半径计算适当的x和y位置。
radius = 1
theta = runif(1000, min = 0, max = 2*pi)
x = radius * cos(theta)
y = radius * sin(theta)
plot(x,y, asp=1)
对于问题的最后一部分,对于变量的每个值,您必须计算出解决方程的所有可能元组,如果z
和a
是也是变量,可能无法仅在二维图上表示它。
答案 1 :(得分:2)
也许你错过了@ thelatemail的评论:
png()
plot(z$x, z$y, type = "p", asp=1)
dev.off()
将asp = 1传递给plot.window的原因会失败(如果它首先被调用,这是你可能尝试过的),plot
本身再次调用plot.window
,并且进程重新获取默认值。你可以在plot.default的代码中看到:
> plot.default
function (x, y = NULL, type = "p", xlim = NULL, ylim = NULL,
log = "", main = NULL, sub = NULL, xlab = NULL, ylab = NULL,
ann = par("ann"), axes = TRUE, frame.plot = axes, panel.first = NULL,
panel.last = NULL, asp = NA, ...)
{
localAxis <- function(..., col, bg, pch, cex, lty, lwd) Axis(...)
localBox <- function(..., col, bg, pch, cex, lty, lwd) box(...)
localWindow <- function(..., col, bg, pch, cex, lty, lwd) plot.window(...)
#.... omitted the rest of the R code.
(预计plot.window
之后呼叫plot
不应产生任何有利影响。)