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. bzoj 1855: [Scoi2010]股票交易

    Description 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股票的走势,第i天的股票买入价 ...

  2. iOS XIB等比例适配

    选择两个视图使其等宽高,再去约束里面就可以设置乘数因子. 简单的一个例子: 要求:设置白色视图的宽度为蓝色视图的一半 1.点击白色视图连线到父视图,选择 Equal Widths     2.选择右边 ...

  3. useradd 命令详解

    useradd 作用: 用于Linux中创建的新的系统用户, useradd 可用来建立用户账号, 账号建好之后,再用passwd 设定账号的密码, 可用userdel 删除账号. 使用useradd ...

  4. Linux第五节随笔 /file / vim / suid /sgid sbit

    三期第四讲1.查询文件类型与文件位置命令 file 作用:查看文件类型(linux下的文件类型不以后缀名区分) 语法举例: [root@web01 ~]# file passwd passwd: AS ...

  5. Talk 3: Rob Pike on Upspin (Gopherfest 2017)

    Talk 3: Rob Pike on Upspin Upspin is an experimental project to build a framework for naming and sha ...

  6. VS 2017 Web项目需要安装Sql Server 2012 Express LocalDB问题

    最近在做mvc5的练习 ,结果到了数据库连接这一阶段就出现了问题,开始我以为<add name="MovieDBContext" connectionString=" ...

  7. Debian安装fail2ban来防止扫描

    vps的root密码不要设置的太简单,这样很容易被攻破,你可以安装如下软件来降低vps被攻破的机会. 输入如下命令: apt-get install fail2ban 提示如下表示安装完成: root ...

  8. Benchmark Test On Android Devices

    一.Android设备上的Benckmark测试概述 同PC相比,在Android设备上的性能测试还没有一个公认的标准.也没有PC上那么多的测试程序集.但我们可以通过一些工具所得到的信息更好的了解设备 ...

  9. 配置apache的文件访问路径

    本例中,我们让apache访问"F:/testObject/php"路径: 一.修改http.conf文件配置 访问路径:"apache/conf/httpd.conf& ...

  10. Python 数据科学系列 の Numpy、Series 和 DataFrame介绍

    本課主題 Numpy 的介绍和操作实战 Series 的介绍和操作实战 DataFrame 的介绍和操作实战 Numpy 的介绍和操作实战 numpy 是 Python 在数据计算领域里很常用的模块 ...