《算法基础》——2.6 查找零

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的三个根。圆圈表示搜索到的作为程序猜测的每一个根。

时间: 2024-10-03 02:47:50

《算法基础》——2.6 查找零的相关文章

《算法基础》——导读

**前言**算法是使高效的程序成为可能的方法.它们解释了如何排列记录.搜索项.计算数值(比如质因子分解).查找一个街道网络中的最短路径.确定可能通过通信网络的最大流.算法好坏的差别可能意味着是在一秒.一个小时内解决问题,还是永远也不能解决问题.学习算法使你能建立有用的方法工具来解决具体的问题.它能帮助你理解在不同的情况下,哪个算法是最有效的,所以对于一个特定的问题,你就能选择最适合的算法.对某些数据而言性能优异的算法可能对其他的数据而言表现糟糕.所以知道如何选择一个最适合当前情况的算法是很重要的

《算法基础:打开算法之门》一导读

前言 Algorithms Unlocked 计算机是如何解决问题的呢?小小的GPS是如何只在几秒钟内就从无数条可能路径中找出到达目的地的最快捷路径的呢?在网上购物时,又如何防止他人窃取你的信用卡账号呢?解决这些问题,以及大量其他问题的答案均是算法.我写本书的目的就是为你打开算法之门,解开算法之谜. 我是<算法导论>的合著者之一.<算法导论>是一本特别好的书(当然,这是我个人的主观评价),但是它确实相当专业. 本书并不是<算法导论>,甚至不能被称为一本教材.它既没有对计

一道算法基础题 uva1586

问题描述 一道算法基础题 uva1586 题目链接在这儿 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=830&page=show_problem&problem=4461 我自己做的代码如下 但是通不过 测了好多数据都没问题 #include<cstdio> #include<cstring> using namespace std; in

一步一步写算法(之字符串查找 中篇)

原文:一步一步写算法(之字符串查找 中篇) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com]     昨天我们编写了简单的字符查找函数.虽然比较简单,但是也算能用.然而,经过我们仔细分析研究一下,这么一个简单的函数还是有改进的空间的.在什么地方改进呢?大家可以慢慢往下看.     下面的代码是优化前的代码,现在再贴一次,这样分析起来也方便些: char* strstr(const char* str, char* data) { int i

一步一步写算法(之字符串查找 上篇)

原文:一步一步写算法(之字符串查找 上篇) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com]     字符串运算是我们开发软件的基本功,其中比较常用的功能有字符串长度的求解.字符串的比较.字符串的拷贝.字符串的upper等等.另外一个经常使用但是却被我们忽视的功能就是字符串的查找.word里面有字符串查找.notepad里面有字符串查找.winxp里面也有系统自带的字符串的查找,所以编写属于自己的字符串查找一方面可以提高自己的自信心,另外一

java 算法基础之二快速排序算法

http://www.cnblogs.com/hexiaochun/archive/2012/09/03/2668324.html java 算法基础之二快速排序算法 所谓的快速排序的思想就是,首先把数组的第一个数拿出来做为一个key,在前后分别设置一个i,j做为标识,然后拿这个key对这个数组从后面往前遍历,及j--,直到找到第一个小于这个key的那个数,然后交换这两个值,交换完成后,我们拿着这个key要从i往后遍历了,及i++;一直循环到i=j结束,当这里结束后,我们会发现大于这个key的值

《算法技术手册》一第3章 算法基础

第3章 算法基础 虽说开发软件是为了解决问题,但程序员们往往太执着于是否能够解决问题本身,而不去确认这一问题是否已有解决之法.即便程序员们知道前人已在类似情况下解决了问题,但"已有的解决之法"最终是否适用于特写的问题仍是一个未知数.更重要的是,要找到完全不需要修改或者只需要稍作修改便能解决手头问题的代码并不容易.不同的人对待算法的态度各有千秋.很多人就只是简单地在一本书中或者网站上找个算法,复制代码,运行一次,然后可能还会测试一次,如果结果正确,就开始做下一个任务.但是,在我们看来,这

一步一步写算法(之字符串查找 下篇)

原文:一步一步写算法(之字符串查找 下篇) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com]     前面我们谈到了KMP算法,但是讲的还不是很详细.今天我们可以把这个问题讲的稍微详细一点.假设在字符串A中寻找字符串B,其中字符串B的长度为n,字符串A的长度远大于n,在此我们先忽略.     假设现在开始在字符串A中查找,并且假设双方在第p个字符的时候发现查找出错了,也就是下面的情况: /* * A: A1 A2 A3 A4 ... Ap

《算法基础》——第1章 算法基础知识 1.1 方法

第1章 算法基础知识 在开始算法学习之前,你需要一点背景知识.简单地说,首先需要知道的是算法是完成某些事情的方法.它定义了用某个方法执行一个任务的步骤.这个定义看起来足够简单,但是没有人为了做一件十分简单的工作而写算法.没有人写指令来获取数组中的第四个元素.这只是假设这是一个数组定义的一部分,并且你知道怎么去做(如果你知道如何在这个问题中使用编程语言).一般来说,人们只是为了完成复杂的任务而写算法.算法解释了如何找到一个复杂代数问题的答案,如何在一个包含数千条街道的网络中找到最短路径,抑或是如何