Rに超越方程式を解く関数はありますか?
たとえば、次の方程式を解きます
x = 1/tan(x)
助言がありますか?ソリューションには複数のルートがあることを知っているので、特定の間隔ですべての回答を回復できるようにしたい
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
1D方程式の根を見つけることができます。ただし、複数のルートを取得することは、一般的に非常に難しい問題のように思われます(たとえば、背景については、数値レシピの関連する章を参照してください: http ://apps.nrbook.com/c/index.htmlの第9章)。複数のルートがある場合にどのルートが見つかるかを予測するのは困難です。スペースをゼロまたは1つのルートを持つサブリージョンに分割する問題について十分に知っている場合、またはスペースを多数のリージョンに分割して、すべてのルートが見つかったことを期待する場合は、それを実行できます。そうでなければ私は他の人々の解決策を楽しみにしています...
この特定のケースでは、@ liuminzhaoのソリューションで示されているように、との間に(せいぜい?正確に?)1つのソリューションが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)
これはちょっとしたハックですが、方程式の根を見つけます(円周率の倍数に近すぎない場合:必要に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