我正在尝试编写用于二分法的程序,并尝试在每次迭代时绘制点。
这是我尝试过的代码。
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)
如何实现这一目标?
任何提示都可能有所帮助。我不知道我哪里错了。
答案 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")
}