在R中求解超越方程

时间:2013-01-28 00:27:09

标签: r

是否存在解决R中超越方程的函数?

例如,我想解决以下等式

x = 1/tan(x)

有什么建议吗?我知道解决方案有多个根,所以我也希望能够恢复给定间隔的所有答案

2 个答案:

答案 0 :(得分:7)

我会绘制函数曲线并查看它以查看它的样子:

R > y = function(x) { x - 1/tan(x) }
R > curve(y, xlim = c(-10, 10))
R > abline(h = 0, color = 'red')

enter image description here

然后我看到0到3之间有一个根,我会用uniroot来获取我想要的根:

R > uniroot(y, interval = c(0, 3))
$root
[1] 0.8603

$f.root
[1] 6.612e-06

$iter
[1] 7

$estim.prec
[1] 6.104e-05

答案 1 :(得分:5)

您可以使用uniroot在给定范围内找到任何 1D方程的根。然而,获得多个根似乎是一个非常难的问题(例如,参见 Numerical Recipes 的相关章节的某些背景:http://apps.nrbook.com/c/index.html的第9章)。当存在多个根时找到哪个根很难预测。 如果你已经足够了解问题,将空间细分为零或一个根的子区域,或者如果你愿意将它划分为许多区域并希望你找到所有的根,那么你可以做到这一点。否则我期待其他人的解决方案......

在这个特殊情况下,正如@ liuminzhao的解决方案所示,n*pi(n+1)*pi

之间存在(最多?完全?)一个解决方案
y = function(x) x-1/tan(x)
curve(y,xlim=c(-10,10),n=501,ylim=c(-5,5))
abline(v=(-3:3)*pi,col="gray")
abline(h=0,col=2)

enter image description here

这有点像黑客,但它会找到你方程的根源(假设它们不是太接近pi的倍数:如果你愿意,你可以减少eps ...)。但是,如果你想解决一个不同的多根超越方程,你可能需要另一个(专门的)策略......

f <- function(n,eps=1e-6) uniroot(y,c(n*pi+eps,(n+1)*pi-eps))$root
sapply(0:3,f)
## [1] 0.8603337 3.4256204 6.4372755 9.5293334