二分法、牛顿法、牛顿下山法、弦截法求解x^3-3*x-1=0在区间[0,1]上的一个根

#include<iostream>
#include<math.h>
using namespace std;


/*int main()                                       //二分法 解为0.25753 运算次数27
{
    double a=0,b=1;
    double x;
    double l;
    int k=0;
    while(fabs(a-b)>=0.00000001)
    {
        x=(a+b)/2;
        k++;
        cout<<k<<" "<<x<<endl;
        if((x*x-3*x+2-exp(x))<0)
           b=x;
        else if((x*x-3*x+2-exp(x))>0)
           a=x;
        else
           {
               l=x;
               break;
           }
    }
    l=x;
    cout<<"利用二分法求得的方程的解为:"<<l<<endl;
    cout<<"利用二分法运算次数:"<<k<<endl;
    return 0;

}*/




/*int main()                                      //牛顿法 解为0.25753 运算次数4
{
    double a=1;
    double b=a-(a*a-3*a+2-exp(a))/(2*a-3-exp(a));
    int tag=0;
    int k=1;
    cout<<k<<" "<<b<<endl;
    while (fabs(a-b)>=0.00000001)
    {
        if(tag==0)
        {
            a=b-(b*b-3*b+2-exp(b))/(2*b-3-exp(b));
            tag=1;
            k++;
            cout<<k<<" "<<a<<endl;
        }
        else
        {
            b=a-(a*a-3*a+2-exp(a))/(2*a-3-exp(a));
            tag=0;
            k++;
            cout<<k<<" "<<b<<endl;
        }
    }
    if(tag==1)
        cout<<"利用牛顿法求得的方程的解为:"<<a<<endl;
    else
        cout<<"利用牛顿法求得的方程的解为:"<<b<<endl;
        cout<<"利用牛顿法运算的次数:"<<k<<endl;
    return 0;

}*/




/*int main()                                           //牛顿下山法 解为0.25753 运算次数4
{
    double i=1;
    double a=1;
    double b=a-i*(a*a-3*a+2-exp(a))/(2*a-3-exp(a));
    int k=1;
    cout<<k<<" "<<b<<endl;
    if(fabs(b)>=fabs(a))
        i=i/2;
    int tag=0;
    while (fabs(a-b)>=0.00000001)
    {
        if(tag==0)
        {
            a=b-i*(b*b-3*b+2-exp(b))/(2*b-3-exp(b));
            tag=1;
            if(fabs(a)>=fabs(b))
                i=i/2;
            k++;
            cout<<k<<" "<<a<<endl;
        }
        else
        {
            b=a-i*(a*a-3*a+2-exp(a))/(2*a-3-exp(a));
            tag=0;
            if(fabs(b)>=fabs(a))
                i=i/2;
            k++;
            cout<<k<<" "<<b<<endl;
        }
    }
    if(tag==1)
        cout<<"利用牛顿下山法求得的方程的解为:"<<a<<endl;
    else
        cout<<"利用牛顿下山法求得的方程的解为:"<<b<<endl;
        cout<<"利用牛顿下山法运算的次数:"<<k<<endl;
    return 0;
}*/




/*int main()                                         //弦截法 解为0.25753 运算次数5
{
    double a=0,b=1;
    double c;
    c=a-((a*a-3*a+2-exp(a))/((a*a-3*a+2-exp(a))-(b*b-3*b+2-exp(b))))*(a-b);
    int k=1;
    cout<<k<<" "<<c<<endl;
    int tag=1;//c a b
    while((tag==1&&fabs(c-a)>=0.00000001)||(tag==2&&fabs(b-c)>=0.00000001)||(tag==3&&fabs(a-b)>=0.00000001))
    {
        if(tag==1)
        {
            b=c-((c*c-3*c+2-exp(c))/((c*c-3*c+2-exp(c))-(a*a-3*a+2-exp(a))))*(c-a);
            tag=2;//b c a
            k++;
            cout<<k<<" "<<b<<endl;
        }
        else if(tag==2)
        {
            a=b-((b*b-3*b+2-exp(b))/((b*b-3*b+2-exp(b))-(c*c-3*c+2-exp(c))))*(b-c);
            tag=3;//a b c
            k++;
            cout<<k<<" "<<a<<endl;
        }
        else
        {
            c=a-((a*a-3*a+2-exp(a))/((a*a-3*a+2-exp(a))-(b*b-3*b+2-exp(b))))*(a-b);
            tag=1;//c b a
            k++;
            cout<<k<<" "<<c<<endl;
        }
    }
    if(tag==1)
        cout<<"利用弦截法求得的方程的解为:"<<c<<endl;
    else if(tag==2)
        cout<<"利用弦截法求得的方程的解为:"<<b<<endl;
    else
        cout<<"利用弦截法求得的方程的解为:"<<a<<endl;
    cout<<"利用弦截法运算的次数:"<<k<<endl;
    return 0;

}*/


猜你喜欢

转载自blog.csdn.net/qq_38628659/article/details/80290110