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

Description

试计算积分 ∫ 0 ∞ x a x − x d x ( ∣ a ∣ ≤ 50 ) \int_{0}^{\infty}x^{\frac{a}{x}-x}dx(|a|\le50) 0xxaxdx(a50),保留至小数点后 5 5 5位。若积分发散,请输出orz。

Solution
如何分析题目中给定积分

设题目给定的无界(广义)积分中被积函数为 f ( x ) f(x) f(x);首先,上述积分中被积函数自变量 x x x取不到 0 0 0且无上界;其次,由于 f ( x ) f(x) f(x)是“幂指函数”,故先“指对互化”:

f ( x ) = x a x − x = e ( a x − x ) l n x f(x)=x^{\frac{a}{x}-x}=e^{(\frac{a}{x}-x)lnx} f(x)=xxax=e(xax)lnx g ( x ) = ( a x − x ) l n x g(x)=(\frac{a}{x}-x)lnx g(x)=(xax)lnx,则 f ( x ) = e g ( x ) f(x)=e^{g(x)} f(x)=eg(x)

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

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

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

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

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

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

(2)、若 lim ⁡ x → + ∞ x f ( x ) = d > 0 \lim_{x\to+\infty}xf(x)=d>0 limx+xf(x)=d>0,那么 ∫ a + ∞ f ( x ) d x \int_{a}^{+\infty}f(x)dx a+f(x)dx发散。

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

二、无穷间断点的审敛法

a a a f ( x ) f(x) f(x)的无穷间断点, f ( x ) f(x) f(x) ( a , b ] (a,b] (a,b]上有 f ( x ) ≥ 0 f(x)\ge0 f(x)0

1、若存在常数 0 < p < 1 0<p<1 0<p<1使得 lim ⁡ x → a + ( x − a ) p f ( x ) = c \lim_{x\to a^+}(x-a)^pf(x)=c limxa+(xa)pf(x)=c,那么 ∫ a b f ( x ) d x \int_{a}^{b}f(x)dx abf(x)dx收敛。

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

类似的,设 b b b f ( x ) f(x) f(x)的无穷间断点, f ( x ) f(x) f(x) [ a , b ) [a,b) [a,b)上有 f ( x ) ≥ 0 f(x)\ge0 f(x)0

1、若存在常数 0 < p < 1 0<p<1 0<p<1使得 lim ⁡ x → b − ( b − x ) p f ( x ) = c \lim_{x\to b^-}(b-x)^pf(x)=c limxb(bx)pf(x)=c,那么 ∫ a b f ( x ) d x \int_{a}^{b}f(x)dx abf(x)dx收敛。

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

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

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

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

1、 x → 0 + x\to0^+ x0+ lim ⁡ x → 0 + f ( x ) = e lim ⁡ x → 0 + ( a − x 2 ) l n x x = e lim ⁡ x → 0 + ( a − x 2 ) lim ⁡ x → 0 + l n x x \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

= e a lim ⁡ x → 0 + l n x x = =e^{a\lim_{x\to 0^+}\frac{lnx}{x}}= =ealimx0+xlnx=(1) e + ∞ = + ∞ , a < 0 e^{+\infty}=+\infty,a<0 e+=+,a<0

​ (2) e 0 = 1 , a = 0 e^{0}=1,a=0 e0=1,a=0

​ (3) e − ∞ = 0 , a > 0 e^{-\infty}=0,a>0 e=0,a>0

所以只有 a < 0 a<0 a<0 ∫ 0 ∞ f ( x ) d x \int_{0}^{\infty}f(x)dx 0f(x)dx可能在 x = 0 x=0 x=0处发散。

∵ \because lim ⁡ x → 0 + ( x − 0 ) f ( x ) = e lim ⁡ x → 0 + ( a − x 2 + x ) l n x x = e lim ⁡ x → 0 + l n x ( 1 − x + a x ) = 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}=+\infty limx0+(x0)f(x)=elimx0+x(ax2+x)lnx=elimx0+lnx(1x+xa)=e+=+,故 ∫ 0 ∞ f ( x ) d x \int_{0}^{\infty}f(x)dx 0f(x)dx x = 0 x=0 x=0处发散。

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

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

a ≥ 0 a\ge0 a0情况代码实现

由于 a > 0 a>0 a>0时原积分在 x → + ∞ x\to +\infty x+处收敛且 f ( 10 ) = 1 0 a 10 − 10 , f ( 20 ) = 2 0 a 20 − 20 f(10)=10^{\frac{a}{10}-10},f(20)=20^{\frac{a}{20}-20} f(10)=1010a10,f(20)=2020a20。即便 a a a取到题目给定上限 50 50 50 f ( 10 ) = 1 0 − 5 = 0.0001 , f ( 20 ) = 2 0 − 15 f(10)=10^{-5}=0.0001,f(20)=20^{-15} f(10)=105=0.0001,f(20)=2015小的可以在保留 5 5 5位小数情况下忽略不记,故自适应 S i m p s o n Simpson Simpson法的左右端点可取 0 , 20 0,20 0,20(注意:右端点取值过大会导致初始状态用 S i m p s o n Simpson Simpson公式近似定积分值时得到 f ( m i d ) f(mid) f(mid) f ( r ) f(r) f(r)等于 0 0 0从而导致拟合误差较大)。同时,为了提高准确性,初始精度 e p s eps eps可适当调高。

总结

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

2、求极限时:能求提则求提!!(再次重申:求提原理:若 f ( a ) 、 f ( b ) f(a)、f(b) f(a)f(b) x → a x\to a xa时极限均存在,则 l i m x → a f ( a ) f ( b ) = l i m x → a f ( a ) l i m x → a f ( 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值