数值积分之Simpson公式与梯形公式
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公式与梯形公式的更多相关文章
- simpson公式求定积分(模板)
#include<cstdio> #include<cmath> #include <algorithm> using namespace std; double ...
- csu 1806 & csu 1742 (simpson公式+最短路)
1806: Toll Time Limit: 5 Sec Memory Limit: 128 MB Special JudgeSubmit: 256 Solved: 74[Submit][Sta ...
- 复合梯形公式与Simpson公式的数值积分
#include <iostream>#include<math.h>#include<stdio.h>using namespace std; float f(f ...
- HDOJ 5666//快速积,推公式
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5666 题意:给一条直线x+y=q,在(0,0)往x+y=q上面的整数点连线,x+y=q与x,y轴截成的三角 ...
- Simpson公式的应用(HDU 1724/ HDU 1071)
辛普森积分法 - 维基百科,自由的百科全书 Simpson's rule - Wikipedia, the free encyclopedia 利用这个公式,用二分的方法来计算积分. 1071 ( T ...
- 自适应Simpson公式
参考刘汝佳<算法指南>P163 #include<cstdio> #include<cmath> double a; double F(double x){ +*a ...
- C语言 · 积分之迷
标题:积分之迷 小明开了个网上商店,卖风铃.共有3个品牌:A,B,C. 为了促销,每件商品都会返固定的积分. 小明开业第一天收到了三笔订单: 第一笔:3个A + 7个B + 1个C,共返积分:315 ...
- 复合梯形公式、复合辛普森公式 matlab
1. 用1阶至4阶Newton-Cotes公式计算积分 程序: function I = NewtonCotes(f,a,b,type) % syms t; t=findsym(sym(f)); I= ...
- 数值积分:基于牛顿-柯茨公式的定步长和自适应积分方法 [MATLAB]
#先上代码后补笔记# #可以直接复制粘贴使用的MATLAB函数!# 1. 定步长牛顿-柯茨积分公式 function [ integration ] = CompoInt( func, left, r ...
随机推荐
- 669. Trim a Binary Search Tree
Given a binary search tree and the lowest and highest boundaries as `L`and `R`, trim the tree so t ...
- Cat 客户端如何构建调用链消息树
场景 & 代码 Inner0 中的某方法调用了 Inner1,代码 Inner1的代码很简单, Cat通过一个线程本地变量来保存调用链的相关信息,其中核心的数据结构是消息树和操作栈.消息树用来 ...
- HTML5学习知识点
一.文档问题 1.html5新标签:section.header.footer.nav.aside.blockquote.q.fieldest.figure.address.article.detai ...
- HTTPS加密流程超详解(二)
2.进入正题 上篇文章介绍了如何简单搭建一个环境帮助我们分析,今天我们就进入正题,开始在这个环境下分析. 我们使用IE浏览器访问Web服务器根目录的test.txt文件并抓包,可以抓到如下6个包(前面 ...
- 本机向windows服务器传输文件的三种方法
闲来无事,在腾讯云上申请了一个免费的服务器,想将自己写的网页发布到服务器上,服务器的申请很简单,百度搜索 腾讯云 ,然后新人第一次注册能申请到免费一个月的云主机,虽然配置不怎么高,但是还是能用的,这是 ...
- 关于java字节流的read()方法返回值为int的思考
我们都知道java中io操作分为字节流和字符流,对于字节流,顾名思义是按字节的方式读取数据,所以我们常用字节流来读取二进制流(如图片,音乐 等文件).问题是为什么字节流中定义的read()方法返回值为 ...
- Asp.net MVC在Razor中输出Html的两种方式
http://qubernet.blog.163.com/blog/static/177947284201485104616368/ Razor中所有的Html都会自动编码,这样就不需要我们手动去编码 ...
- spring项目读取配置文件
Spring项目在运用中读取配置文件有两种方式: 通过项目的配置文件读取 在spring-context.xml里面加入以下代码 在运用到的类里面加入 @Value("#{configPro ...
- GIT命令一页纸
,配置用户名和邮箱 $ git config --global user.name "Your Name" $ git config --global user.email &qu ...
- 关于 Python 入门的一些问题?
一.用 python 能够做什么?解决什么问题? A1:理论上来说,计算机能做什么,python 语言就能让它做什么,也即 python能做什么. 数值计算.机器学习.爬虫.云相关开发.自动化测试.运 ...