迭代法

(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) 不动点迭代法

 

posted @ 2017-07-28 19:00  renjian1995  阅读(446)  评论(1)    收藏  举报