自适应辛普森公式求积分
2015-05-17 22:46
190 查看
自适应辛普森公式求积分
假设我们求以下积分:∫baf(x)dx
比较特殊的情况,就是可以推导出来最后的形式。但是比较一般的情况是,我们只能大致得到一个XY坐标系里的曲线,我们求的就是曲线和X轴所围成的面积。
因此我们有自适应辛普森公式,他会根据实际情况来自动的调整精度。
它的大致过程就是,给定一个要求达到的精度eps,算法就会根据实际情况递归的划分区间。容易近似的地方少划分,不容易近似的地方多划分几份。
具体来讲,我们在以下情况下直接返回结果,否则递归划分区间:
|S(a,c)+S(c,b)−S(a,b)|<15∗eps
代码如下:
@Frosero #include <cstdio> #include <iostream> #include <cmath> #include <algorithm> using namespace std; double F(double x){ //这里自定义函数 return x * x + x; } double simpson(double a,double b){ //返回区间[a,b]的三点辛普森值 double c = a + (b - a) / 2.0; return (F(a) + 4 * F(c) + F(b)) * (b - a) / 6.0; } double asr(double a,double b,double eps,double A){ //自适应辛普森递归过程 double c = a + (b - a) / 2.0; //A为区间[a,b]的三点辛普森值 double L = simpson(a,c), R = simpson(c,b); if(fabs(L + R - A) <= 15 * eps) return L + R + (L + R - A) / 15.0; return asr(a,c,eps/2.0,L) + asr(c,b,eps/2.0,R); } double asr(double a,double b,double eps){ //自适应辛普森主过程 return asr(a,b,eps,simpson(a,b)); } int main(){ cout<<asr(0,1,0.000001)<<endl; //测试 cout<<5.0/6<<endl; //对比 return 0; }
它的证明比较复杂,本着为广大读者减小压力的目标,我就不在这里啰嗦啦! (其实我也不会)
相关文章推荐
- 数值积分 (辛普森公式 辛普森自适应法则) UVA
- 自适应辛普森公式求积分模板
- 自适应Simpson积分(近似求积分)
- LA 3485 (积分 辛普森自适应法) Bridge
- 自适应辛普森(近似求积分模板)
- 学习笔记: 自适应Simpson积分
- hdu 1724 Ellipse (自适应辛普森求积分 模板题)
- SPOJ CIRU 圆的面积并 自适应辛普森积分
- BZOJ 1502 NOI 2005 月下柠檬树 计算几何 自适应辛普森积分
- 2017杭电ACM集训队单人排位赛 - 2 -1002 地狱飞龙 (辛普森公式求积分)(模板)
- UVALive - 3485 Bridge 二分+数学+自适应辛普森求积分
- 【自适应辛普森积分】hdu1724 Ellipse
- 自适应Simpson积分
- 数值积分-自适应辛普森法
- UVALive-3485 Bridge(二分答案+自适应辛普森积分)
- hdu 1724 辛普森公式求积分
- La3485 利用自适应辛普森公式 求积分的和
- LA 3485 自适应辛普森公式
- 【BZOJ 2178】圆的面积并 自适应辛普森公式
- [算法][求积分][复合辛普森公式]