迭代法也称展转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。迭代法又分为精确迭代和近似迭代。“二分法”和“牛顿迭代法”属于近似迭代法。迭代算法是用计算机解决问题的一种基本方法。算法
利用迭代算法解决问题,须要如下三个步骤:ide
1.肯定迭代变量 在能够用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。 2.创建迭代关系式 所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。迭代关系式的创建是解决迭代问题的关键,一般能够顺推或倒推的方法来完成。 3.对迭代过程进行控制 在何时结束迭代过程?这是编写迭代程序必须考虑的问题。不能让迭代过程无休止地重复执行下去。迭代过程的控制一般可分为两种状况:一种是所需的迭代 次数是个肯定的值,能够计算出来;另外一种是所需的迭代次数没法肯定。对于前一种状况,能够构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情 况,须要进一步分析出用来结束迭代过程的条件。
头文件:code
/***************************************************************************************************** *Copyright:Yue Workstation * *FileName:Iterate.h * *Function:迭代算法数据定义 * *Author:Abel Lee * *CreateOn:2012-2-19 * *Log:2012-2-19 由Abel Lee建立 *****************************************************************************************************/ #ifndef ITERATE_H #define ITERATE_H #include "global.h" #define Epsilon 1.0E-6 int GetTheEquationRoot(void); float MySqrt(float x); #endif
源文件:it
/***************************************************************************************************** *Copyright:Yue Workstation * *FileName:Iterate.c * *Function: 迭代法的应用实例 * *Author:Abel Lee * *CreateOn:2012-2-19 * *Log:2011-5-3 由Abel Lee建立 *****************************************************************************************************/ #include "../inc/Iterate.h" #include <math.h> /**************************************************************************************************** *Function Name: GetTheEquationRoot * *Function: 用牛顿迭代法求方程2*x*x*x-4*x*x+3*x-6 = 0的根 * *Parameter: 无 * *Return Value:成功返回0,失败返回-1 * *Author:Abel Lee * *Log:2012-2-19 ***************************************************************************************************/ int GetTheEquationRoot(void) { float x1,x0=1.5; x1=x0-(2*x0*x0*x0-4*x0*x0+3*x0-6)/(6*x0*x0-8*x0+3); while(fabs(x1-x0>=Epsilon)) { x0=x1; x1=x0-(2*x0*x0*x0-4*x0*x0+3*x0-6)/(6*x0*x0-8*x0+3); } printf("The Root is:%f\n",x1); return 0; } /**************************************************************************************************** *Function Name: MySqrt * *Function: 迭代法求一个数的平方根 * *Parameter: x:要求平方根的数 * *Return Value:成功返回根植,失败返回-1 * *Author:Abel Lee * *Log:2012-2-19 ***************************************************************************************************/ float MySqrt(float x) { float a,x0,x1; if(x < 0) { return -1; } a = x; x0=a/2; x1=(x0+a/x0)/2; while(fabs(x1-x0)>=Epsilon) { x0 = x1; x1=(x0+a/x0)/2; } return x1; }