关于二分法求方程的近似解--正确的写法

while(r-l>=0.001){
    m=(r+l)/2;
    if(fn(l)*fn(m)>0)l=m;
    else r=m;
}
printf("%.2lf ",l);

//方程求根,给定单调区间[l,r]
/*
1.l为根,m和r在l的右侧,fn(l)=0,fn(l)*fn(m)=0,else条件成立r=m,r向根l逼近
再次循环,l值未改变依旧为根,m和r依旧在l的右侧,fn(l)=0,fn(l)*fn(m)=0,else条件r=m,r向根l逼近
因此l为根可得出正确的近似解

2.r为根,l和m在r的左侧,fn(r)=0,fn(l)*fn(m)>0,if条件成立l=m,l向根r逼近
再次循环,r值未改变依旧为根,l和m依旧在r的左侧,fn(r)=0,fn(l)*fn(m)>0,if条件成立l=m,l向根r逼近
因此r为根可得出正确的近似解

3.假设二分到方程根,即某次循环中fn(m)=0,else条件成立r=m,r为方程的根,
再次计算m的值,l和m一定在根r的左侧, fn(r)=0,fn(l)*fn(m)>0,if条件成立l=m,l向根r逼近
注:如果if语句条件改为 fn(l)*fn(m)>=0 , 
假设二分到方程根,即某次循环中fn(m)=0,if条件成立l=m,l为方程的根,
再次计算m的值,m和r在根l的右侧,fn(l)=0,if条件成立l=m,此时[l,r]之间不存在根,
所以这种写法是错误的

4.l和r会精确到x.xxx?的形式,所以第3位小数一定是准确的,进而由它四舍五入到第二位小数 
*/ 

 

posted on 2020-04-01 23:34  ~明月几时有  阅读(841)  评论(0)    收藏  举报