Simpson(辛普森)公式和梯形公式是求数值积分中很重要的两个公式,可以帮助我们使用计算机求解数值积分,而在使用过程中也有多种方式,比如复合公式和变步长公式。这里分别给出其简单实现(C++版):

1、复合公式:

 #include<iostream>
#include<iomanip>
#include <cmath>
using namespace std; double Simpson(double a,double b,double n);
double Compound_Trapezoid(double a,double b,double n); int main()
{
int n;
double a, b;
cout << "区间数n:";
cin >> n;
cout << "区间端点a:";
cin >> a;
cout<<"区间端点b:";
cin >> b;
cout<<setprecision()<<Simpson(a,b,n)<<endl;
cout<<setprecision()<<Compound_Trapezoid(a,b,n)<<endl;
getchar();
getchar();
return ;
} /*
* Simpson算法
*/
double Simpson(double a,double b,double n)
{
double h=(b-a)/n;
double Sn=exp(a)-exp(b);
for (double x=a+h;x<=b;x+=h)
{
Sn+=*exp(x-h/)+*exp(x);
}
Sn *= h/;
return Sn;
} /*
* 复合梯形算法
*/
double Compound_Trapezoid(double a,double b,double n)
{
double h=(b-a)/n;
double Sn=exp(a)+exp(b);
for(double x=a+h;x<b;x+=h)
{
Sn += * exp(x);
}
Sn *= h/;
return Sn;
}

2、变步长公式

 /*
* e^x,1/x求1到3的积分
* 精确到1E-5
*/
#include<iostream>
#include<iomanip>
#include<cmath> using namespace std; //变步长梯形法
double ex_Variable_step_size_trape(double ,double ,double);
double x_Variable_step_size_trape(double ,double ,double);
//变步长Simpson法
double ex_Variable_step_size_Simpson(double ,double ,double);
double x_Variable_step_size_Simpson(double ,double ,double);
//Romberg法
//double Romberg(); int main()
{
//左端点a,右端点b,允许误差E
double a,b,E;
cout << "请输入左端点a:";
cin >> a;
cout << "请输右端点b:";
cin >> b;
cout << "请输入允许误差E:";
cin >> E;
cout << "变步长梯形(e^x):" << setiosflags(ios::fixed) << setprecision() << ex_Variable_step_size_trape(a,b,E) << endl;
cout << "变步长Simpson(e^x):" << setiosflags(ios::fixed) << setprecision() << ex_Variable_step_size_Simpson(a,b,E) << endl;
cout << "变步长梯形(1/x):" << setiosflags(ios::fixed) << setprecision() << x_Variable_step_size_trape(a,b,E) << endl;
cout << "变步长Simpson(1/x):" << setiosflags(ios::fixed) << setprecision() << x_Variable_step_size_Simpson(a,b,E) << endl;
getchar();
getchar();
return ;
} double ex_Variable_step_size_trape(double a,double b,double E)
{
double h = b - a, e = ,T2 = ;
double T1 = h/ * (exp(a) + exp(b));
do
{
double S = , x = a + h/;
do
{
S += exp(x);
x += h;
}while(x < b);
T2 = T1/ + h/ * S;
e = (T2 > T1)?(T2 - T1):(T1 - T2);
h = h/;
T1 = T2;
}while(e > E);
return T2;
} double x_Variable_step_size_trape(double a,double b,double E)
{
double h = b - a, e = ,T2 = ;
double T1 = h/ * (/a + /b);
do
{
double S = , x = a + h/;
do
{
S += /x;
x += h;
}while(x < b);
T2 = T1/ + h/ * S;
e = (T2 > T1)?(T2 - T1):(T1 - T2);
h = h/;
T1 = T2;
}while(e > E);
return T2;
} double ex_Variable_step_size_Simpson(double a,double b,double E)
{
double h = b - a, e = ,T2 = ;
double T1 = h/ * (exp(a) - exp(b));
do
{
double S = , x = a + h/;
do
{
S += * exp(x);
x += h/;
S += * exp(x);
x += h/;
}while(x <= b);
T2 = T1/ + h/ * S;
e = (T2 > T1)?(T2 - T1):(T1 - T2);
h = h/;
T1 = T2;
}while(e > E);
return T2;
} double x_Variable_step_size_Simpson(double a,double b,double E)
{
double h = b - a, e = ,T2 = ;
double T1 = h/ * (/a - /b);
do
{
double S = , x = a + h/;
do
{
S += * /x;
x += h/;
S += * /x;
x += h/;
}while(x <= b);
T2 = T1/ + h/ * S;
e = (T2 > T1)?(T2 - T1):(T1 - T2);
h = h/;
T1 = T2;
}while(e > E);
return T2;
}

作者:耑新新,发布于  博客园

转载请注明出处,欢迎邮件交流:zhuanxinxin@aliyun.com

数值积分之Simpson公式与梯形公式的更多相关文章

  1. simpson公式求定积分(模板)

    #include<cstdio> #include<cmath> #include <algorithm> using namespace std; double ...

  2. csu 1806 & csu 1742 (simpson公式+最短路)

    1806: Toll Time Limit: 5 Sec  Memory Limit: 128 MB  Special JudgeSubmit: 256  Solved: 74[Submit][Sta ...

  3. 复合梯形公式与Simpson公式的数值积分

    #include <iostream>#include<math.h>#include<stdio.h>using namespace std; float f(f ...

  4. HDOJ 5666//快速积,推公式

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5666 题意:给一条直线x+y=q,在(0,0)往x+y=q上面的整数点连线,x+y=q与x,y轴截成的三角 ...

  5. Simpson公式的应用(HDU 1724/ HDU 1071)

    辛普森积分法 - 维基百科,自由的百科全书 Simpson's rule - Wikipedia, the free encyclopedia 利用这个公式,用二分的方法来计算积分. 1071 ( T ...

  6. 自适应Simpson公式

    参考刘汝佳<算法指南>P163 #include<cstdio> #include<cmath> double a; double F(double x){ +*a ...

  7. C语言 · 积分之迷

    标题:积分之迷 小明开了个网上商店,卖风铃.共有3个品牌:A,B,C. 为了促销,每件商品都会返固定的积分. 小明开业第一天收到了三笔订单: 第一笔:3个A + 7个B + 1个C,共返积分:315 ...

  8. 复合梯形公式、复合辛普森公式 matlab

    1. 用1阶至4阶Newton-Cotes公式计算积分 程序: function I = NewtonCotes(f,a,b,type) % syms t; t=findsym(sym(f)); I= ...

  9. 数值积分:基于牛顿-柯茨公式的定步长和自适应积分方法 [MATLAB]

    #先上代码后补笔记# #可以直接复制粘贴使用的MATLAB函数!# 1. 定步长牛顿-柯茨积分公式 function [ integration ] = CompoInt( func, left, r ...

随机推荐

  1. KVM 初探

    KVM 是业界最为流行的 Hypervisor,全称是 Kernel-based Virtual Machine.它是作为 Linux kernel 中的一个内核模块而存在,模块名为 kvm.ko,也 ...

  2. UVA 10891 Game of Sum

    题目大意就是有一个整数串,有两个人轮流取,每次可以取走一个前缀或后缀.两人都足够聪明,且都会使自己收益最大.求取完后先手比后手多多少. 每次我看见上面那句就会深感自己的愚笨无知. 所以来推推性质? 1 ...

  3. elasticsearch 源码本地环境搭建

    elasticsearch6.0.0 源码本地环境搭建步骤如下: 1.资源准备 ElasicSearch版本:6.0.0: https://github.com/elastic/elasticsear ...

  4. gitlab 本地 定时备份

    =============================================== 20171015_第1次修改                       ccb_warlock === ...

  5. 妙味课堂:JavaScript初级--第12课:json与数组

    1.json数据格式及json语法 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...

  6. python科学计算_numpy_广播与下标

    多维数组下标 多维数组的下标是用元组来实现每一个维度的,如果元组的长度比维度大则会出错,如果小,则默认元组后面补 : 表示全部访问: 如果一个下标不是元组,则先转换为元组,在转换过程中,列表和数组的转 ...

  7. React日常填坑手册(持续更新)

    1.react中自己定义的组件第一个字母一定要大写,如<app />会不显示,<App />才能正常显示. 2.在react中点击事件里面setState时会使this重新定义 ...

  8. Effective Java 第三版——16.在公共类中使用访问方法而不是公共属性

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  9. 《Python cookbook》 “定义一个属性可由用户修改的装饰器” 笔记

    看<Python cookbook>的时候,第9.5部分,"定义一个属性可由用户修改的装饰器",有个装饰器理解起来花了一些时间,做个笔记免得二刷这本书的时候忘了 完整代 ...

  10. Python2和Python3中的字符串编码问题解决

    Python2和Python3在字符串编码上是有明显的区别. 在Python2中,字符串无法完全地支持国际字符集和Unicode编码.为了解决这种限制,Python2对Unicode数据使用了单独的字 ...