簡體   English   中英

在R中求解超越方程

[英]Solving transcendental equations in R

是否有解決R中超越方程的函數?

例如,我想解決以下等式

x = 1/tan(x)

有什么建議么? 我知道解決方案有多個根,所以我也希望能夠恢復給定間隔的所有答案

我會繪制函數曲線並查看它以查看它的樣子:

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

您可以使用uniroot查找給定范圍內 uniroot方程的根。 然而,獲得多個根似乎是一個非常難的問題(例如,請參閱數字食譜的相關章節以獲取一些背景:第9章http://apps.nrbook.com/c/index.html )。 當存在多個根時找到哪個根很難預測。 如果您對問題有足夠的了解,可以將空間細分為零或一個根的子區域,或者如果您願意將其划分為多個區域並希望找到所有根,那么您就可以做到。 否則我期待其他人的解決方案......

在這種特殊情況下,如@ 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM