Description
题目描述
试计算积分
$$\displaystyle{\int_L^R\frac{cx+d}{ax+b}\mathrm{d}x}$$
结果保留至小数点后 6 位。
数据保证计算过程中分母不为 0 且积分能够收敛。
输入格式
一行,包含 6 个实数a,b,c,d,L,R
输出格式
一行,积分值,保留至小数点后 6 位。
Solution
来自一个积分小白的理解:
- 定积分
可以理解为在 Oxy坐标平面上,由曲线y=f(x)与直线x=a,x=b以及x轴围成的曲边梯形的面积值(一种确定的实数值)
(来自360百科)
- Simpson公式
求$\int_{a}^{b} f(x)\, dx$
由于二次函数的定积分有公式,考虑用二次函数拟合$f(x)$(使图像尽量重合)
设$f(x)$为原函数,$g(x)=Ax^{2}+Bx+C$为拟合后的函数,则有
$$\displaystyle{\int_a^bf(x)\mathrm{d}x}$$
$$\displaystyle{\approx\int_a^bAx^{2}+Bx+C}$$
$$=3A(b^{3}-a^{3}+2B(b^{2}-a^{2})+C(a-b))$$
$$=\frac{b-a}{6}(2A(a^{2}+ab+b^{2})+3B(a+b)+6c)$$
$$=\frac{b-a}{6}(2Aa^{2}+2Aab+2Ab^{2}+3Ba+3Bb+6C)$$
$$=\frac{b-a}{6}(Aa^{2}+Ba+C+Ab^{2}+Bb+C+4A(\frac{a+b}{2})^{2}+4B(\frac{a+b}{2})+4C)$$
$$=\frac{b-a}{6}(f(a)+f(b)+4f(\frac{a+b}{2}))$$
妈妈我会用LaTeX啦
神奇。。。
得到Simpson公式:
$$\displaystyle{\int_a^bf(x)\mathrm{d}x}\approx\frac{(b-a)(f(a)+f(b)+4f(\frac{a+b}{2}))}{6}$$
由于只是$\approx$,我们要减小区间大小(分成两半)以让拟合用的二次函数与原函数这一段的定积分更相近
但区间太大精度不够,区间太小复杂度撑不住
自适应性辛普森能按题目精度要求调控区间大小以保证精度和复杂度
Code
#include <cstdio> #include <cstdlib> #include <cmath> #define db double using namespace std; db a,b,c,d,L,R; db F(db x) { return (c*x+d)/(a*x+b);//原函数 } db simpson(db l,db r) { return (r-l)*(F(l)+F(r)+4*F((l+r)/2))/6; } db asr(db l,db r,db eps,db ans) { db mid=(l+r)/2; db 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_); } int main() { scanf("%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&L,&R); printf("%.6lf\n",asr(L,R,1e-6,simpson(L,R))); return 0; }