是否存在解决R中超越方程的函数?
例如,我想解决以下等式
x = 1/tan(x)
有什么建议吗?我知道解决方案有多个根,所以我也希望能够恢复给定间隔的所有答案
答案 0 :(得分:7)
我会绘制函数曲线并查看它以查看它的样子:
R > y = function(x) { x - 1/tan(x) }
R > curve(y, xlim = c(-10, 10))
R > abline(h = 0, color = 'red')
然后我看到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)
这有点像黑客,但它会找到你方程的根源(假设它们不是太接近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