#include"integral.h"

double integral::definiteIntegral(double(*f)(double), double a, double b, double step)

//函数功能:计算函数在[a,b]的定积分

//参数1:函数指针;参数2:积分上限;参数3:积分下限;参数4:步长(默认0.01)

{

double S = 0;

double value1 = (*f)(a);

double value2;

double trapezoidalArea;

for (double i = a; i < b; i = i + step)

{

value2 = (*f)(i + step);

trapezoidalArea = (value1 + value2)*step / 2;

value1 = value2;

S = S + trapezoidalArea;

}

return S;

}

示例:Visual Stuido Community 2017

//#include

//#include"integral.h"

//

//double fexp(double x);

//

//using namespace std;

//

//int main()

//{

// integral caculute;

// double(*f)(double x);

// p = fexp;

// double sum = caculute.definiteIntegral(p, 0, 1, 0.001);

// cout << sum << endl;

//

// system("pause");

// return 0;

//}

//

exp(x)函数

//double fexp(double x)

//{

// return exp(x);

//}

//************************************************************************************************************************************

//************************************************************************************************************************************

double integral::infiniteIntegral(double(*f)(double), double a, double step, int N, double precision, int type)

//函数功能:计算函数的无穷积分

//原理:设定一个初始积分下限,不断的增加下限(每次增加N),直到和上一次的积分之差满足设定的精度

//参数1:函数指针;参数2:积分上限;参数3:步长(默认0.01);参数4:积分下限每次增加的值(默认100);参数5:精度(默认0.001),

//参数6:“1”:计算函数在[a,infinite)的无穷积分,“2”:计算函数在(infinite,a]的无穷积分。(默认为“1”)

{

if (type == 1)

{

//计算函数在[a,infinity)的无穷积分

//计算第一块的面积

double S1 = 0;

double value1 = (*f)(a); //梯形的上底

double value11; //梯形的下底

double trapezoidalArea1;

for (double i = a; i < a + N; i = i + step)

{

value11 = (*f)(i + step);

trapezoidalArea1 = (value1 + value11)*step / 2; //梯形的面积

value1 = value11;

S1 = S1 + trapezoidalArea1;

}

//增加一块,并计算面积和

double S2 = S1;

a = a + N;

double value2 = (*f)(a);

double value22;

double trapezoidalArea2;

for (double i = a; i < a + N; i = i + step)

{

value22 = (*f)(i + step);

trapezoidalArea2 = (value2 + value22)*step / 2;

value2 = value22;

S2 = S2 + trapezoidalArea2;

}

while (S2 - S1>precision) //判断增加一块后的面积和不增加之前的面积差是否小于所要求的精度值

{

S1 = S2;

a = a + N;

double value3 = (*f)(a);

double value33;

double trapezoidalArea3;

for (double i = a; i < a + N; i = i + step)

{

value33 = (*f)(i + step);

trapezoidalArea3 = (value3 + value33)*step / 2;

value3 = value33;

S2 = S2 + trapezoidalArea3;

}

}

return S1;

}

else

{

if (type == 2)

{

//计算函数在(infinity,a]的无穷积分

//计算第一块的面积

double S1 = 0;

double value1 = (*f)(a); //梯形的上底

double value11; //梯形的下底

double trapezoidalArea1;

for (double i = a; i > a - N; i = i - step)

{

value11 = (*f)(i - step);

trapezoidalArea1 = (value1 + value11)*step / 2; //梯形的面积

value1 = value11;

S1 = S1 + trapezoidalArea1;

}

return S1;

//增加一块,并计算面积和

double S2 = S1;

a = a - N;

double value2 = (*f)(a);

double value22;

double trapezoidalArea2;

for (double i = a; i > a - N; i = i - step)

{

value22 = (*f)(i - step);

trapezoidalArea2 = (value2 + value22)*step / 2;

value2 = value22;

S2 = S2 + trapezoidalArea2;

}

while (S2 - S1>precision) //判断增加一块后的面积和不增加之前的面积差是否小于所要求的精度值

{

S1 = S2;

a = a - N;

double value3 = (*f)(a);

double value33;

double trapezoidalArea3;

for (double i = a; i > a - N; i = i - step)

{

value33 = (*f)(i - step);

trapezoidalArea3 = (value3 + value33)*step / 2;

value3 = value33;

S2 = S2 + trapezoidalArea3;

}

}

return S1;

}

else

{

cout << "最后一个输入参数有误:" << endl;

cout << "输入“1”:计算函数在[a,infinite)的无穷积分;" << endl;

cout << "输入“2”:计算函数在(infinite,a]的无穷积分;" << endl;

return 0.0;

}

}

}

示例:Visual Stuido Community 2017

//#include

//#include"integral.h"

//

//double fexp(double x);

//double ffexp(double x);

//

//using namespace std;

//

//int main()

//{

// integral caculute;

// double(*f)(double x);

// p = fexp;

// double sum1 = caculute.infiniteIntegral(p, 0, 0.001, 1000, 0.01, 2);

// p = ffexp;

// double sum2 = caculute.infiniteIntegral(p, 0, 0.001, 1000, 0.01, 1);

// cout << sum1 << endl;

// cout << sum2 << endl;

//

// system("pause");

// return 0;

//}

//

exp(x)函数

//double fexp(double x)

//{

// return exp(x);

//}

//

exp(-x)函数

//double ffexp(double x)

//{

// return exp(-x);

//}

//************************************************************************************************************************************

//************************************************************************************************************************************

typename integral::info integral::monteCarloDefiniteIntegral(double(*f)(double), double a, double b, double precision)

//函数功能:蒙特卡洛积分法,计算函数的定积分;相对常规梯形积分法,计算较慢

//参数1:函数指针;参数2:积分上限;参数3:积分下限;参数4:精度(默认0.01)

{

double S, S1, S2, u, x, error; //S是积分值;S1和S2用来误差估计

int N = int(floor(abs(b - a) / 0.1));

while (1)

{

S1 = 0.0;

S2 = 0.0;

srand((unsigned)time(NULL)); //初始化种子时间为系统时间

for (int i = 0; i < N; i++)

{

u = 1.0*rand() / (RAND_MAX + 1); //产生0.0~1.1之间的随机数

x = a + (b - a)*u;

S1 = S1 + (*f)(x);

S2 = S2 + (*f)(x)*(*f)(x);

}

S = S1 * (b - a) / N; //函数积分值

S1 = S1 / N;

S2 = S2 / N;

error = (b - a)*sqrt((S2 - S1 * S1) / N); //误差估计

if (error > precision)

{

N = N + N;

continue;

}

else

{

break;

}

}

//返回积分值和误差

info info1;

info1.value = S;

info1.error = error;

return info1;

}

示例:Visual Studio Community 2017

蒙特卡洛积分法和常规梯形积分法对比

//#include

//#include"integral.h"

//

//using namespace std;

//

//double fun(double);

//

//int main()

//{

// integral caculate;

// double(*f)(double);

// double a = 0; //积分上限

// double b = 10; //积分下限

// double c = 0.01; //精度

// p = fun;

// auto A = caculate.monteCarloDefiniteIntegral(p, a, b, c);

// double B = caculate.definiteIntegral(p, a, b, c);

// cout << A.value << endl;

// cout << A.error << endl;

// cout << B << endl;

//

// system("pause");

// return 0;

//}

//

//double fun(double x)

//{

// const double pi = 3.1415926;

// double y;

// y = sin(x);

// //y = cos(x);

// //y = x * x;

// //y = 2.0*sqrt(x) / ((x + 1.0)*(x + 1.0));

// //y = 0.2 / (pow((x - 6.0), 2.0) + 0.02);

// //y = x * cos(10.0*pow(x, 2.0)) / (pow(x, 2.0) + 1.0);

// //y = sqrt(x) / (x*x + 1.0);

// //y = sin(pi*x*x) / ((x - pi)*(x - pi) + 1);

// return y;

//}

c语言用蒙特卡洛算法求定积分,C++计算定积分、不定积分、蒙特卡洛积分法相关推荐

  1. 看得见的算法蒙特卡洛问题——使用蒙特卡洛算法求PI值

    看得见的算法蒙特卡洛问题--使用蒙特卡洛算法求PI值 1.什么是蒙特卡洛问题 蒙特卡洛方法(Monte Carlo method),也称统计模拟方法,是二十世纪四十年代中期由于科学技术的发展和电子计算 ...

  2. 【C语言基础】利用复合梯形求积公式计算定积分

    [C语言基础]利用复合梯形求积公式计算定积分 一.复合梯形求积公式 这是数值分析中一种求解定积分的近似方法.适用于被积函数的原函数不能用初等函数表示的情况. 基本思路 将被积函数 f(x)与x轴围成的 ...

  3. prim求最短路径C语言,[图论]Prim算法求最小支撑树和最短路径

    这个是以前所学,现在总结成博文一篇. 对于图论中的求解最小支撑树问题和最短路径问题都有比较经典的算法,比如最小支撑树可以采用"破圈法",求解最短路径可以用"Dijkstr ...

  4. 蒙特卡洛算法求矩形内切圆面积

    已知:矩形长宽皆为1,则内切圆半径为0.5.求:该圆面积(利用蒙特卡洛算法) 编程思路如下: 1,利用random.unifom生成0到1之间的数字,分别赋值给x,y. 2,判断生成点是否落在矩形区域 ...

  5. python蒙特卡洛算法求积分_python中实现蒙特卡洛算法

    蒙特卡洛算法,是一种以概率统计理论为指导的一类非常的数值计算方法,是指使用随机数来解决很多计算问题的方法. 应用一:用蒙特卡洛算法求解圆周率 思路:在直角座标系中选取x[-1,1],y[-1,1]的正 ...

  6. 蒙特卡洛算法求圆周率

    遇到一个算法面试题,要求通过程序求出圆周率.作为数学渣的我,瞬间懵逼. 于是翻看其他大佬们对于圆周率的计算方式,看到一个比较好理解的算法:蒙特卡洛算法. 如上图,外接正方形的面积S1 = (2R)^2 ...

  7. C语言durand kerner算法求近似根roots(附完整源码)

    实现durand kerner算法求近似根roots 实现以下几个相关的个接口 durand kerner算法求近似根roots的完整源码(定义,实现,main函数测试) 实现以下几个相关的个接口 l ...

  8. C语言用warshall算法求传递闭包transitive closure(附完整源码)

    用warshall算法求传递闭包transitive closure warshall算法求传递闭包完整源码 warshall算法求传递闭包完整源码 #include <stdbool.h> ...

  9. a星算法实现8数码问题c语言,A星算法求八数码问题实验报告.doc

    A星算法求八数码问题实验报告.doc 人工智能实验报告实验名称八数码问题姓名xx学号2012210 xx xx计算机学院 2014年1月14日1 实验目的 掌握A*的思想,启发式搜索,来求解在代价最小 ...

最新文章

  1. 推荐10款冷门但强大的windows软件,值得收藏!
  2. 互联网研发中负载均衡算法一点探索
  3. CSS三个非常重要的特性分享!
  4. 二 计算机技术与机械电子技术的关系,机械电子工程与人工智能的关系初探
  5. 局域网中设备的管理之StackCluster
  6. java单例模式代码vol_单例模式--java代码实现
  7. 苹果ID激活锁查询工具v1.2
  8. python按条件删除行_python – 根据条件删除行组
  9. 手动打开与关闭软键盘
  10. 解决萤石云sdk语音对讲功能(实现)
  11. 谢特——后缀数组+tire 树
  12. 3D游戏-作业三-空间与运动
  13. OPPOR9plusmA_官方线刷包_救砖包_解账户锁
  14. php面试-职业规划
  15. 基于约束的装配设计【CadQuery】
  16. windows server 2012 RD服务器
  17. 阿里巴巴Android开发手册
  18. Cadence Allegro 17.4学习记录开始05-制作封装插件2.54间距排针为例
  19. 还行,OPPO Find X3 Pro评测:卖的是屏幕和这个超广角!
  20. 华为网络测试软件计算机命令

热门文章

  1. 名编辑电子杂志大师教程 | 用FTP上传电子杂志到网站
  2. Umount解挂不了的解决方法
  3. 一次生产环境大量CLOSE_WAIT导致服务无法访问的定位过程
  4. 项目实战---模拟凡客网
  5. 新律师找身边好案源就来案源汇,免费,高效,便捷!
  6. 某企业每月给其A、B、C 和D 四个门店一共发送6 个集装箱的某种货物,如果各门店出售该种货物的利润(万元)如下表:
  7. 【记录】PCL 1.11.1+VS2019+Super4PCS复现的相关配置操作流程
  8. How-old带给美图应用们的思考
  9. #字符串排序:小写<大写<奇数<偶数
  10. 人工智能(3)发展阶段