牛顿迭代法求方程的根

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

利用迭代算法解决问题,需要做好以下三个方面的工作:

一、确定迭代变量。在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。

二、建立迭代关系式。所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。

三、对迭代过程进行控制。在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。不能让迭代过程无休止地重复执行下去。迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件。

最经典的迭代算法是欧几里德算法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:

牛顿迭代法是牛顿在17世纪提出的一种求解方程f(x)=0.多数方程不存在求根公式,从而求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。

设r是f(x)=0的根,选取x0作为r初始近似值,过点(x0,f(x0))做曲线y=f(x)的切线L,L的方程为y=f(x0)+f'(x0)(x-x0),求出L与x轴交点的横坐标x1=x0-f(x0)/f'(x0),称x1为r的一次近似值,过点(x1,f(x1))做曲线y=f(x)的切线,并求该切线与x轴的横坐标

x2=x1-f(x1)/f'(x1)称x2为r的二次近似值,重复以上过程,得r 的近似值序列{Xn},其中Xn+1=Xn-f(Xn)/f'(Xn),称为r的n+1次近似值。上式称为牛顿迭代公式。

/*

用牛顿迭代法求下面方程

x*x*x-5*x*x+16*x-80=0的实根的过程是:

1.你想在谁附近求解,这个范围或者这个数值大多是题目已经给定了的(本例是根据输入的数值来计算的)

2.令f(x)=x*x*x-5*x*x+16*x-80

3.x1=X

4.求f(x1)

5.对f(x)求导,得到f1(x),求f1(x1)

6.调整x,使x=x1-f(x1)/f1(x1)

7.符合条件x-x1>1e-5,转到第3步

8.不符合条件x-x1>1e-5,则x1就是我们要求的实根

*/

#include

#include

//y=((x-5)*x+16)*x-80

float f(float x)

{

return (pow(x,3)-5*pow(x,2)+16*x-80);

}

float f1(float x)

{

return (3*pow(x,2)-10*x+16);

}

void main()

{

float x,x1,y1,y2;

printf("请输入一个任意实数:X="); scanf("%f",&x);

printf("我可以帮你找到这个方程的解\n"); do

{

x1=x;

y1=f(x);

y2=f1(x1);

x=x1-y1/y2;

}

while (fabs(x-x1)>=1e-5);

printf("A root is %f\n",x1);

}

相关文档
最新文档