Description
试计算积分∫0∞xax−xdx(∣a∣≤50)\int_{0}^{\infty}x^{\frac{a}{x}-x}dx(|a|\le50)∫0∞xxa−xdx(∣a∣≤50),保留至小数点后555位。若积分发散,请输出orz。
Solution
如何分析题目中给定积分
设题目给定的无界(广义)积分中被积函数为f(x)f(x)f(x);首先,上述积分中被积函数自变量xxx取不到000且无上界;其次,由于f(x)f(x)f(x)是“幂指函数”,故先“指对互化”:
f(x)=xax−x=e(ax−x)lnxf(x)=x^{\frac{a}{x}-x}=e^{(\frac{a}{x}-x)lnx}f(x)=xxa−x=e(xa−x)lnx 设g(x)=(ax−x)lnxg(x)=(\frac{a}{x}-x)lnxg(x)=(xa−x)lnx,则f(x)=eg(x)f(x)=e^{g(x)}f(x)=eg(x)
通常情况下,对于此题,我们判断x→0x\to0x→0这种情况下积分是否收敛可试着求limε→0+∫0+ε∞xax−xdx\lim_{\varepsilon\to0^+}\int_{0+\varepsilon}^{\infty}x^{\frac{a}{x}-x}dxlimε→0+∫0+ε∞xxa−xdx看其是否存在(即是否等于一常数);对于x→+∞x\to+\inftyx→+∞的情况,则看f(x)f(x)f(x)原函数在x→+∞x\to+\inftyx→+∞时极限是否存在;但此积分着实没法用常规方法求原函数,故考虑审敛法。
(注意:被积函数在某处趋近于正无穷(常数)并不一定代表其积分发散(收敛)!即:不能简单根据被积函数的取值判断收敛发散。
Eg:1、∫01lnxdx\int_{0}^{1}lnxdx∫01lnxdx:此积分可用上面设ε\varepsilonε的方法分部积分后得到其=−1=-1=−1,收敛;2、虽然x→+∞x\to+\inftyx→+∞时1x\frac{1}{x}x1趋近于000,但∫1+∞1xdx\int_{1}^{+\infty}\frac{1}{x}dx∫1+∞x1dx显然发散。)
关于审敛法
一、无穷界积分的审敛法
设f(x)f(x)f(x)在积分区间[a,+∞)[a,+\infty)[a,+∞)上恒有f(x)≥0f(x)\ge0f(x)≥0:
(1)、若存在常数p>1p>1p>1使得limx→+∞xpf(x)=c\lim_{x\to+\infty}x^pf(x)=climx→+∞xpf(x)=c,那么∫a+∞f(x)dx\int_{a}^{+\infty}f(x)dx∫a+∞f(x)dx收敛。
(2)、若limx→+∞xf(x)=d>0\lim_{x\to+\infty}xf(x)=d>0limx→+∞xf(x)=d>0,那么∫a+∞f(x)dx\int_{a}^{+\infty}f(x)dx∫a+∞f(x)dx发散。
将积分区间换为(−∞,a](-\infty,a](−∞,a]时定理仍成立。
二、无穷间断点的审敛法
设aaa是f(x)f(x)f(x)的无穷间断点,f(x)f(x)f(x)在(a,b](a,b](a,b]上有f(x)≥0f(x)\ge0f(x)≥0:
1、若存在常数0<p<10<p<10<p<1使得limx→a+(x−a)pf(x)=c\lim_{x\to a^+}(x-a)^pf(x)=climx→a+(x−a)pf(x)=c,那么∫abf(x)dx\int_{a}^{b}f(x)dx∫abf(x)dx收敛。
2、若limx→a+(x−a)f(x)=d>0\lim_{x\to a^+}(x-a)f(x)=d>0limx→a+(x−a)f(x)=d>0,那么∫abf(x)dx\int_{a}^{b}f(x)dx∫abf(x)dx发散。
类似的,设bbb是f(x)f(x)f(x)的无穷间断点,f(x)f(x)f(x)在[a,b)[a,b)[a,b)上有f(x)≥0f(x)\ge0f(x)≥0:
1、若存在常数0<p<10<p<10<p<1使得limx→b−(b−x)pf(x)=c\lim_{x\to b^-}(b-x)^pf(x)=climx→b−(b−x)pf(x)=c,那么∫abf(x)dx\int_{a}^{b}f(x)dx∫abf(x)dx收敛。
2、若limx→b−(b−x)f(x)=d>0\lim_{x\to b^-}(b-x)f(x)=d>0limx→b−(b−x)f(x)=d>0,那么∫abf(x)dx\int_{a}^{b}f(x)dx∫abf(x)dx发散。
(注意:以上ccc均为常数,ddd可为常数也可取无穷)
上述两种审敛法的证明回头拿到同济版高数课本再补。
对于此题:x≥0x\ge0x≥0,故f(x)≥0f(x)\ge0f(x)≥0恒成立。
1、x→0+x\to0^+x→0+:limx→0+f(x)=elimx→0+(a−x2)lnxx=elimx→0+(a−x2)limx→0+lnxx\lim_{x\to0^+}f(x)=e^{\lim_{x\to 0^+}\frac{(a-x^2)lnx}{x}}=e^{\lim_{x\to 0^+}(a-x^2)\lim_{x\to 0^+}\frac{lnx}{x}}limx→0+f(x)=elimx→0+x(a−x2)lnx=elimx→0+(a−x2)limx→0+xlnx
=ealimx→0+lnxx==e^{a\lim_{x\to 0^+}\frac{lnx}{x}}==ealimx→0+xlnx=(1)e+∞=+∞,a<0e^{+\infty}=+\infty,a<0e+∞=+∞,a<0
(2)e0=1,a=0e^{0}=1,a=0e0=1,a=0
(3)e−∞=0,a>0e^{-\infty}=0,a>0e−∞=0,a>0
所以只有a<0a<0a<0时∫0∞f(x)dx\int_{0}^{\infty}f(x)dx∫0∞f(x)dx可能在x=0x=0x=0处发散。
又∵\because∵limx→0+(x−0)f(x)=elimx→0+(a−x2+x)lnxx=elimx→0+lnx(1−x+ax)=e+∞=+∞\lim_{x\to 0^+}(x-0)f(x)=e^{\lim_{x\to 0^+}\frac{(a-x^2+x)lnx}{x}}=e^{\lim_{x\to 0^+}lnx(1-x+\frac{a}{x})}=e^{+\infty}=+\inftylimx→0+(x−0)f(x)=elimx→0+x(a−x2+x)lnx=elimx→0+lnx(1−x+xa)=e+∞=+∞,故∫0∞f(x)dx\int_{0}^{\infty}f(x)dx∫0∞f(x)dx在x=0x=0x=0处发散。
2、x→+∞x\to+\inftyx→+∞:可利用洛必达法则求得:
limx→+∞x2f(x)=elimx→+∞(a−x2+2x)lnxx=elimx→+∞[(−2x+2)lnx+ax−x+2]=e−∞=0\lim_{x\to+\infty}x^2f(x)=e^{\lim_{x\to+\infty}\frac{(a-x^2+2x)lnx}{x}}=e^{\lim_{x\to+\infty}[(-2x+2)lnx+\frac{a}{x}-x+2]}=e^{-\infty}=0limx→+∞x2f(x)=elimx→+∞x(a−x2+2x)lnx=elimx→+∞[(−2x+2)lnx+xa−x+2]=e−∞=0,故∫0∞f(x)dx\int_{0}^{\infty}f(x)dx∫0∞f(x)dx在x→+∞x\to +\inftyx→+∞处收敛。
a≥0a\ge0a≥0情况代码实现
由于a>0a>0a>0时原积分在x→+∞x\to +\inftyx→+∞处收敛且f(10)=10a10−10,f(20)=20a20−20f(10)=10^{\frac{a}{10}-10},f(20)=20^{\frac{a}{20}-20}f(10)=1010a−10,f(20)=2020a−20。即便aaa取到题目给定上限505050,f(10)=10−5=0.0001,f(20)=20−15f(10)=10^{-5}=0.0001,f(20)=20^{-15}f(10)=10−5=0.0001,f(20)=20−15小的可以在保留555位小数情况下忽略不记,故自适应SimpsonSimpsonSimpson法的左右端点可取0,200,200,20(注意:右端点取值过大会导致初始状态用SimpsonSimpsonSimpson公式近似定积分值时得到f(mid)f(mid)f(mid)与f(r)f(r)f(r)等于000从而导致拟合误差较大)。同时,为了提高准确性,初始精度epsepseps可适当调高。
总结
1、若写的自适应Simpson法实际运行的时候出了误差,可从修改初次调用Simpson函数时积分区间的端点lll和rrr、长度epsepseps的值入手;
2、求极限时:能求提则求提!!(再次重申:求提原理:若f(a)、f(b)f(a)、f(b)f(a)、f(b)在x→ax\to ax→a时极限均存在,则limx→af(a)f(b)=limx→af(a)limx→af(b)lim_{x\to a}f(a)f(b)=lim_{x\to a}f(a)lim_{x\to a}f(b)limx→af(a)f(b)=limx→af(a)limx→af(b)!);
3、公式推导务求过程严谨。
Code
#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
double A;
inline double dcmp(double x,double y) { return fabs(x-y)<=1e-6; }
inline double f(double x)
{
if(dcmp(x,0.0))
{
if(dcmp(A,0.0)) return 1.0;
return 0.0;
}
return exp((A-x*x)*log(x)/x);
}
inline double Simpson(double a,double b) { return (f(a)+4*f((a+b)/2.0)+f(b))*(b-a)/6.0; }
inline double queryans(double l,double r,double eps,double ans)
{
register double mid=(l+r)/2.0;
double ansl=Simpson(l,mid),ansr=Simpson(mid,r);
if(fabs(ansl+ansr-ans)<=15*eps) return ansl+ansr+(ansl+ansr-ans)/15.0;
return queryans(l,mid,eps/2.0,ansl)+queryans(mid,r,eps/2.0,ansr);
}
int main()
{
scanf("%lf",&A);
if(A<0.0) { cout<<"orz"; return 0; }
printf("%.5lf",queryans(0,20,1e-7,Simpson(0,20)));
return 0;
}