如何从R中的for循环返回一个图?

时间:2018-05-04 04:23:24

标签: r plot return

我正在尝试编写用于二分法的程序,并尝试在每次迭代时绘制点。

这是我尝试过的代码。

Bisec = function(f,a =1, b =2, max=1e10, tol = 1e-100){
  midVals = c()
  for (i in 1:max){
    c = (a+b)/2
    midVals = append(midVals,c)
    if(abs(f(c)) < tol){
      return(list(c,plot(f),points(midVals)))
    }else if(f(a)*f(c) > 0){
    a = c  
    }else{
      b =c 
    }
      }
  print("Maximum iterations reached")
}
x = var('x')
f = function(x){x*x-2}
Bisec(f,1, 3, max=1e5, tol = 1e-10)

但我得到的图像是这样的。 enter image description here

我需要什么?

  • 必须绘制函数f。
  • 每次迭代中发现的中点应该在x轴上绘制。

如何实现这一目标?

任何提示都可能有所帮助。我不知道我哪里错了。

1 个答案:

答案 0 :(得分:1)

如果你学会用不同的语言编程,R符号会有所不同。 R的强大功能之一是它在解释界面和(快速)编译函数之间的集成。通常(虽然这可能是一个例外,我不关注它),避免了for循环(许多函数被向量化,这意味着它们在代码的编译部分中进行循环)。我们还避免定义空变量,因为每次要向它们添加内容时都必须复制和粘贴它们。

针对您的具体问题,plot 正在绘制f - 它对points命令一无所知,因为它评估plot 1}}才能看到points。您可能会发现ggplot2提供了一个更动态的解决方案,但我将从您的函数的基本R方法开始:

Bisec = function(f,a =1, b =2, max_iter=1e10, tol = 1e-100){
  midVals = rep(NA, max_iter) # I avoid using `max` since that's a function to find the maximum

  for (i in 1:max_iter){
    x <- mean(c(a,b)) # I also avoid using `c` since that's a function to concatenate stuff
    midVals[i] <- x

    if(abs(f(x)) < tol){
      plot(f, xlim = range(midVals, na.rm = TRUE))
      points(midVals, rep(0,length(midVals))
      return(x)
    } else if(f(a)*f(x) > 0){
    a = x  
    }
    else{
      b = x 
    }
  }
  print("Maximum iterations reached")
}