最近没事在看一些算法的东西,看了一会,发现自己脑子一片空白,很多以前至少会一些的东西,现在都忘完了,所以写个笔记,记录此时的心得体会,便于日后回顾。
牛顿迭代法,牛顿迭代法的作用就是求函数的近似根。
牛顿迭代法的迭代公式为 Xn+1 = Xn - f(Xn)/f '(Xn)。
下面以Java语言对函数 f(x) = x的3次方+x+1进行迭代求根。
import java.math.*;
public class Newton {
//牛顿迭代法
public static void main(String args[]){
System.out.println(newton());
}
//设原函数为 f(x) = x*x*x+x+1
public static double f(double x){
return x*x*x+x+1;
}
//原函数的导数为 df(x) = 3*x*x+1
public static double df(double x){
return 3*x*x+1;
}
public static double newton(){
double x = 0.0; //设置迭代初始值
double x1 = -1.0; //用来存放上一次的结果
for(int i= 0; i<10&&Math.abs(x1-x)>=0.000000001 ;i++){ //0.000000001为精度,当相邻两次迭代的结果小于这个精度时即停止
x1 = x;
x = x -f(x)/df(x);
System.out.println(i); //打印迭代的次数
}
return x;
}
}
在循环判断条件中加入次数和精度为了避免无限迭代,以上述的精度,程序运行的结果是:
0
1
2
3
4
5
-0.6823278038280194
还可以将精度设置的更小一些,在上述的精度下再加两个0,程序的运行结果为:
0
1
2
3
4
5
6
-0.6823278038280193
当精度小到可以接受时,返回值x即可看做f(x)的根。