求助:如何在R语言中绘制指定形式的双曲线?
我注意到你已经能通过隐函数f <- function(x,y) x^2 - 3*y^2 + 2*x*y - 20成功绘制双曲线,但在搞定图中这条特定双曲线时遇到了问题。下面我会结合双曲线的类型,给出两种靠谱的R实现方法,你可以根据需求选择:
方法一:参数化绘制(精准度更高,推荐)
从你提供的图来看,这条双曲线是开口沿x轴方向的类型,用参数方程绘制会比隐函数更稳定,还能避开渐近线附近的绘制bug。
这类双曲线的标准参数方程是:
$x = h + a\sec\theta$
$y = k + b\tan\theta$
其中$\theta$要避开$\pm\pi/2$、$\pm3\pi/2$这些渐近线对应的角度,$(h,k)$是双曲线的中心,$a$、$b$分别是实半轴和虚半轴长度。
假设图中的双曲线是中心在原点、$a=3$、$b=2$的标准双曲线(对应方程$\frac{x^2}{9} - \frac{y^2}{4} = 1$),对应的R代码如下:
# 定义参数范围,避开渐近线对应的角度 theta <- c(seq(-pi/2 + 0.01, pi/2 - 0.01, length.out = 100), seq(pi/2 + 0.01, 3*pi/2 - 0.01, length.out = 100)) a <- 3 # 实半轴长度 b <- 2 # 虚半轴长度 h <- 0 # 中心x坐标 k <- 0 # 中心y坐标 # 计算双曲线的x、y坐标 x <- h + a * sec(theta) y <- k + b * tan(theta) # 绘制双曲线 plot(x, y, type = "l", col = "#2E86AB", xlim = c(-10, 10), ylim = c(-10, 10), xlab = "x", ylab = "y", main = "Target Hyperbola") # 添加上渐近线(虚线) abline(a = k - (b/a)*(h), b = b/a, lty = 2, col = "#D83A56") abline(a = k + (b/a)*(h), b = -b/a, lty = 2, col = "#D83A56")
如果你的双曲线是平移过的(比如中心在$(2,1)$),只需要修改h和k的值就行;如果是旋转过的,只需要给参数方程加上旋转矩阵转换即可。
方法二:适配你原有习惯的隐函数绘制
如果你更习惯用隐函数的方式,首先需要把图中双曲线的方程转化为$f(x,y)=0$的形式。还是用刚才的标准双曲线举例,对应的隐函数是(x^2)/9 - (y^2)/4 - 1 = 0,实现代码如下:
# 定义双曲线的隐函数 f <- function(x,y) (x^2)/9 - (y^2)/4 - 1 # 生成覆盖双曲线范围的网格 x_seq <- seq(-10, 10, length.out = 200) y_seq <- seq(-10, 10, length.out = 200) z_matrix <- outer(x_seq, y_seq, f) # 绘制z=0的等高线(也就是双曲线) contour(x_seq, y_seq, z_matrix, levels = 0, col = "#2E86AB", xlab = "x", ylab = "y", main = "Hyperbola via Implicit Function") # 添加渐近线 abline(a = 0, b = 2/3, lty = 2, col = "#D83A56") abline(a = 0, b = -2/3, lty = 2, col = "#D83A56")
如果用隐函数绘制失败,大概率是这两个原因:
- 你的
x_seq/y_seq范围没覆盖到双曲线的分支,需要扩大范围; - 隐函数的方程写错了,要确保是$f(x,y)=0$的形式。
针对非标准双曲线的调整
如果图中的双曲线是旋转过的(比如存在$xy$项),那它的一般形式是$Ax^2 + Bxy + Cy^2 + Dx + Ey + F = 0$(满足$B^2-4AC>0$)。你可以根据图中的关键点(比如顶点、渐近线斜率)算出系数,然后代入上面的隐函数方法,或者先通过旋转消去$xy$项,再用参数化方法绘制。
内容的提问来源于stack exchange,提问作者user7924082

