题目描述 计算积分 结果保留至小数点后6位。 数据保证计算过程中分母不为0且积分能够收敛。 输入格式 一行,包含6个实数a,b,c,d,L,R 输出格式 一行,积分值,保留至小数点后6位。
输入输出样例 输入 #1 1 2 3 4 5 6
输出 #1 2.732937
说明/提示 a,b,c,d∈[-10,10] -100≤L<R≤100 且 R-L≥1
然后就得到了Simpson公式 ∫ a b f ( x ) d x ≈ ( b − a ) ( f ( a ) + f ( b ) + 4 f ( a + b 2 ) ) 6 \int_a^bf(x)dx\approx\frac{(b-a)(f(a)+f(b)+4f(\frac{a+b}{2}))}{6} ∫abf(x)dx≈6(b−a)(f(a)+f(b)+4f(2a+b)) 二分之
#include <bits/stdc++.h> double a,b,c,d,l,r; inline double f(double x) { return (c*x+d)/(a*x+b); //原函数 } inline double simpson(double l,double r) { //Simpson公式 double mid=(l+r)/2; return (f(l)+4*f(mid)+f(r))*(r-l)/6; } double asr(double l,double r,double eps,double ans) { double mid=(l+r)/2; double l_=simpson(l,mid),r_=simpson(mid,r); if(fabs(l_+r_-ans)<=15*eps) return l_+r_+(l_+r_-ans)/15; //确认精度 return asr(l,mid,eps/2,l_)+asr(mid,r,eps/2,r_); //精度不够则递归调用 } inline double asr(double l,double r,double eps) { return asr(l,r,eps,simpson(l,r)); } int main() { scanf("%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&l,&r); printf("%.6lf",asr(l,r,1e-6)); return 0; }