数值积分之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 ...
随机推荐
- 每周.NET前沿技术文章摘要(2017-06-21)
汇总国外.NET社区相关文章,覆盖.NET ,ASP.NET等内容: .NET .NET Core Magic: Develop on one OS, run on another 链接:https: ...
- KD树小结
很久之前我就想过怎么快速在二维平面上查找一个区域的信息,思考许久无果,只能想到几种优秀一点的暴力. Kd树就是干上面那件事的. 别的不多说,赶紧把自己的理解写下来,免得凉了. KD树的组成 以维护k维 ...
- 【简单理解】gulp和webpack的区别
Gulp和Webpack的基本区别: gulp可以进行js,html,css,img的压缩打包,是自动化构建工具,可以将多个js文件或是css压缩成一个文件,并且可以压缩为一行,以此来减少文件体积,加 ...
- Android 内存暴减的秘密?!
作者:杨超,腾讯移动客户端开发 工程师 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. WeTest 导读 在我这样减少了26.5M Java内存! 一文中内存优化一期已经告一段落, ...
- Linux设置PHP环境变量
区分 环境变量从时间上可分为临时性和永久性,这里只说明永久性的设置 操作 PHP 安装目录 找到PHP的安装目录:我这里是/phpstudy/server/php 其bin目录为:/phpstudy/ ...
- 利用USearch去除嵌合体(chimeras)
嵌合体序列指在pcr过程中,两条不同的序列产生杂交扩增的序列,属于人工污染,在ITS和16S分析中,应该首先去除,USearch提供去除嵌合体的功能 usearch -uchime_ref reads ...
- Url Rewrite 再说Url 重写
前几天看到园子里一篇关于 Url 重写的文章<获取ISAPI_Rewrite重写后的URL>, URL-Rewrite 这项技术早已不是一项新技术了,这个话题也已经被很多人讨论过多次.搜索 ...
- Django资源
官网地址:https://www.djangoproject.com/ 最新发布版本是:1.11.7 官网提供不同版本的文档:1.7.1.8.1.9.1.10.1.11.2.0.dev 安装不同的版本 ...
- Python之旅本地环境搭建
刚开始学习Python, 之后将会把Python相关的一些学习在此记录下来 . 毋庸置疑 ,我们需要先搭建本地开发环境, 为之后的Python开发做准备 ,这篇文章 ,将环境的搭建记录下来 第一步: ...
- 第四章:Python基础の快速认识內置函数和操作实战
本課主題 內置函数介紹和操作实战 装饰器介紹和操作实战 本周作业 內置函数介紹和操作实战 返回Boolean值的內置函数 all( ): 接受一個可以被迭代的對象,如果函数裡所有為真,才會真:有一個是 ...