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;
}
【最优潮流】直流最优潮流(OPF)课设(Matlab代码实现)内容概要:本文档主要围绕“直流最优潮流(OPF)课设”的Matlab代码实现展开,属于电力系统优化领域的教学与科研实践内容。文档介绍了通过Matlab进行电力系统最优潮流计算的基本原理与编程实现方,重点聚焦于直流最优潮流模型的构建与求解过程,适用于课程设计或科研入门实践。文中提及使用YALMIP等优化工具包进行建模,并提供了相关资源下载链接,便于读者复现与学习。此外,文档还列举了大量与电力系统、智能优化算法、机器学习、路径规划等相关的Matlab仿真案例,体现出其服务于科研仿真辅导的综合性平台性质。; 适合人群:电气工程、自动化、电力系统及相关专业的本科生、研究生,以及从事电力系统优化、智能算法应用研究的科研人员。; 使用场景及目标:①掌握直流最优潮流的基本原理与Matlab实现方;②完成课程设计或科研项目中的电力系统优化任务;③借助提供的丰富案例资源,拓展在智能优化、状态估计、微电网调度等方向的研究思路与技术手段。; 阅读建议:建议读者结合文档中提供的网盘资源,下载完整代码与工具包,边学习理论边动手实践。重点关注YALMIP工具的使用方,并通过复现文中提到的多个案例,加深对电力系统优化问题建模与求解的理解。
本程序为针对江苏省中医院挂号系统设计的自动化预约工具,采用Python语言编写。项目压缩包内包含核心配置文件与主执行文件。 配置文件conf.ini中,用户需根据自身情况调整身份验证参数:可填写用户名与密码,或直接使用有效的身份令牌(若提供令牌则无需填写前两项)。其余配置项通常无需更改。 主文件main.py包含两项核心功能: 1. 预约测试模块:用于验证程序运行状态及预约流程的完整性。执行后将逐步引导用户选择院区、科室类别、具体科室、医师、就诊日期、时段及具体时间,最后确认就诊卡信息。成功预约后将返回包含预约编号及提示信息的结构化结果。 2. 监控预约模块:可持续监测指定医师在设定日期范围内的可预约时段。一旦检测到空闲号源,将自动完成预约操作。该模块默认以10秒为间隔循环检测,成功预约后仍会持续运行直至手动终止。用户需注意在预约成功后及时完成费用支付以确认挂号。 程序运行时会显示相关技术支持信息,包括采用的验证码识别组件及训练数据来源。操作界面采用分步交互方式,通过输入序号完成各环节选择。所有网络请求均经过结构化处理,返回结果包含明确的状态码与执行耗时。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
<think>嗯,用户现在想了解自适应辛普森的实现方详解。根据用户提供的引用内容,我需要结合这些资料和之前的回答来组织思路。首先,用户之前的问题是关于解微分方程的,现在转向数值积分方,可能需要明确两者的不同,但重点在自适应辛普森的实现步骤。 首先,我需要回顾自适应辛普森的基本原理。根据引用[2],辛普森公式是用二次多项式近似函数,计算区间内的积分。自适应则是通过二分区间并递归计算,直到误差满足要求,如引用[1]提到的。用户提供的代码片段中有模板代码,可能需要解释这些代码的结构和逻辑。 接下来,用户需要详细的实现方,所以应该分步骤说明。比如,先介绍辛普森公式,然后解释自适应策略,递归终止条件,误差控制等。同时,结合引用中的代码示例,解释如何转化为实际代码。 还需要注意用户可能存在的疑问点,比如为什么选择二次多项式,误差估计的方,以及如何避免无限递归。此外,引用[3]中的代码是循环结构,而引用[1]提到的是递归方,需要说明这两种实现方式的区别和适用场景。 另外,用户之前的回答中涉及到微分方程的形式幂级数解,这里可能需要区分数值积分和符号计算的不同应用场景,强调自适应辛普森在无找到原函数时的优势,如引用[2]提到的。 需要确保回答结构清晰,步骤分明,可能包括算法步骤、代码解析、参数说明和实例演示。同时,用户提供的引用中有代码片段,需要正确解释这些代码的作用,比如引用[3]中的循环计算系数,引用[4]中的普通二次函数积分公式。 最后,生成的相关问题要围绕实现细节、误差控制、应用场景和优化方,确保覆盖用户可能进一步询问的方向。</think>### 自适应辛普森实现详解 自适应辛普森是一种通过动态调整区间划分精度来高效计算定积分的数值方,尤其适用于无解析求原函数的积分问题[^2]。其核心包含 **辛普森公式** 和 **自适应递归策略** 两部分。 --- #### **一、算法步骤** 1. **基础辛普森公式** 对区间 $[a, b]$,用抛物线近似函数曲线,积分公式为: $$ S(a,b) = \frac{b - a}{6} \left[ f(a) + 4f\left(\frac{a+b}{2}\right) + f(b) \right] $$ 该公式对二次多项式精确成立[^4]。 2. **误差估计与递归策略** - 计算整体区间积分值 $S_{\text{total}} = S(a, b)$ - 将区间二分,计算左右子区间积分和 $S_{\text{split}} = S(a, m) + S(m, b)$,其中 $m = \frac{a + b}{2}$ - 若满足精度条件:$|S_{\text{total}} - S_{\text{split}}| < \epsilon$,则接受当前结果 - 否则递归计算左右子区间,并将结果相加 3. **终止条件** 通常设定最小递归深度或最大允许误差 $\epsilon$,防止无限递归。 --- #### **二、代码实现(C++示例)** ```cpp #include <cmath> // 定义被积函数(示例函数,可替换) double f(double x) { return sin(x) / x; // 例如:无解析积分的函数 } // 自适应辛普森核心 double adaptive_simpson(double a, double b, double eps) { double m = (a + b) / 2; double S_total = (b - a) / 6 * (f(a) + 4*f(m) + f(b)); double S_left = (m - a) / 6 * (f(a) + 4*f((a + m)/2) + f(m)); double S_right = (b - m) / 6 * (f(m) + 4*f((m + b)/2) + f(b)); double S_split = S_left + S_right; if (fabs(S_total - S_split) <= 15 * eps) // 误差放大系数调整[^1] return S_split + (S_split - S_total) / 15; // Richardson外推提高精度 else return adaptive_simpson(a, m, eps/2) + adaptive_simpson(m, b, eps/2); } ``` --- #### **三、关键参数说明** | 参数 | 作用 | 典型取值 | |------|------|----------| | `eps` | 控制积分精度 | 1e-6 ~ 1e-10 | | 递归深度限制 | 防止栈溢出 | 20~30层 | | 误差放大系数 | 修正误差估计保守性 | 15(经验值) | --- #### **四、实例分析** 计算 $\int_0^1 \frac{\sin x}{x} dx$(在$x=0$处定义极限值为1): ```cpp int main() { double result = adaptive_simpson(1e-10, 1.0, 1e-6); printf("积分结果: %.8f\n", result); // 输出约0.94608307 return 0; } ``` --- #### **五、算法优化方向** 1. **递归深度控制** 添加最大递归层数限制,例如: ```cpp double adaptive_simpson(double a, double b, double eps, int depth) { if (depth > 30) return S_split; // 强制终止 // ...原有逻辑... } ``` 2. **向量化计算** 对分段区间并行计算(适用于GPU加速场景)。 3. **动态误差阈值** 根据函数曲率调整局部精度要求。 --- ### 相关问题 1. [如何选择自适应辛普森的初始误差阈值?](#) 2. [当积分区间存在奇点时如何处理?](#) 3. [自适应辛普森与龙贝格积分的优劣比较?](#) 4. [如何验证数值积分结果的可靠性?](#) [^1]: 递归误差分配策略源于数值稳定性分析 [^2]: 辛普森公式的几何解释与误差推导 [^3]: Richardson外推提升精度原理 [^4]: 二次多项式积分精确性证明
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值