json
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 }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。