蒙特卡洛自动求函数积分的Javascript(Nodejs)算法实现与测试
来源:互联网 发布:淘宝店主在哪里进货 编辑:程序博客网 时间:2024/05/29 12:52
用Javascript实现了函数积分的算法。
从计算结果可以看出,算法精度受随机数发生器的影响较大。
//Monte carro求给定函数的定积分//给定一个函数function f1(x, xmin, xmax){if (x >= xmin && x <= xmax)return x * x * Math.sqrt(1 + x * x * x) - 1;}function f2(x, xmin, xmax){if (x >= xmin && x <= xmax)return x * Math.log(1 + x);}function f3(x, xmin, xmax){if (x >= xmin && x <= xmax)return Math.sqrt(1 - x * x);}function f4(x, xmin, xmax){if (x >= xmin && x <= xmax)return Math.cos(x) - 0.9;}//取得函数的上下极限——其精确度影响很大---由于用于积分,故若y>0,底限0;若y<0,则高限0;若y穿越x轴,则不修改默认极限function getLimit(func, xmin, xmax){//边界极限var t1 = func(xmin, xmin, xmax), t2 = func(xmax, xmin, xmax);var limit = {y0: Math.min(t1, t2), y1: Math.max(t1, t2)};var delta = 1e-3, lastX, lastY, y;for(var x = xmin, i = 0; x <= xmax; x += delta, i++){y = func(x, xmin, xmax);if (y < limit.y0)limit.y0 = y;if (y > limit.y1)limit.y1 = y;if (i == 0){lastX = x;lastY = y;}else{var tx = (lastX + x) / 2;var ty = func(tx, xmin, xmax);if (Math.abs(lastY) > Math.abs(y)){if (Math.abs(lastY) < Math.abs(ty)){lastX = tx;lastY = ty;if (ty < 0 && limit.y0 > ty)limit.y0 = ty;else if (ty >= 0 && limit.y1 <= ty)limit.y1 = ty;}}if (Math.abs(lastY) < Math.abs(y)){if (Math.abs(y) < Math.abs(ty)){lastX = tx;lastY = ty;if (ty < 0 && limit.y0 > ty)limit.y0 = ty;else if (ty >= 0 && limit.y1 <= ty)limit.y1 = ty;}}}}if (limit.y0 > 0)limit.y0 = 0;if (limit.y1 < 0)limit.y1 = 0;return limit;}//积分function cumulate(func, N, xmin, xmax){var limit = getLimit(func, xmin, xmax);//console.log('Limit=', limit.y0, limit.y1);var x, yr, y;var cntA = 0, cntB = 0;for(var i = 0; i < N; i++){x = xmin + (xmax - xmin) * Math.random();yr = limit.y0 + (limit.y1 - limit.y0) * Math.random();y = func(x, xmin, xmax);if ( y >= 0 && yr >= 0 && yr <= y)cntA++;elseif (y <= 0 && yr <= 0 && yr >= y)cntB++;}//console.log('counts=', cntA, cntB);return (cntA - cntB) * (xmax - xmin) * (limit.y1 - limit.y0) / N;}//测试var t1, t2;var rst;var N = 1e7;var fs = [f1, f2, f3, f4];var ans = [-0.593682861167513, 0.25, Math.PI/4, -0.058529015192103493347497678369701];for(var i = 0; i < 4; i++){t1 = new Date();rst = cumulate(fs[i], N, 0, 1);t2 = new Date();console.log('[', i, ']=', ans[i].toFixed(15), rst.toFixed(15), t2 - t1, 'ms');}
- 蒙特卡洛自动求函数积分的Javascript(Nodejs)算法实现与测试
- 蒙特卡洛(Monte Carlo)自动求函数积分的C++算法实现与测试
- 概率算法求定积分的值
- 求定积分的算法模板
- 求任意函数的定积分
- 【C】求函数的定积分
- 求定积分的通用函数
- c++求积分算法
- Romberg求积分算法
- Javascript实现的自动验证函数
- Javascript实现的自动验证函数
- nodejs实现求一个数的约数
- java实现51cto网站的自动签到与获取下载积分等功能代码
- 编写一个求定积分的通用函数
- 自动选步长的梯形算法计算定积分
- 前端Javascript与Nodejs的异同
- ECMAScript、JavaScript与Nodejs的区别
- 使用JavaScript匿名函数自动调来实现自己的框架
- 分配与释放内存
- CentOS下的Redis启动脚本
- Servlet源码分析
- 安卓单元测试错误Test run failed: Unable to find instrumentation target package解决办法
- 修复SD卡
- 蒙特卡洛自动求函数积分的Javascript(Nodejs)算法实现与测试
- 为什么C++不直接提供一个产生随机数的函数?
- VS2010出现FileTracker : error FTK1011编译错误的解决办法
- acm2012
- 安卓手机开发平台部署文档
- Servlet工作原理
- acm 2013
- 基础算法-插入排序
- hibernate学习笔记1--------窥探hibernate