计算定积分的值
来源:互联网 发布:如何登陆我的淘宝店铺 编辑:程序博客网 时间:2024/04/30 09:11
1、概率算法1
设a, b, c和d是实数,且a ≤ b, c ≤ d, f:[a, b] → [c, d]是一个连续函数,写一概率算法计算积分:
#include <iostream>#include <stdlib.h>#include <ctime>#include <cmath>#include <iomanip>#define N 100000000using namespace std;double f(double x){ return sqrt(1-x*x);}double hitOrMiss(int a, int b, int c, int d, double (*f)(double), int n){ srand((unsigned)time(NULL)); double x=0.0, y=0.0; unsigned int k=0; for(unsigned i=0; i<n; ++i){ x = a + (b-a)*rand()/(RAND_MAX*1.0); y = c + (d-c)*rand()/(RAND_MAX*1.0); if(y <= f(x)) ++k; } cout << k << " " << n << endl; return (double)k*(b-a)*(d-c)/n;}int main(){ cout.precision(6); cout << std::fixed << 4*hitOrMiss(0, 1, 0, 1, f, N); return 0;}----------output-----------78533807 1000000003.141352
2、概率算法2
更有效的概率算法是: 在积分区间上随机均匀地产生点,求出这些点上的函数值的算术平均值,再乘以区间的宽度:
#include <iostream>#include <stdlib.h>#include <ctime>#include <cmath>#include <iomanip>#define N 100000000using namespace std;double f(double x){ return sqrt(1-x*x);}double crude(int a, int b, double (*f)(double), int n){ srand((unsigned)time(NULL)); double x=0.0; double sum = 0; for(unsigned int i=0; i<n; ++i){ x = a + (b-a)*rand()/(RAND_MAX*1.0); sum += f(x); } //cout << sum << endl; return (double)(b-a)*sum/n;}int main(){ cout.precision(6); cout << std::fixed << 4*crude(0, 1, f, N); return 0;}
3、确定的算法
梯形算法,将区间分为n-1个子区间,每个子区间内的长度为δ,则
#include <iostream>#include <stdlib.h>#include <ctime>#include <cmath>#include <iomanip>#define N 100000using namespace std;double f(double x){ return sqrt(1-x*x);}double trapezoid(int a, int b, double (*f)(double), int n){ double sum = (f(a)+f(b))/2; double delta = (double)(b-a)/(n-1); // 必须强制类型转换 for(double x=a+delta; x<b-delta; x+=delta){ sum += f(x); } cout << sum << " " << n << endl; return (double)delta*sum;}int main(){ cout.precision(6); cout << std::fixed << 4*trapezoid (0, 1, f, N); return 0;}-------output-----------78539 1000003.141593
一般地,在同样的精度下,梯形算法的迭代次数少于MC(Monte Carlo)积分,有时确定型积分算法求不出解,则不能用梯形算法,需用MC算法。另外,在确定算法中,为了达到一定的精度,采样点的数目随着积分维数成指数增长,例如,一维积分若有100个点可达到一定的精度,则二维积分可能要计算1002个点才能达到同样的精度,三维积分则需计算1003个点。但概率算法对维数的敏感度不大,仅是每次迭代中计算的量稍增一点,实际上,MC积分特别适合用于计算4或更高维数的定积分。
0 0
- 计算定积分的值
- 针对不等式的定积分计算
- 计算定积分
- 平均值法计算定积分
- 关于matlab计算定积分
- 一个定积分计算的类的实现!经典!
- 自动选步长的梯形算法计算定积分
- 070 定积分 和、积极限的计算
- 概率算法求定积分的值
- 定积分的问题
- 定积分的技巧
- 定积分的定义
- 定积分的性质
- 蒙特卡洛方法与定积分计算
- JavaScript计算圆周率(解析几何+定积分)
- Romberg积分法计算定积分(Matlab程序)
- Romberg积分法计算定积分(C语言)
- 0042算法笔记——【随机化算法】计算π值和计算定积分
- Java 输入一个数字将其转换为汉字,如:102,一百零二
- 酷壳陈皓:如何学好C语言
- Android Studio中如何将GIT提交项目到远程仓库
- STL—— queue 单向队列
- MyBatis学习总结(一)
- 计算定积分的值
- 那些被忽略的需求
- HDOJ 3065 病毒侵袭持续中
- Android Studio开发入门-引用jar及so文件
- lua中数值for循环的理解
- 副本集指南(二)
- 2015区域赛长春网络赛 Elven Postman
- Java对象序列化
- C#中var关键字