luoguP4526 【模板】自适应辛普森法2

博客围绕积分∫0∞xxa−xdx(∣a∣≤50)展开,先分析给定积分,因无法用常规方法求原函数,故考虑审敛法,介绍了无穷界积分和无穷间断点的审敛法,判断积分在不同情况下的收敛性,还给出a≥0时的代码实现及总结。
Description

试计算积分∫0∞xax−xdx(∣a∣≤50)\int_{0}^{\infty}x^{\frac{a}{x}-x}dx(|a|\le50)0xxaxdx(a50),保留至小数点后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)=xxax=e(xax)lnxg(x)=(ax−x)lnxg(x)=(\frac{a}{x}-x)lnxg(x)=(xax)lnx,则f(x)=eg(x)f(x)=e^{g(x)}f(x)=eg(x)

通常情况下,对于此题,我们判断x→0x\to0x0这种情况下积分是否收敛可试着求lim⁡ε→0+∫0+ε∞xax−xdx\lim_{\varepsilon\to0^+}\int_{0+\varepsilon}^{\infty}x^{\frac{a}{x}-x}dxlimε0+0+εxxaxdx看其是否存在(即是否等于一常数);对于x→+∞x\to+\inftyx+的情况,则看f(x)f(x)f(x)原函数在x→+∞x\to+\inftyx+时极限是否存在;但此积分着实没法用常规方法求原函数,故考虑审敛法。

(注意:被积函数在某处趋近于正无穷(常数)并不一定代表其积分发散(收敛)!即:不能简单根据被积函数的取值判断收敛发散。

Eg:1、∫01lnxdx\int_{0}^{1}lnxdx01lnxdx:此积分可用上面设ε\varepsilonε的方法分部积分后得到其=−1=-1=1,收敛;2、虽然x→+∞x\to+\inftyx+1x\frac{1}{x}x1趋近于000,但∫1+∞1xdx\int_{1}^{+\infty}\frac{1}{x}dx1+x1dx显然发散。)

关于审敛法
一、无穷界积分的审敛法

f(x)f(x)f(x)在积分区间[a,+∞)[a,+\infty)[a,+)上恒有f(x)≥0f(x)\ge0f(x)0

(1)、若存在常数p>1p>1p>1使得lim⁡x→+∞xpf(x)=c\lim_{x\to+\infty}x^pf(x)=climx+xpf(x)=c,那么∫a+∞f(x)dx\int_{a}^{+\infty}f(x)dxa+f(x)dx收敛。

(2)、若lim⁡x→+∞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)dxa+f(x)dx发散。

将积分区间换为(−∞,a](-\infty,a](,a]时定理仍成立。

二、无穷间断点的审敛法

aaaf(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使得lim⁡x→a+(x−a)pf(x)=c\lim_{x\to a^+}(x-a)^pf(x)=climxa+(xa)pf(x)=c,那么∫abf(x)dx\int_{a}^{b}f(x)dxabf(x)dx收敛。

2、若lim⁡x→a+(x−a)f(x)=d>0\lim_{x\to a^+}(x-a)f(x)=d>0limxa+(xa)f(x)=d>0,那么∫abf(x)dx\int_{a}^{b}f(x)dxabf(x)dx发散。

类似的,设bbbf(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使得lim⁡x→b−(b−x)pf(x)=c\lim_{x\to b^-}(b-x)^pf(x)=climxb(bx)pf(x)=c,那么∫abf(x)dx\int_{a}^{b}f(x)dxabf(x)dx收敛。

2、若lim⁡x→b−(b−x)f(x)=d>0\lim_{x\to b^-}(b-x)f(x)=d>0limxb(bx)f(x)=d>0,那么∫abf(x)dx\int_{a}^{b}f(x)dxabf(x)dx发散。

(注意:以上ccc均为常数,ddd可为常数也可取无穷

上述两种审敛法的证明回头拿到同济版高数课本再补。

对于此题:x≥0x\ge0x0,故f(x)≥0f(x)\ge0f(x)0恒成立。

1、x→0+x\to0^+x0+lim⁡x→0+f(x)=elim⁡x→0+(a−x2)lnxx=elim⁡x→0+(a−x2)lim⁡x→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}}limx0+f(x)=elimx0+x(ax2)lnx=elimx0+(ax2)limx0+xlnx

=ealim⁡x→0+lnxx==e^{a\lim_{x\to 0^+}\frac{lnx}{x}}==ealimx0+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)dx0f(x)dx可能在x=0x=0x=0处发散。

∵\becauselim⁡x→0+(x−0)f(x)=elim⁡x→0+(a−x2+x)lnxx=elim⁡x→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}=+\inftylimx0+(x0)f(x)=elimx0+x(ax2+x)lnx=elimx0+lnx(1x+xa)=e+=+,故∫0∞f(x)dx\int_{0}^{\infty}f(x)dx0f(x)dxx=0x=0x=0处发散。

2、x→+∞x\to+\inftyx+:可利用洛必达法则求得:

lim⁡x→+∞x2f(x)=elim⁡x→+∞(a−x2+2x)lnxx=elim⁡x→+∞[(−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(ax2+2x)lnx=elimx+[(2x+2)lnx+xax+2]=e=0,故∫0∞f(x)dx\int_{0}^{\infty}f(x)dx0f(x)dxx→+∞x\to +\inftyx+处收敛。

a≥0a\ge0a0情况代码实现

由于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)=1010a10,f(20)=2020a20。即便aaa取到题目给定上限505050f(10)=10−5=0.0001,f(20)=20−15f(10)=10^{-5}=0.0001,f(20)=20^{-15}f(10)=105=0.0001,f(20)=2015小的可以在保留555位小数情况下忽略不记,故自适应SimpsonSimpsonSimpson法的左右端点可取0,200,200,20(注意:右端点取值过大会导致初始状态用SimpsonSimpsonSimpson公式近似定积分值时得到f(mid)f(mid)f(mid)f(r)f(r)f(r)等于000从而导致拟合误差较大)。同时,为了提高准确性,初始精度epsepseps可适当调高。

总结

1、若写的自适应Simpson法实际运行的时候出了误差,可从修改初次调用Simpson函数时积分区间的端点lllrrr、长度epsepseps的值入手;

2、求极限时:能求提则求提!!(再次重申:求提原理:若f(a)、f(b)f(a)、f(b)f(a)f(b)x→ax\to axa时极限均存在,则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)limxaf(a)f(b)=limxaf(a)limxaf(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;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值