定积分算法java_变步长梯形积分算法求解函数定积分
算法基本原理:把原区间分为一系列小期间(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_变步长梯形积分算法求解函数定积分相关推荐
- C语言经典迭代算法之求解函数定积分(详解)
文章目录 一.迭代算法 二.梯形法求解定积分 一.迭代算法 1.辗转迭代 迭代法也称辗转法,它是一种不断用旧的变量值递推得到新值的过程.迭代法是用计算机解决问题的一种基本方法,它利用计算机运算速度快. ...
- 通俗易懂的布谷鸟算法与莱维飞行,(附求解函数最小值matlab源码)
1 从布谷鸟的育雏到布谷鸟算法 2 布谷鸟算法 3 萊维飞行与公式(1)的深层含义 4 附:CS算法求解函数最小值代码 5 源码下载 6 参考文献 1 从布谷鸟的育雏到布谷鸟算法 布谷鸟不会做窝,也不 ...
- mahout 推荐算法 java_推荐系统之推荐算法实战:mahout推荐算法框架
1.Mahout介绍 1.1概述 根据百度的解说,Mahout 是 Apache Software Foundation(ASF) 旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在 ...
- 粒子群算法java_基于粒子群算法求解求解TSP问题(JAVA)
一.TSP问题 TSP问题(Travelling Salesman Problem)即旅行商问题,又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选 ...
- 莱维飞行matlab作图,通俗易懂的布谷鸟算法与莱维飞行,(附求解函数最小值matlab源码)-Go语言中文社区...
1 从布谷鸟的育雏到布谷鸟算法 布谷鸟不会做窝,也不会育雏,在春末夏初,向北飞,趁别的鸟(宿主鸟)外出觅食时,将卵蛋产在宿主鸟窝里,让宿主鸟抚养自己孩子 .当然,布谷鸟在产卵前,为了不被宿主鸟发现鸟窝 ...
- hash的算法 java_【数据结构与算法】一致性Hash算法及Java实践
追求极致才能突破极限 一.案例背景 1.1 系统简介 首先看一下系统架构,方便解释: 页面给用户展示的功能就是,可以查看任何一台机器的某些属性(以下简称系统信息). 消息流程是,页面发起请求查看指定机 ...
- graham算法 java_凸包Graham Scan算法实现
凸包算法实现点集合中搜索凸包顶点的功能,可以处理共线情况,可以输出共线点也可以不输出而只输出凸包顶点.经典的Graham Scan算法,点排序使用极角排序方式,并对共线情况做特殊处理.一般算法是将共线 ...
- 图像融合算法java_图像融合 NSCT算法 matlab
[实例简介] 经典图像融合算法, NSCT算法,为matlab 和 C 混合编译,修改图像地址即可方便使用 [实例截图] [核心代码] NSCT └── NSCT ├── atrousc.c ├── ...
- 汉诺塔算法 java_汉诺塔算法java实现详解
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public ...
最新文章
- 抽点时间让我们一起来学linux系统
- Difference Between HashMap and IdentityHashMap--转
- java 增量,Java增量运算符查询(++ i和i ++)
- 【汇编语言】王爽 - 内中断复习
- js实现treeview 级联修改状态
- crm2011创建批量删除作业
- 计算机专业计算机 等级怎样填,计算机水平一般怎么填
- 云鹊医怎么快速认证_兴趣认证怎么申请?掌握这9个小技巧,快速通过
- 面向对象,局部变量和成员变量
- 好用的文本编辑器推荐
- C++常用的图像像素值读写的方法
- 详细“企业库”编写流程
- dns域名解析原理及过程
- Google Colaboratory:一款用于深度学习的免费GPU使用方法
- python自学视频下载_Python下载哔哩哔哩学习视频
- 2017知乎看山杯总结(多标签文本分类)
- 公有云Docker镜像P2P加速之路:安全篇
- 什么是TorchScript
- 如何清除/删除最近的文档历史记录?
- 【Python 爬虫教程】代理ip网站有哪些?