题目描述
计算积分
结果保留至小数点后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;
}