使用牛顿迭代方法(Newton’s method)来估计方程的解

来源:互联网 发布:农村淘宝经营计划书 编辑:程序博客网 时间:2024/05/27 00:33

假定现在我们想要估计f(x)=0的解,你可能从网上找到了某些所谓穷举得方法:从x=-100到x=1000,按给定一个递增因子一个一个数的代入f(x)中,所有满足f(x)=0的都是f(x)的解。想想就觉得这种机械的方法不靠谱,效率太低了。本文要介绍的牛顿方法的一种常见用法就是用来求解方程的解。方法很简单,首先我们来根据下图来对牛顿方法的推导最简单的介绍:

                                                                                              

1假定一个初始的估计解x0,这个“解”可能不好,我们需要寻找更好的解;

2.在f(x)上做x=x0的切线,切线的方程为:

                                                    

3.求第2步得到的切线与x轴相交的点的x值,假如x=x1,因为此时y=0,所以:

                                                      

4.从图中我们可以看到,相对于x0,x1更加接近于真实的解。

5,继续对x1点做2,3步骤,也就是:

                                                                         

显然,x2又更一步接近了真实解。如果继续我们按照上面过程进行下去,相应得到的估计解会越来越接近真实解。这就是牛顿方法。

下面直接粘贴参考文献1中提供的Newton‘s method 定义供参考大笑


那么怎么判断迭代可以结束,也就是估计解已经等于或最大接近于真实解了呢?因为在真实解处的切线,y本身已经等于0,那么下一个切线与x轴相交的点就是该点,所以判断的依据显然可以是:两次估计解非常接近(相同)。

牛顿方法虽然简单,但是也可能存在失败的情况,读者可以参考参考文献1.

除此之外,牛顿方法只能找到方程的一个解。比如对于f(x)=x^2-3x+2.该函数对应的方程的解有两个x=1,x=2;下面是一个非常简单的牛顿方法的代码:

public class Newton_Method {     public static void main(String[] args){  //test:f(x)=x^2+3x+2;f'=2x+3  double x=0;  while(true)  {  double temp=x;  x=x-(x*x-3*x+2)/(2*x+3);  if(Math.abs(temp-x)<0.000000001){  break;  }  }  System.out.println(x);  }}
尝试改变:double x 的值,基本上估计解接近于2.除非直接:double x=1,得到的是1.既使能够通过改变x来找到这个方程的两个解,但是对于其他不知道有多少个解的方程,可能就没办法找全全部的解,有没有什么方法能一次找出全部的解呢?

。。。 。。。我暂时也不知道。。想想。希望有人能够提供方法。


参考文献:

1.Paul's Online Math Notes。http://tutorial.math.lamar.edu/Classes/CalcI/NewtonsMethod.aspx


原创粉丝点击