迭代法在程序设计中也是一种常见的递推方法,即:给定一个原始值,按照某个规则计算一个新的值,
然后将这个计算出的新值作为新的变量值带入规则中进行下一步计算,在满足某种条件后返回最后的
计算结果;牛顿迭代法是用于多项式方程求解根的方法,在只有笔和纸的年代,这个方法给了人们一个
无限逼近多项式方程真实解的重要思路,牛顿也太牛了.....
求解f(x)=0的解,用牛顿迭代法步骤如下:
1、在y=f(x)这个函数上任取一点(x0,f(x0)),在这个点上做曲线y=f(x)的切线L,可以计算出
切线L的表达式为y=f(x0)+f~(x0)(x-x0),这里f~(x0)表示L在点(x0,f(x0))处的斜率
2、得出了切线L的表达式,我们就可以计算出L与X轴相交点的值x1=x0-f(x0)/f~(x0),此时
x1要比x0更接近f(x)曲线与x轴相交点的真实值
3、将刚才得出的x1带入到f(x)函数中,得到点(x1,f(x1)),再在点(x1,f(x1))出做曲线f(x)的
切线,同样会得到新的切线的表达式:y=f(x1)+f~(x1)(x-x1),将得出的切线与X周相交,同样
会得到相交点的值x2=x1-f(x1)/f~(x1)
4、重复以上计算,会得出一个计算规则:,这个是真实值的n+1次近似值。
可以如下图近似表示。
根据以上描述,设计一个求解X~2-C=0的正根的方程,X~2表示X的平方,先得出迭代公式:;
设计代码如下:
public static void main(String[] args){
System.out.println(calculate(2.0,2.0,0,1e-15));
System.out.println(calculate(2.0,1e-15));
}
public static double calculate(double c,double x,double y,double precision){
y=(x+c/x)/2;
if(Math.abs(x-y)>precision){
x=y;
y=(x+c/x)/2;
return calculate(c,x,y,precision);
}
return x;
}
public static double calculate(double c,double precision){
double x=c,y=(x+c/x)/2;
while(Math.abs(x-y)>precision){
x=y;
y=(x+c/x)/2;
}
return x;
}
从以上代码可以看出,迭代用法是首先给定一个初始值,然后按照某种规则进行计算,将得出的计算结果重新带入规则进行再次计算,
直到满足某个条件退出程序。