2016-12-13 57 views
0

我正在創建一個函數來查找函數的根。這個特定的算法試圖順序地減少已知根位於的窗口的寬度。我希望它採用x的函數,即窗口和epsilon的值。 Epsilon由用戶選擇,越靠近零,根越精確。函數保持運行

這是我的代碼:

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)&epsilon來找出爲什麼它不是 – 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

嘿,非常感謝你的工作! –