2

R中是否有求解超越方程的函数?

例如,我想解决以下方程

x = 1/tan(x)

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

4

2 回答 2

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
于 2013-01-28T00:38:30.117 回答
5

您可以使用它uniroot来查找给定范围内任何一维方程的根。然而,获得多个根一般来说似乎是一个非常困难的问题(例如,请参阅数字食谱的相关章节了解一些背景: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
于 2013-01-28T00:35:15.087 回答