牛顿迭代法牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程f(x)=0的单根附近具有平方收敛,而且该法还可以用来求方程的重根、复根,此时线性收敛,但是可通过一些方法变成超线性收敛。另外该方法广泛用于计算机编程中。牛顿迭代公式设r是f(x)=0的根,选取𝑥0作为r的初始近似值,过点(𝑥0,f(𝑥0))做曲线y=f(x)的切线L,L的方程为y=f(𝑥0)+𝑓,(𝑥0)(x-𝑥0),求出L与x轴的横坐标𝑥1=𝑥0-f(𝑥0)𝑓,(𝑥0),称为𝑥1为r的一次近似值。过点(𝑥1,f(𝑥1))做曲线y=f(x)的切线,并求该切线与x轴交点的横坐标𝑥2=𝑥1-f(𝑥1)𝑓,(𝑥1),称𝑥2为r的近似值。重复以上过程,得r的近似值序列,其中𝑥𝑛+1=𝑥𝑛-𝑓(𝑥𝑛)𝑓,𝑥𝑛称为r的n+1次近似值。上式则称为牛顿迭代公式。用牛顿迭代法解非线性方程它是把非线性方程f(x)=0线性化的一种近似方法。把f(x)在点𝑥0的某邻域内展开成泰勒级数f(x)=f(𝑥0)+𝑓,(𝑥0)(x-𝑥0)+𝑓,,(𝑥0)(x−𝑥0)22!+...+𝑓(𝑛)(𝑥0)(x−𝑥0)𝑛𝑛!+𝑅𝑛(x)取其线性部分(即泰勒展开的前两项),并令其等于0,即f(𝑥0)+𝑓,(𝑥0)(x-𝑥0)=0,以此作为非线性方程式f(x)≠0,则其解为𝑥1=𝑥0-f(𝑥0)𝑓,(𝑥0),这样,得到牛顿迭代法的一个迭代关系式:𝑥𝑛+1=𝑥𝑛-𝑓(𝑥𝑛)𝑓,𝑥𝑛。已经证明,如果是连续的,并且待求的零点是孤立的,那么在零点周围存在一个区域,只要初始值位于这个区域内,那么牛顿法补丁收敛。并且,如果不为0,那么牛顿法将具有平方收敛的性能。粗略的说,这意味着每迭代一次,牛顿法结果的有效数字将增加一倍。军人在进攻时,常采用交替掩护进攻的方式,若在数轴上的点表示A,B两人的位置,规定在前面的数大于后面的数,则是AB,BA交替出现。但现在假设军中有一个胆小鬼,同时大家又都很照顾他,每次冲锋都是让他跟在后面,每当前面的人占据一个新的位置,就把位置交给他,然后其他人再往前占领新的位置。也就是A始终在B的前面,A向前迈进,B跟上,A把前进占领新的位置交给B(即执行B=A),然后A再前进占领新的位置,B再跟上,知道占领所有的阵地,前进结束。像这种两个数一前一后逐步向某个位置逼近的方法称为迭代法。迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的就是直接法(或称为一次解法),即一次性解决问题。迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出他的一个新值。利用迭代法解决问题,需要做好以下三个方面的工作:一、确定迭代变量在可以用迭代算法解决的问题中,至少存在一个可直接或间接的不断由旧值递推出新值的变量,这个变量就是迭代变量;二、建立迭代关系式所谓的迭代关系式,指如何从变量的前一个值递推出其下一个值得公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。三、对迭代过程进行控制在什么时候结束迭代过程?这时编写迭代程序必须考虑的问题。不能让迭代过程无休止的执行下去。迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析得出可用来结束迭代过程的条件。欧几里德算法(辗转相除法)最经典的迭代算法是欧几里德算法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:定理:gcd(a,b)=gcd(b,amodb)证明:a可以表示成a=kb+r,则r=amodb.假设d是a,b的一个公约数,则有a%d==0,b%d==0,而r=a-kb,因此r%d==0,因此d是(b,amodb)的公约数同理,假设d是(b,amodb)的公约数,则b%d==0,r%d==0,但是a=kb+r,因此d也是(a,b)的公约数;因此(a,b)和(b,amodb)的公约数是一样的,其最大公约数也必然相等,得证。C语言代码doublefunc(doublex)//函数{returnx*x*x*x-3*x*x*x+1.5*x*x-4.0;}doublefunc1(doublex)//导函数{return4*x*x*x-9*x*x+3*x;}intNewton(double*x,doubleprecision,intmaxcyc)//迭代次数{doublex1,x0;intk;x0=*x;for(k=0;kmaxcyc;k++){if(func1(x0)==0.0)//若通过初值,函数返回值为0{printf(“迭代过程中导数为0!\n”);return0;}x1=x0-func(x0)/func1(x0);//进行牛顿迭代计算if(fabs(x1-x0)precision||fabs(func(x1)precision)//达到结束条件{*x=x1;//返回结果return1;}else//未达到结束条件x0=x1;//准备下一次迭代}printf(“迭代次数超过预期!\n”);//迭代次数达到,仍没有达到精度return0;}intmain(){doublex,precision;intmaxcyc;printf(“输入初始迭代值x0”);scanf(“%lf”,&x);printf(“迭代要求的精度”);scanf(“%lf”,&precision);if(Newton(&x,precision,maxcyc)==1)//若函数返回值为1printf(“该值附近的根为:%lf\n”,x);else//若函数返回值为0printf(“迭代失败!\n”);getch();return0;}-600-400-2000200400600800-6-4-20246yy