123全年历史图库
大学生考试网 让学习变简单
赞助商链接
当前位置:123全年历史图库 >> 理学 >>

自适应Simpson积分算法(MATLAB及C++实现代码)

自适应Simpson积分算法(MATLAB及C++实现代码)

123全年历史图库 www.dailymaz.com
自适应 Simpson 积分算法(MATLAB 及 C++实现代码) (计算数学课用) 在 CSDN 论坛中找到了却要金币,无奈之下自己写了一份。 对于类似问题,改一下积分函数和区间即可。 针对问题:数学上已经证明了
1 0

4 = 1 + 2

成立,所以可以通过数值积分来求π的近似值。 试利用自适应 Simpson 算法计算积分近似值。 C++版:(直接复制粘贴在 VC++6.0 即可运行) /*用自适应 Simpson 积分方法计算积分值*/ #include<iostream> #include<cmath> int n=0; //设置全局变量 n,用来记录最高迭代次数,避免递归一直进行下去。 double pi=3.141592653589793238462643 ; //设置近似精确值,用以比较 double e1=0.00001 ; //设置误差容限为 10^-5 double f(double); //要积分的函数 double Simpson (double,double,double,double); // 迭代函数 using namespace std; //主函数 int main() { double a=0,b=1,t,h,S;//积分区间

h=(b-a)/2; S=h/3*(f(a)+f(b)+4*f((a+b)/2)); //第一次 Simpson 公式积分值 t=Simpson(a,b,e1,S); cout<<"积分值为:"<<t<<endl; cout<<"最大迭代次数为:"<<n<<endl; cout<<"设置误差容限为"<<e1<<"\n 误差为:"<<pi-t<<endl; return 0; }

//子函数 1(积分函数) double f(double x)

{return 4/(1+x*x);}

//子函数 2(迭代函数) double Simpson (double A,double B,double e,double S) {double h,S1,S2; h=(B-A)/2; n++; //统计迭代次数 if(n>500) {cout<<"方法有误,跳出递归"<<endl; return 0;}

S1=h/6*(f(A)+f(A+h)+4*f(A+h/2)); S2=h/6*(f(A+h)+f(B)+4*f(A+3/2*h)); if(fabs(S-S1-S2)<15*e) return S1+S2; 对应区间上的函数的近似值 else }

// 在[A,(A+B)/2] 区间上计算 Simpson 积分值 // 在[(A+B)/2,B] 区间上计算 Simpson 积分值 //如果满足误差容限要求,就以 S1+S2 作为此时

return Simpson(A,(A+B)/2,e/2,S1)+Simpson((A+B)/2,B,e/2,S2); //递归调用

MATLAB 版: (两个函数文件加一个脚本文件) 1.编写积分函数文件: function y =f(x) y=4./(1+x.^2); end

2.编写Simpson迭代函数文件 function y = Simpson( A,B,e,S ) h=(B-A)/2; S1=h/6*(f(A)+f(A+h/2)+4*f(A+h/2)); S2=h/6*(f(A+h)+4*af(A+3/2*h)+f(B)); if abs(S-S1-S2)<10*e y= S1+S2;

else y=Simpson(A,(A+B)/2,e/2,S1)+Simpson((A+B)/2,B,e/2,S2);

end

end 3.编写脚本调用文件 tic clear; a=0; b=1; e=0.0000001; h=(b-a)/2; S=h/3*(f(a)+f(b)+4*f(1/2*(a+b))); t=Simpson(a,b,e,S) abs(pi-t) e toc %返回所用时间 %第一次Simpson积分值 %积分区间 %误差容限

%最终自适应方法积分值 %实际误差 %设置的误差容限

亲测可用。 这两个代码本质上是一样的。 我先用 C++语言写好, 然后又换用成 MATLAB 语言。 MATLAB 好像可以把误差容限调到 10^-7 以下, 而 C++ 则只能到 10^-5 左右。 原因不甚了解, 猜测可能是由于 C++计算时字节长度不够,导致精度不够,要递归调用很多次才能达到所需 精度。



推荐相关:
123全年历史图库 | 123全年历史图库
All rights reserved Powered by 123全年历史图库 www.dailymaz.com
文档资料库内容来自网络,如有侵犯请联系客服。zhit325@qq.com