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

假定现在我们想要估计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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值