牛顿迭代式(Newton's Method)解多次方程

    设r是
的根,选取
作为r的初始近似值,过点
作曲线
的切线L,L的方程为
,求出L与x轴交点的横坐标
,称x 1为r的一次近似值。过点
作曲线
的切线,并求该切线与x轴交点的横坐标
,称
为r的二次近似值。重复以上过程,得r的近似值序列,其中,
称为r的
次近似值,上式为牛顿迭代公式。

    以上copy于百度百科,也就是说,对于一个函数f(x),先选择一个点,然后在这个点上作切线,这时在一个很小的范围内,可以近似的将这条切线视为f(x)。然后求出这条切线与x轴的交点,如果足够相近的话,就可以说这个点就是f(x)的解了。而如何让这个解更为精确,方法就是再求出这个横坐标在f(x)上的点,然后继续作切线。这样一直画下去,这个交点也会越来越接近真正的解。


    以下代码为解出一个三次方程的代码,输入这个三次方程的系数,然后用迭代法再一步一步精确。从哪一个点开始跑就看要求的范围,这里范围是直接从INT_MAX开始跑的,如果要求的范围更小可以根据范围再进行修改。如果要求的是一个正数这样处理就可以,如果要求得到一个负数,则可以将x0初始化为-INT_MAX再进行迭代。然后跑while循环进行迭代,直到得到的数值满足要求的范围为止。迭代的公式就是上面给的公式,求导的要自己算出来代入。然后输入输出就没什么多说的了。


    下面代码:

#include
#include
#include
#include
#include
#include
using namespace std;

double NewtonMethod(double a,double b,double c,double d)
{
    double x=INT_MAX;//初始化x0
    while(abs(a*x*x*x+b*x*x+c*x+d)>0.00001)//使误差小于0.00001
    {
        x-=(a*x*x*x+b*x*x+c*x+d)/(3*a*x*x+2*b*x+c);//迭代法
    }
    return x;
}

int main()
{
    double a1,b1,c1,d1;
    double ans;
    while(scanf("%lf%lf%lf%lf",&a1,&b1,&c1,&d1)!=EOF)
    {
        ans=NewtonMethod(a1,b1,c1,d1);
        printf("%.5f\n",ans);//输出五位小数
    }
    return 0;
}


你可能感兴趣的:(algorithm)