链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1282

题意:

Solve the equation:
        p*e-x + q*sin(x) + r*cos(x) + s*tan(x) + t*x2 + u = 0. where 0 <= x <= 1.

       p, q, r, s, t and u (where0 <= p,r <= 20 and -20 <= q,s,t <= 0).

 

思路:注意到每一项的系数的正负,可以判断出每一项都是减函数,则整个函数是个单调减函数。

那么在[0,1]范围内F(x)要想有解,需满足F(0)>=0,F(1)<=0.否则就No sulution.  

确定有解后,则用二分法来求近似解。

用二分法的时候,要注意好精度,一是可以通过控制迭代次数来控制,二是通过控制二分的区间长度来控制。

 

#include<cstdio>
#include<cmath>
#define F(x) (p*exp(-x)+q*sin(x)+r*cos(x)+s*tan(x)+t*(x)*(x)+u)
const double eps=1e-14;

int main()
{
    int p,q,r,s,t,u;
    while(~scanf("%d%d%d%d%d%d",&p,&q,&r,&s,&t,&u))
    {
        double f0=F(0),f1=F(1);
        if(f0<-eps || f1>eps)
            printf("No solution\n");
        else
        {
            double x=0,y=1,m;
            while(y-x>1e-7)//控制区间长度
        //for(int i=0;i<100;i++)//控制迭代次数
         {
                m=x+(y-x)/2;
                if(F(m)>0) x=m;
                else y=m;
            }
            printf("%.4lf\n",m);
        }
    }
    return 0;
}

 

 

 

 

 posted on 2013-09-07 11:01  ∑求和  阅读(283)  评论(0编辑  收藏  举报