如何为2个变量生成值以绘制圆

时间:2018-03-01 01:58:34

标签: r function graph simulator

我一直在尝试生成随机值,以便构建一个圆圈。 期望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)

但我得到的图表并不是我所预期的。

  1. 该图类似于椭圆的上半部分而不是半圆
  2. 为什么没有y的值,其中y&lt; 0
  3. 请在此处找到情节。enter image description here

    我也有兴趣找出如何为x,y,z,a生成随机值;其中x ^ 2 + y ^ 2 + z ^ 2 + a ^ 2 = 10

2 个答案:

答案 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)

It should generate something close to this

正如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)

对于问题的最后一部分,对于变量的每个值,您必须计算出解决方程的所有可能元组,如果za是也是变量,可能无法仅在二维图上表示它。

答案 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不应产生任何有利影响。)