(1)二分法
设f(x)是区间[a,b]上的连续函数,f(a)*f(b)<0,
可知,在[a,b]上必有f(x)一根
令p1=(a+b)/2,
若f(p1)*f(a)<0,则[a,p1]必有一根,令b1=p1,a1=a,p2=(a1+b1)/2;
若f(p1)*f(a)>0,则[p1,b]必有一根,令a1=p1,b1=b,p2=(a1+b1)/2;
重复上述过程n次,可以发现pn必然越来越接近于真值p
可以发现 先验误差 |pn-p|≤1/2n(b-a)
若要求预先给定绝对误差ε,则1/2n(b-a)≤ε => 2n>(b-a)/ε
可以得出终止迭代次数n为(log(b-a)/ε ) /log2
R代码实现:
//二分迭代法
dichotomy<-function(f,a,b,m=100){
//f为目标函数,a和b为初始区间,m为迭代次数
if(f(a)*f(b)>0)
stop("f(a) and f(b) must have different signs.")
left<-min(a,b)
right<-max(a,b)
p<-(left+right)/2
n<-1
while(left<p&&p<right&&n<m){
n=n+1
if(sign(left)!=sign(right)&&left!=0&&right!=0){
p=0
if(f(p)==0){
left<-right<-p
break
}
}
if(sign(f(left))!=sign(f(p))){
right<-p
}else{
left=p
}
p=(left+right)/2
}
return(list(root=p,f.root=f(p),iter=n,prec=abs(right-left)/2))
}
(2) 不动点迭代法