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

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

这个例子可以让常规的数值积分方法统统歇菜。比如, 如果用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] + 1
Count[Flatten@(f /@ RandomReal[{0, 2 Pi}, {n, 3}]), u_ /; u <= 0]/
  n*(2.0 Pi)^3

结果
67.34464074875744`

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值