您的位置:首页 > 编程语言 > C语言/C++

牛顿迭代法

2012-11-28 23:57 211 查看
已知方程anxn+...+ a1 x +
a0在[a b]区间内有一个根,试用牛顿法求根,精确到五位小数。输入文件包含有多个测试 ,每个测试的第一行为n(n<20),然后一行为n+1个实数为系数an...a0,接下来为一个实数x0。所有数据均由空格分隔。

每个问题的解输出到一行中保留五位小数的解。如果给定的初值在牛顿迭代法20次还不收敛的话,就输出"No solution".

注意,牛顿法时,如果计算过程中一阶导数绝对值fabs(f'(x))<1e-6则视其一阶导数为0,此时也输出"No solution".
利用秦九韶类似算法可以求f(x)的一阶导数。

#include <iostream>

#include<iomanip>

#include<math.h>

using namespace std;

int i,n;

double t[100];

double f(double x)

{    

    double sum=t[0];

    for(i=1;i<=n;i++)

    {         

        sum=sum*x+t[i];

    }

    return sum;

}

double fd(double x)

{    

    double sum=t[0]*n;

    for(i=1;i<=n-1;i++)

    {         

        sum=sum*x+(n-i)*t[i];

    }

    return sum;

}

int main()

{

    double x,y,eps=1e-6;

    while(cin>>n)

    {

        for(i=0;i<=n;i++)

            cin>>t[i];

        cin>>x;

        for(i=1;i<=20;i++){

            if(fd(x)<eps)

            {

                cout<<"No solution"<<endl;

                break;

            }    

            else {

                y=x-f(x)/fd(x);

                if(fabs(y-x)<eps)

                {

                    cout<<fixed<<setprecision(5)<<y<<endl;

                    break;

                }

                else

                    x=y;

            }

            if(i>=20)

            {

                cout<<"No solution"<<endl;

                break;

            }

        }

    }

    return 0;
}

有改进的地方大家提出来,虽然c++和c混在一起不好,但是发现现在很习惯这么写,也不知道是好是坏。。。郁闷
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++