蒙特卡洛方法靠谱程度不高却受追捧

来源:互联网 发布:我知谁掌管明天 歌词 编辑:程序博客网 时间:2024/05/29 11:06

……不是没有道理的。——常规的高效的迭代方法不行的全局优化,本质上是一拨又一拨的蒙特卡洛。

这个例子可以让常规的数值积分方法统统歇菜。比如, 如果用matlab中的integral3,肯定不行。需要非常特殊的技巧。Mathematica默认的方法一向通用性强,碰上这个问题也十分吃紧。

下面这两个结果,蒙特卡洛方法的结果更接近准确值。

精度要求低或者精度无法保证高而计算量大的情况下,蒙特卡洛可以试试。随机全局优化大致如此。

求不规则形状体积:
这里写图片描述

隐函数曲面方程

0.51(cosxcosy+cosxcosz+cosycosz)+cosx+cosy+cosz+1=0

这个例子的较为精确的数值结果是:67.59353836486223222964871:

Matlab integral3歇菜

这个函数也是比较新的版本才有的。但是功能就比较老旧了。
无法得到有用结果,返回NaN和警告信息。

Mathematica NIntegrate

用Mathematica有几种不同实施方法,传统的方法差太远。

比如:

NIntegrate[Boole[Cos[x]+Cos[y]+Cos[z]+0.51` (Cos[x] Cos[y]+Cos[y] Cos[z]+Cos[z] Cos[x])+1<=0],{x,0,2Pi},{y,0,2Pi},{z,0,2Pi}]

得到:
66.70206691379813`
差距比较明显;

NIntegrate[1,{x,y,z}\[Element]ImplicitRegion[1+Cos[x]+Cos[y]+Cos[z]+51/100 (Cos[x] Cos[y]+Cos[x] Cos[z]+Cos[y] Cos[z])<=0&& 0<=x<=2Pi &&0<=y<=2 Pi &&0<=z<=2Pi,{x,y,z}]]

最新版本
67.0421386455621
这是稍好的近似值。

Monte Carlo方法,效率低,精度更差而且不太可控

ClearAll["Global`*"]; n = 125000; SeedRandom[0];f[x_] := (Cos /@ x // Total) +   51/100*Dot[Cos /@ RotateRight@x, Cos /@ x] + 1Count[Flatten@(f /@ RandomReal[{0, 2 Pi}, {n, 3}]), u_ /; u <= 0]/  n*(2.0 Pi)^3

结果
67.34464074875744`

原创粉丝点击