2.6 查找零
有时候程序需要找出一个方程在哪里与x轴有交点。 换句话说,给定方程为y=f(x),找到x的值,满足f(x)=0,这个值被称为方程的根。
牛顿法,该方法有时被称为牛顿-拉弗森法,是一种解出连续近似方程的根的方法。该方法起始于最初猜测X0为根。当f(X0)是不够接近0时,该算法生成一条与函数相切于点X0的直线。它采用交点的x坐标作为一种新的猜测X1来求方程的根。
该算法然后从新猜测出的X1开始重复此过程,继续沿着函数的切线方向找到根作为新猜测,直到它找到一个值Xk满足F(Xk)足够接近0。
唯一棘手的部分是搞清楚如何沿着切线进行计算。如果使用微积分找到函数的导数f(x),这也可以写作。
下面的公式显示了一种算法如何通过沿着一条切线更新其对根的猜测:
注不幸的是,如何找到一个函数的导数不在这本书的范围之内。欲了解更多信息,可以在网上搜索或咨询微积分的书。
图2-7显示了该算法图形化的过程。初始猜测的点被标记为1。这点的y值是远不为0的,所以该算法沿切线寻找相交于x轴的新猜测点。算法然后利用新的猜测点计算函数值,以获得在图2-7中标记为2的点。 这点的y坐标也远不为0,所以该算法重复该过程,以寻找下一个猜测,被标记为 3,该算法再一次重复这个过程来找到被标记为4的点,第4点的y坐标足够接近0,所以算法停止。
下面的伪代码显示出该算法:
该算法将函数y=f(x),函数的导数初步推测值以及可接受的最大误差值作为参数。
代码设置变量x等于初始猜测,然后进入For语句循环,最多执行100次。通常情况下,算法很快就找到一个答案。
但在一些情况下,如果函数有正确的曲率,该算法会发散,并且不局限于一个答案,它可以来回跳跃于两种不同的猜测之间。最多100次的循环意味着该程序永远不能停止。
在For循环中,该算法计算f(x)。如果结果不足够接近0时,算法将更新x的值并且重新尝试。
请注意,某些函数有一个以上的根。在这种情况下,需要重复使用FindZero算法用不同的初始猜测找到每一个根。
如图2-8所示的牛顿法示例程序,可以在这本书的网站上找到。这个程序使用了三次牛顿法则来找到函数y=x3/5-x2+x的三个根。圆圈表示搜索到的作为程序猜测的每一个根。