UVA10341幂函数零点的通解分析

 1 /*UVA10341:
 2 给定f(x)=p*e^(-x) + q*sin(x) + r*cos(x)+ s*tan(x) + t*x^2 + u = 0 这个方程的解
 3 r,p>=0,q,s,t<=0 定义域[0,1]
 4 我们可以看到《数值分析》这一小结的内容,我们发现似乎没有提及解方程的有效办法。
 5 这道题目是使用了函数的单调性,也都是基础函数的和。所以说,以后遇到这种问题要能辨识特殊性。
 6 那么我们一定需要的是通解:
 7 1、f(x)=幂函数的和
 8 例f(x)=5x^4-3x^3+6x^2+7x-9=0
 9 我们知道的工具是求导,判单调性,每个单调区间上都可能存在最多一个解。
10 单调性也是需要解f(x)=0的点的。
11 假设F(i)是最高次数是i的一个方程.
12 则F(i)的零点出现在F(i-1)的零点所划分区间上;
13 这样递归下去,直到解i=1时的零点就可以了;
14 当然,F(i-1)是F(i)相应的导函数,过程可以直接模拟出来
15 2、其他数值分析的方法(待补充)
16 以后遇到文献,补充进去
17 */
18 /*这道题虽然思路简单,但是却能学到很多东西:
19 详细见下面的代码,加注释的部分,F(l)*F(m)<0判断不行啊,一直是W,然而直接判断F(m)就可以,
20 后来想想,是因为(注意)两个很小的小数相乘是一个更小的数啊,近似等于0,计算机存储的精度精度已经不够了。
21 以后要避免这方面的问题
22 想了想解决办法,一是等比例放缩,例F(l)*10^5*F(r)*10^5<1,注意数字乘的顺序,将eps也扩大了,二是直接避免相乘出现
23 */
24 
25 #include<iostream>
26 #include<stdio.h>
27 #include<string.h>
28 #include<algorithm>
29 #include<stdlib.h>
30 #include<cmath>//要用abs(double) math.h不可
31 #include<queue>
32 #include<vector>
33 #include<map>
34 #define eps 1e-15
35 #define LL long long
36 using namespace std;
37 
38 double p,q,rr,s,t,u;
39 double F(double x)//因为宏定义的语法问题,最好直接写成函数调用
40 {
41     return p*exp(-x) + q*sin(x) + rr*cos(x)+ s*tan(x) + t*x*x + u;
42 }
43 int main()
44 {
45     while(cin>>p>>q>>rr>>s>>t>>u)//深坑,变量r重复了
46     {
47 
48         if (F(0)<0 || F(1)>0) cout<<"No solution"<<endl;
49         else
50         {
51             double l=0,r=1;
52             while(r-l>1e-10 )//按照常理,在精度要求10^-4这样不高的条件,这样设置eps就可以了
53             {
54                 double m=(l+r)/2.0;
55                 if(F(m)>0)l=m;else r=m;//上面分析比较处
56 //                if (F(m) * F(l) < 0) r=m;
57 //                else l=m;
58             }
59             printf("%.4lf\n",l);
60         }
61     }
62     return 0;
63 }

 

posted @ 2014-02-26 21:28  little_w  阅读(199)  评论(0编辑  收藏  举报