P4526 题解

· · 题解

Part 1 思路整理

看到了题目,很多人可能会有疑问,什么是辛普森积分法呢?

所谓辛普森积分法呢,就是用抛物线来近似函数的图像(类似于我们熟知的泰勒级数),从而达成近似定积分数值的目的,是牛顿-科特斯公式的子结论(牛顿-科特斯公式 \int_a^bf(x)\,\text{d}x\approx\sum\limits_{i=0}^nw_if(x_i)) 。由于辛普森公式只能作上下边界为有限数的定积分的近似,那我们就必须舍去图像中面积过小而无意义的部分。

Part 2 边界取舍

看了看楼上楼下,都没有把这个函数的图像真正的整出来的。我们现在就使用desmos这个工具来直观的感受一下这个函数的图像。

这个是当 a=2.33 时,函数的图像

我们可以看到,当 x\in[15,+\infty) 时,函数的图像无限趋近于x轴,故这一段的面积可以近似为0。这一下我们就很高兴啦,可以很愉快地使用辛普森积分了呢。

就这样,我们求积分的式子就变为 \int_0^{15}x^{\frac a x-x}\,\text{d}x 了。

Part 3 发散与收敛

注意到题目让我们特判出积分发散时的情况并输出orz,所以,我们必须找出当积分发散时 a 的取值。现在,我们告诉大家, a\ge0 时,积分收敛; a<0 时,积分发散,下面就来简单证明一下。

我们令 f(x)=x^{\frac a x-x}

那么我们就可以得到: f(x)=x^{\frac {a^2-x} a}

$\because x\to0$ 时, $x^2\to0,\dfrac 1 x\to+\infty \therefore x^2-a\to-a,-\dfrac a x\to+\infty

\becausex\in(0,1)\lim\limits_{n\to+\infty}x^n\to0

\lim\limits_{x\to0}f(x)\to+\infty

则原命题得证.

我们首先讨论 a\in\mathbb{R} 时的情况。

\because \lim\limits_{x\to+\infty}\dfrac {a-x^2} a \to +\infty \therefore \lim\limits_{x\to+\infty}x^{\frac {a-x^2} a}\to+\infty

\because \lim\limits_{m\to+\infty}\dfrac 1 m\to 0

然后呢,我们再讨论 $a>0$ 时的情况。 $\because \left.\frac {a-x^2} x\right|_{x<\min(\sqrt{a},1)}>0 \therefore \left.x^{\frac {a-x^2} x}\right|_{x<\min(\sqrt{a},1)}<1 故命题2得证 综上所述,我们就得到了原函数收敛和发散的条件啦 ## Part 4 code 那么,综合以上的分析,我相信各位一定理解了这题的思路与解法。下面就是AC代码: ```cpp //@copyright 2020~2022 Iam贾粮宅 All rights reserved #include <bits/stdc++.h> #define cd const double typedef long long ll; using namespace std; cd Eps=1e-8; double a,lf,rt; inline double f(double x)//function original { return pow(x,(a/x)-x); } inline double s(double p,double q)//simpson { double k=p+(q-p)/2; return (f(p)+4*f(k)+f(q))*(q-p)/6.0; } double as(double p,double q,double S)//adaptive-simpson { double k=p+(q-p)/2; double l1=s(p,k),l2=s(k,q); if(fabs(l1+l2-S)<=Eps) return l1+l2; else return as(p,k,l1)+as(k,q,l2); } int main() { cin>>a; if(a<0) puts("orz"); else printf("%.5lf",as(Eps,15,s(lf,rt))); return 0; } ``` 注意,这里Eps不要调太高,建议是1e-8.(要不然你可能会WA几个点)