蒙特卡洛算法的应用

蒙特卡罗法算法的应用

文章目录

  • 一、蒙特卡罗法的概念及应用
    • 二、蒙特卡罗法的实质
      • 三、求非线性方程一个实根的蒙特卡罗法
      • 四、求实函数或复函数方程一个复根的蒙特卡罗法

一、蒙特卡罗法的概念及应用

二、蒙特卡罗法的实质

三、求非线性方程一个实根的蒙特卡罗法

四、求实函数或复函数方程一个复根的蒙特卡罗法

蒙特卡罗法的概念及应用
蒙特卡洛法 (又称统计试验法)是描述装备运用过程中各种随机现象的基本方法,而且它特别适用于一些解析法难以求解甚至不可能求解的问题,因而在装备效能评估中具有重要地位。 用蒙特卡洛法来描述装备运用过程是1950年美国人约翰逊首先提出的。
这种方法能充分体现随机因素对装备运用过程的影响和作用。 更确切地反映运用活动的动态过程。 在装备 效能评估 中,常用蒙特卡洛法来确定含有随机因素的效率指标,如发现概率、 命中概率 、平均毁伤目标数等;模拟 随机服务系统 中的随机现象并计算其数字特征;对一些复杂的装备运用行动,通过合理的分解,将其简化成一系列前后相连的事件,再对每一事件用随机抽样方法进行模拟,最后达到模拟装备运用活动或运用过程的目的。

  **蒙特卡罗法的实质**
  蒙特卡罗法的实质:当无法求得精确解时,进行随机抽样,根据统计试验求近似解。

通俗理解:

1、假如有一万个苹果,需要挑选出其中最大的,但只能闭着眼睛挑,手里最多保留一个苹果。

2、初始时闭着眼睛随机挑选,拿到一个苹果。

3、然后可继续闭着眼睛挑一个,并与手里现有的比较,留下较大的、扔掉较小的。

4、循环重复上一步,则挑的次数越多,挑出最大苹果的可能性也就越大

5、但人的时间精力有限,除非把十万苹果都挑一遍,否则无法确定挑出来的就是最大的。

6、所以挑了3000后,就把此时手里的苹果视为十万个苹果中最大的近似解。

求非线性方程一个实根的蒙特卡罗法

算法描述:
① 令i = 0 i=0i=0,任选一个初值x ( 0 ) x^{(0)}x 
(0),计算F ( 0 ) = f ( x ( 0 ) ) F^{(0)}=f(x^{(0)})F 
(0) =f(x (0) )
②产生区间上均匀分布的随机数a aa,以x ( 0 ) + a x^{(0)}+ax 
(0)+a作为自变量并计算F ( 1 ) = f ( x ( 1 ) + a ) F^{(1)}=f(x^{(1)}+a)F (1) =f(x (1) +a)
③若F ( 0 ) ⩽ F ( 1 ) F^{(0)} \leqslant F^{(1)}F 
(0)⩽F (1) 则返回上一步并重新产生随机数,直到找到某个a aa使得F ( 1 ) ⩽ F ( 0 ) F^{(1)} \leqslant F^{(0)}F 
(1) ⩽F (0)
 ④ 若F ( 1 ) {F^{(1)}}F (1)的绝对值⩽ σ \leqslant \sigma⩽σ,则x ( 1 ) + a x^{(1)}+ax (1) +a作为方程的一个根,否则转至②
function root = Mont(f,B,x0,eps)
% f:方程表达式
% B:随机数区间
% x0:初始值
% eps:根的精度
format long
if(nargin == 3)
	eps = 1.0e-4;
end
Fx = subs(sym(f),findsym(sym(f)),x0);
while abs(Fx)>eps
	Fx = subs(sym(f),findsym(sym(f)),x0);
	Fx1 = abs(Fx) + 10;
	while(abs(Fx1) >= abs(Fx))
		a = 2*B*rand() - B;
		x1 = x0 + a;
		Fx1 = subs(sym(f),findsym(sym(f)),x1);
	end
	x0 = x1;
end
root = x1;

function x=qiushigeng(fname,a,b,e)
%fname 为函数名,a,b 为区间端点,e 为精度
fa=feval(fname,a); %把 a 端点代入函数,求 fa
fb=feval(fname,b); %把 b 端点代入函数,求 fb
if fa*fb<0 error('两端函数值为同号');
end
%如果 fa*fb<0,则输出两端函数值为同号
k=0
x=(a+b)/2
while(b-a)>(2*e) %循环条件的限制
fx=feval(fname,x);%把 x 代入代入函数,求 fx
if fa*fx>0%如果 fa 与 fx 同号,则把 x 赋给 b,把 fx 赋给 fb
b=x;
fb=fx;
else
%如果 fa 与 fx 异号,则把 x 赋给 a,把 fx 赋给 fa
a=x;
fa=fx;
end
k=k+1
x=(a+b)/2 
end


在命令行窗口输入以下代码,即可求出一个非线性方程的一个实根。

fun=inline('exp(-x*x*x)-sin(x)/cos(x)+800');x=qiushigen(fun,-0.5,0.5,0.5.*10.^-3)

运行结果如下:
在这里插入图片描述
求实函数或复函数方程一个复根的蒙特卡罗法
定义两个函数

function root = Mont(f,B,x0,eps)
% f:方程表达式
% B:随机数区间
% x0:初始值
% eps:根的精度
format long
if(nargin == 3)
	eps = 1.0e-4;
end
Fx = subs(sym(f),findsym(sym(f)),x0);
while abs(Fx)>eps
	Fx = subs(sym(f),findsym(sym(f)),x0);
	Fx1 = abs(Fx) + 10;
	while(abs(Fx1) >= abs(Fx))
		a = 2*B*rand() - B;
		x1 = x0 + a;
		Fx1 = subs(sym(f),findsym(sym(f)),x1);
	end
	x0 = x1;
end
root = x1;

%求复数的正整数次方根,并且返回所有复数根。
% X可以是标量,也可以是向量。
% n必须是正整数。
% Y是L*n的矩阵,其中L是X的长度。
function Y=complex_sqrt(X,n)
[~,b]=size(X);
if b>1
    X=X.';%进行转置但复数元素的值不会改变,使用"'"转置会造成复数元素的值改变
end
pre_angle=angle(X)+2*pi*(angle(X)<0);%angle的输出范围是[-pi,pi],我们希望的范围是[0,2pi)
complex_angle=(pre_angle+(0:2*pi:2*(n-1)*pi))/n;
Y=repmat(abs(X).^(1/n),[1,n]).*(cos(complex_angle)+1i*sin(complex_angle));

在命令行窗口输入以下代码:

 X=[4*sqrt(2)*(-1+1i),-i]

在这里插入图片描述

>>complex_sqrt(X,3)

在这里插入图片描述

在次声明:本次实验是为了完成测试,不具有很大的参考价值。
相关链接:

(https://blog.csdn.net/weixin_55105724/article/details/122767399)
相关链接:
(https://blog.csdn.net/qq_67421354/article/details/127683589)

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值