題目描述 計算積分 結果保留至小數點後6位。 數據保證計算過程中分母不為0且積分能夠收斂。 輸入輸出格式 輸入格式: 一行,包含6個實數a,b,c,d,L,R 輸出格式: 一行,積分值,保留至小數點後6位。 輸入輸出樣例 輸入樣例#1: 複製 1 2 3 4 5 6 輸出樣例#1: 複製 2.732 ...
題目描述
計算積分
結果保留至小數點後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
辛普森積分是用$y = Ax^2 +Bx +c$去擬合給定的函數
$$\int_a^bf(x)dx\approx\frac{(b-a)(f(a)+f(b)+4f(\frac{a+b}{2}))}{6}$$
自適應的含義是根據不同的區間大小選用不同的eps
// luogu-judger-enable-o2 #include<cstdio> #include<cmath> double a, b, c, d, L, R; double F(double x) { return (c * x + d) / (a * x + b); } double sim(double l, double r) { return (F(l) + F(r) + 4 * F((l + r) / 2)) * (r - l) / 6; } double asr(double L, double R, double eps, double ans) { double mid = (L + R) / 2; double LL = sim(L, mid), RR = sim(mid, R); if(fabs(LL + RR - ans) < eps) return LL + RR; else return asr(L, mid, eps / 2, sim(L, mid)) + asr(mid, R, eps / 2, sim(mid, R)); } main() { #ifdef WIN32 freopen("a.in", "r", stdin); #endif scanf("%lf %lf %lf %lf %lf %lf", &a, &b, &c, &d, &L, &R); printf("%lf", asr(L, R, 1e-6, sim(L, R))); }