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

を使用して、特定の範囲内の任意のuniroot1D方程式の根を見つけることができます。ただし、複数のルートを取得することは、一般的に非常に難しい問題のように思われます(たとえば、背景については、数値レシピの関連する章を参照してください: 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
于 2013-01-28T00:35:15.087 に答える