2008年07月16日

三角関数などの根を小さい方から順に求める[R]

当たり前の話だけど,三角関数なんかは何度も何度もy=0を通る.つまり,y=0に対応するxの値というのは無限に存在する.これを小さいほうから順に求めていく方法がほしかった.

が,結局良く分からなかったのでかなーり無理やりなやり方でどうにかすることとした.

f <- function(x) sin(x)
f_root <- numeric(10)
j <- 0
for(i in 1:10){
	while(F==is.vector(try(uniroot(f, c(j,j+1))$root,T))){
		j <- j+0.1
		if(is.vector(try(uniroot(f, c(j,j+1))$root,T))){
			f_root[i] <- try(uniroot(f, c(j,j+1))$root,T)
			}
		}
	j <- f_root[i]+0.1
	}
f_root
f <- function(x) sin(x)
f_root <- numeric(10)
j <- 0
for(i in 1:10){
	a <- 0.1
	while(F==is.vector(try(uniroot(f, c(j,j+a),tol=1e-10)$root,T))){
		a <- a+0.1
		}
	f_root[i] <- uniroot(f, c(j,j+a),tol=1e-10)$root
	j <- f_root[i]+0.001
	}
f_root

(2008/7/17 修正,前回のは全然正しくなかった.if文をwhile文の中に入れる必要性がさっぱりわからない.寝ぼけてたとしか.)

最初に目的の関数をfとして作成する(この場合sin).

次に求めたい根の個数だけの長さの入れ物を作る(続くfor文での繰り返し回数とそろえる).

そして関数の最初の点を決定する.

実行.f_rootの中に根が収納される.

いいのかこんなんで?

エラーを無視させて無理やり処理を継続させたり,繰り返しの中で繰り返しを使ったりとかなり汚い感じ.きっと変な関数入れたら止まらなくなるんじゃないだろうか.正の方向へ十分な個数の根を持たない関数入れたら止まらないのは明らかだしなー.

まあ自分が使う範囲なら問題なく動くのでいいか.使用注意.

posted by Rion778 at 21:06 | Comment(0) | TrackBack(0) | PC関連。HTMLとか,Linuxとか,Rとか | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス: [必須入力]

ホームページアドレス: [必須入力]

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL(言及がない、関連がないと判断した場合削除することがあります)
http://blog.seesaa.jp/tb/103012481
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。