3

任务

使用 R 绘制双曲线 x 2 - y 2 /3 = 1,如图 4.3 所示:

在此处输入图像描述

我的尝试

x <- seq(-5, 5, by = 0.01)
x <- x[(3*(x^2 - 1)) >= 0]

y.upper <- sqrt(3*(x^2 - 1))
y.lower <- -sqrt(3*(x^2 - 1))
y.max <- max(y.upper)
y.min <- min(y.lower)
d1 <- sqrt(3)*x
d2 <- -sqrt(3)*x

plot(c(-5, 5), c(y.min, y.max), type = "n", xlab = "x", ylab = "y")
lines(x, y.upper)
lines(x, y.lower)
lines(x,d1)
lines(x,d2)
points(2, 0)
points(-2,0)
text(2, 0, "focus (2, 0)", pos=4)
text(5, y.max, "asymptote y = sqrt(3)*x", pos = 2)
title("The hyperbola x^2 - y^2/3 = 1")

在此处输入图像描述

如您所见,我的图表有一个额外的线段,显示在 y = 0 处,表示不应有任何结果的 x 值。我对我做了什么导致了这样的图表有点困惑。

4

2 回答 2

2

使用lines通过连接点来创建连续的线。这两个函数用于上部和下部,因此它们都连接点 (-1, 0) 和 (1, 0)。

可能还有其他方法可以实现这一点,但下面的更改显示了正在发生的事情:

plot(c(-5, 5), c(y.min, y.max), type = "n", xlab = "x", ylab = "y")
lines(x[x < 0], y.upper[x < 0])
lines(x[x > 0], y.upper[x > 0])
lines(x[x < 0], y.lower[x < 0])
lines(x[x > 0], y.lower[x > 0])
lines(x, d1)
lines(x, d2)
points(2, 0)
points(-2,0)
text(2, 0, "focus (2, 0)", pos=4)
text(5, y.max, "asymptote y = sqrt(3)*x", pos = 2)
title("The hyperbola x^2 - y^2/3 = 1")
于 2020-07-06T21:38:55.750 回答
2

您需要将形状分为四个部分,以避免连接曲线的左右部分,这就是导致白线的原因。

此外,您可以使用表达式在注释中获得更好的数学符号:

x_left <- seq(-5, -1, by = 0.01)
x_right <- seq(1, 5, 0.01)

y.upper_left <- sqrt(3*(x_left^2 - 1))
y.upper_right <- sqrt(3*(x_right^2 - 1))
y.lower_left <- -sqrt(3*(x_left^2 - 1))
y.lower_right <- -sqrt(3*(x_right^2 - 1))
y.max <- max(y.upper_left)
y.min <- min(y.lower_left)

plot(c(-5, 5), c(y.min, y.max), type = "n", xlab = "x", ylab = "y")
lines(x_left, y.upper_left)
lines(x_right, y.upper_right)
lines(x_left, y.lower_left)
lines(x_right, y.lower_right)
abline(0, sqrt(3))
abline(0, -sqrt(3))
points(2, 0)
points(-2,0)
text(2, 0, "focus (2, 0)", pos=4)
text(5, y.max, expression(paste("asymptote y =") ~ sqrt(3)*x), pos = 2)
title(expression(paste("The hyperbola ") ~ x^2 - y^{2/3} ~ paste(" = 1") ))

在此处输入图像描述

但是,获得情节的聪明/懒惰的方法可能只是保持代码不变,并用一条白线覆盖有问题的部分。在绘制曲线之后但在绘制渐近线之前执行此操作:

x <- seq(-5, 5, by = 0.01)
x <- x[(3*(x^2 - 1)) >= 0]

y.upper <- sqrt(3*(x^2 - 1))
y.lower <- -sqrt(3*(x^2 - 1))
y.max <- max(y.upper)
y.min <- min(y.lower)
d1 <- sqrt(3)*x
d2 <- -sqrt(3)*x

plot(c(-5, 5), c(y.min, y.max), type = "n", xlab = "x", ylab = "y")
lines(x, y.upper)
lines(x, y.lower)
lines(c(-.99, .99), c(0, 0), col = "white")  ## lazy hack
lines(x,d1)
lines(x,d2)
points(2, 0)
points(-2,0)
text(2, 0, "focus (2, 0)", pos=4)
text(5, y.max, "asymptote y = sqrt(3)*x", pos = 2)
title("The hyperbola x^2 - y^2/3 = 1")

在此处输入图像描述

于 2020-07-06T21:43:05.643 回答