算法基本原理:把原区间分为一系列小期间(n份),在每个小区间上都用小的梯形面积来近似代替原函数的积分,当小区间足够小时,就可以得到原来积分的近似值。但是这个过程中有一个问题是步长的取值,步长太大精度难以保证,步长太小会导致计算量的增加,所以,实际计算中常常采用变步长的方法,使得在步长逐次减小的过程中,求得的积分结果满足要求的精度为止。

首先,给出两个计算公式

(1)

 //计算步长为h的积分

(2)

 //将步长h二分,计算以h/2为步长的积分

步骤:

取n=1,利用公式(1)计算积分值

进行二分,利用新的公式(2)计算新的积分值

进行判断,如果两次计算积分值的差在给定的误差范围之内,二分后的积分值就是所需的结果,计算结束,否则返回第二步继续运行

因此,主要计算的问题有两个

一. 被积函数值的运算(设置Function类)

二. 变步长梯形积分的实现(设置Trapz类)

#ifndef _TRAPZINT_H_

#define _TRAPZINT_H_

class Function{

public:

virtual double operator()(double x) const = 0;//纯虚函数重载运算符()

virtual ~Function(){}//析构函数

};

class MyFunction :public Function{

public:

virtual double operator()(double x) const;//覆盖虚函数

};

class Integration{//抽象类Integration的定义

public:

virtual double operator()(double a, double b, double eps) const = 0;

virtual ~Integration(){}

};

class Trapz :public Integration{//公有派生类Trapz的定义

public:

Trapz(const Function &f) :f(f){}//构造函数

virtual double operator()(double a, double b, double eps) const;//覆盖虚函数

private:

const Function &f;//私有成员,Function类对象的指针

};

#endif

#include"Trapzint.h"

#include

#include

using namespace std;

//计算被积函数的函数值

double MyFunction::operator()(double x) const{

return log(1.0 + x) / (1.0 + x*x);

}

//积分运算过程,重载为运算符()

double Trapz::operator()(double a, double b, double eps) const{

//计算区间[a,b]之间误差在eps之内的积分值

bool done = false;//Trapz类的虚函数成员

int n = 1;

double h = b - a;

double tn = h*(f(a) + f(b)) / 2;//计算n=1时的积分

double t2n;//步长为一半的时候的积分值

do{

double sum = 0;

for (int k = 0; k < n; k++){

double x = a + (k + 0.5)*h;

sum += f(x);

}

t2n = (tn + h*sum) / 2.0;//利用公式(2)计算积分

if (fabs(tn - t2n) < eps)

done = true;//判断积分误差

else{

tn = t2n;

n *= 2;

h /= 2;

}

} while (!done);

return t2n;

}

#include"Trapzint.h"

#include

#include

using namespace std;

int main(){

MyFunction f;//定义MyFunction类的对象

Trapz trapz(f);//定义Trapz类的对象

//计算并输出结果

cout << "Trapz Int:" << setprecision(7) << trapz(0, 2, 1e-7) << endl;

return 0;

}

结果

定积分算法java_变步长梯形积分算法求解函数定积分相关推荐

  1. C语言经典迭代算法之求解函数定积分(详解)

    文章目录 一.迭代算法 二.梯形法求解定积分 一.迭代算法 1.辗转迭代 迭代法也称辗转法,它是一种不断用旧的变量值递推得到新值的过程.迭代法是用计算机解决问题的一种基本方法,它利用计算机运算速度快. ...

  2. 通俗易懂的布谷鸟算法与莱维飞行,(附求解函数最小值matlab源码)

    1 从布谷鸟的育雏到布谷鸟算法 2 布谷鸟算法 3 萊维飞行与公式(1)的深层含义 4 附:CS算法求解函数最小值代码 5 源码下载 6 参考文献 1 从布谷鸟的育雏到布谷鸟算法 布谷鸟不会做窝,也不 ...

  3. mahout 推荐算法 java_推荐系统之推荐算法实战:mahout推荐算法框架

    1.Mahout介绍 1.1概述 根据百度的解说,Mahout 是 Apache Software Foundation(ASF) 旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在 ...

  4. 粒子群算法java_基于粒子群算法求解求解TSP问题(JAVA)

    一.TSP问题 TSP问题(Travelling Salesman Problem)即旅行商问题,又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选 ...

  5. 莱维飞行matlab作图,通俗易懂的布谷鸟算法与莱维飞行,(附求解函数最小值matlab源码)-Go语言中文社区...

    1 从布谷鸟的育雏到布谷鸟算法 布谷鸟不会做窝,也不会育雏,在春末夏初,向北飞,趁别的鸟(宿主鸟)外出觅食时,将卵蛋产在宿主鸟窝里,让宿主鸟抚养自己孩子 .当然,布谷鸟在产卵前,为了不被宿主鸟发现鸟窝 ...

  6. hash的算法 java_【数据结构与算法】一致性Hash算法及Java实践

    追求极致才能突破极限 一.案例背景 1.1 系统简介 首先看一下系统架构,方便解释: 页面给用户展示的功能就是,可以查看任何一台机器的某些属性(以下简称系统信息). 消息流程是,页面发起请求查看指定机 ...

  7. graham算法 java_凸包Graham Scan算法实现

    凸包算法实现点集合中搜索凸包顶点的功能,可以处理共线情况,可以输出共线点也可以不输出而只输出凸包顶点.经典的Graham Scan算法,点排序使用极角排序方式,并对共线情况做特殊处理.一般算法是将共线 ...

  8. 图像融合算法java_图像融合 NSCT算法 matlab

    [实例简介] 经典图像融合算法, NSCT算法,为matlab 和 C 混合编译,修改图像地址即可方便使用 [实例截图] [核心代码] NSCT └── NSCT ├── atrousc.c ├── ...

  9. 汉诺塔算法 java_汉诺塔算法java实现详解

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public ...

最新文章

  1. 抽点时间让我们一起来学linux系统
  2. Difference Between HashMap and IdentityHashMap--转
  3. java 增量,Java增量运算符查询(++ i和i ++)
  4. 【汇编语言】王爽 - 内中断复习
  5. js实现treeview 级联修改状态
  6. crm2011创建批量删除作业
  7. 计算机专业计算机 等级怎样填,计算机水平一般怎么填
  8. 云鹊医怎么快速认证_兴趣认证怎么申请?掌握这9个小技巧,快速通过
  9. 面向对象,局部变量和成员变量
  10. 好用的文本编辑器推荐
  11. C++常用的图像像素值读写的方法
  12. 详细“企业库”编写流程
  13. dns域名解析原理及过程
  14. Google Colaboratory:一款用于深度学习的免费GPU使用方法
  15. python自学视频下载_Python下载哔哩哔哩学习视频
  16. 2017知乎看山杯总结(多标签文本分类)
  17. 公有云Docker镜像P2P加速之路:安全篇
  18. 什么是TorchScript
  19. 如何清除/删除最近的文档历史记录?
  20. 【Python 爬虫教程】代理ip网站有哪些?

热门文章

  1. 错过校招_您可能错过的Web优化技巧
  2. 我五年来都没来过 我的意志力飞涨。
  3. The meta-data is invalid or is corrupt
  4. Python copy模块浅拷贝和深拷贝
  5. django自带调试服务器的使用
  6. Visual Studio 2010 实用功能总结图解
  7. C#异步通信概念及应用浅析 .
  8. 漫步最优化十五——凸函数优化
  9. Imdb影评的数据集介绍与下载
  10. 2020年需要牢记的10个深度学习Best Practices