2016-12-13 7 views
0

関数のルーツを見つける関数を作成しています。この特定のアルゴリズムは、ルートが存在することが分かっているウィンドウの幅を順次縮小しようとします。私はそれがxの関数、窓の値とイプシロンを取ることを望みます。イプシロンはユーザによって選択され、根がより正確であるほどゼロに近づく。私が使用してそれをテストしようとしています関数の実行を続ける

root.finder <- function(f, x_0, x_1, epsilon) { 
    if (f(x_0)*f(x_1)>=0) 
     warning("check values x_0 and x_1") 
    while(abs(x_1 - x_0) >= epsilon) 
     x_2 <- (x_0 + x_1)/2 
    if (f(x_2)*f(x_0) < 0) { 
     x_1 <- x_2 
    } else { 
     x_0 <- x_2 
    } 
    print(x_2) 
} 

は、ここでは、私のコードです

root.finder(x^3-3*x+1, 0, 1, 1) 

それが実行され、実行を停止しません。 この機能で何が問題になっていますか?

+0

それが終了する必要がありますwhileループのように見えます。あなたはabs(x_1 - x_0)とεを出力して、その理由を調べることができます – superblygeneralobject

+0

if文をwhileループの本体に含める必要があります。現時点では、whileループの本体はx2への代入に過ぎません。 – msandiford

答えて

0

毎のコメントは、私はあなたがそうのように、whileループ本体内ifステートメントを含める必要があると思う:

root.finder <- function(f, x_0, x_1, epsilon) { 
    if (f(x_0)*f(x_1)>=0) 
     warning("check values x_0 and x_1") 
    while(abs(x_1 - x_0) >= epsilon) { 
     x_2 <- (x_0 + x_1)/2 
     if (f(x_2)*f(x_0) < 0) { 
      x_1 <- x_2 
     } else { 
      x_0 <- x_2 
     } 
    } 
    print(x_2) 
} 
+0

これは本当にありがとうございました! –

関連する問題