文档库 最新最全的文档下载
当前位置:文档库 › 求方程根 C语言编程

求方程根 C语言编程

其实牛顿迭代法就是一利用不动点求方程根的方法之一。
如果你想求一个数,比如a的平方根。
相当于解方程:x^2 = a,或者 x^2 - a = 0。
如果你学过数学分析,应该知道左边可以在一个初值x0附近按泰勒级数展开:
x0^2 + 2(x-x0) * x0 + (x-x0)^2 - a = 0
取x的线性部分,就得到了一个近似方程:
x0^2 + 2(x-x0) * x0 - a = 0
可以从中解出x:
x = (a + x0^2) / (2 * x0)

如果你取的x0正好是a的平方根,那么代入上式,算出来的x还是a的平方根。
如果代入的不是a的平方根,那么算出来的x将比x0更接近a的平方根。
你可以设x0 = a' + d(其中a'表示a的平方根),代入:
于是x - a'
= (a + (a'+d)^2) / (2a' + 2d) - a'
= (2a + 2a'd + d^2) / 2a' + 2d - a'
< (2a + 2a'd + d^2) / 2a' - a'
< (2a + 2a'd) / 2a' - a'
= a' + d - a'
= d
可见 x 与 a' 的误差是比原来的x0要小的。
这样用新算出来的x做为x0的话,再代入那个式子,就可以算出更接近a'的数来。
理论上如果能无限代下去,最后就会得到a'的精确值。实际上只用迭代几次,就能得出与a'误差不太大的值。可以做为方程的近似解。

牛顿迭代法是一类解方程根的通法,虽然它也不是在任何情况下都能收敛到方程的根上。但一般情况下都可以以很快的速度逼近方程的根,因此这种方法使用的非常广泛。我这里只是就这道题推了一下公式,你上网查查应该有全面讲解 牛顿迭代法 的地方。在数学分析里这个方法又叫 牛顿切线法。它除了可以用泰勒公式推导以外(这是一种普遍的方法,除了可以推导牛顿迭代公式以外,还可以推导出更高阶的逼近公式。在数值分析中有专门的研究),还可以用几何方法推导这个公式。

它的一般形式是:
x = x0 - f(x0) / f'(x0)



#include
#include

double F1(double); //原函数

double F2(double); //原函数的一阶导数函数

double Newton(double,double);

int main(int argc, int *argv[])
{
double x0 = 1.5;
double e = pow(10,-5);
printf("the result is %f\n",Newton(x0,e));
system("pause");
}

double F1(double x)
{
return 2 * x * x * x - 4 * x * x + 3 * x - 6 ;
}

double F2(double x)
{
return 6 * x * x - 8 * x + 3 ;
}

double Newton(double x0, double e)
{
double x1;
do
{
x1 = x0;
x0 = x1 - F1(x1) / F2(x1);
}while (fabs(x1 - x0) > e);
return x0;
}

其原理是:
(1) 选一个方程的近似根,赋给变量x1;
(2) 将x0的值保存于变量x1,然后计算g(x1),并将结果存于变量x0;
(3) 当x0与x1的差的绝对值还小于指定的精度要求时,重复步骤(2)的计算。
若方程有根,并且用上述方法计算出来的近似根序列收敛,则按上述方法

求得的x0就认为是方程的根。

相关文档