您的位置:首页 > 其它

二分法与牛顿拉夫逊法基本思想

2014-07-06 11:45 169 查看
编程中二分法基本思想就是在每次将解的可能范围减半,如猜价格游戏就可以很好体现这点。一个物品价格在0到10000间,猜中点然后根据反馈是高了还是低了将猜测范围减半,这样下来,必然能不断趋近于正确结果。

牛顿-拉夫逊法为数学上求近似解的方法,也称牛顿法,切线法,是给一个初始值,这个初始值对应函数的切线与x轴交点为下一个跟接近解的值,依次继续,直到误差小到要求的程度


下面给出本人写的求非负实数的平方根的java代码,由于本人水平有限,可能有bug,请各位指正:

<pre name="code" class="java">package mutithreadDownload;

import java.util.Scanner;

public class Squartroot {

public static void main(String[] args) {

float result;
float number = 0;
Scanner scanner=new Scanner(System.in);
while(true){
System.out.println("input a number:");
number=scanner.nextFloat();
result=squaretroot(number);
System.out.println("nr "+result);
result=sqrtoot(number);
System.out.println("bi "+result);
}

}

private static float sqrtoot(float number) {//用牛顿——拉夫逊方法逼近求解
float start=0,end=Math.max(1, number),result=(start+end)/2;
int count=1;
if(number<0){
System.out.println("error");
return -1;
}
while(Math.abs(result*result-number)>1e-4){//1e-6为误差
count++;//迭代次数
//关键步骤,可以用解析几何方法直观看出来
result=result-((result*result-number)/(2*result));
}
System.out.println("nr times:"+count);

return result;
}

private static float squaretroot(float number) {//用二分法逼近求解
float start=0,end=Math.max(1, number),result = (start+end)/2;
int count=1;
if(number<0){
System.out.println("error");
return -1;
}
while(Math.abs(result*result-number)>1e-4){
count++;
if(result*result-number>0)//结果大了,就以前半段为新的范围
end=result;
else//结果小了,以后半段为新的范围
start=result;
result=(start+end)/2;
}
System.out.println("bi times:"+count);

return result;
}

}



测试的几个结果:



可以看出,一般情况下,牛顿法迭代次数更少,效率更高。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法