蒙特卡洛方法(Monte Carlo,MC)

server/2024/11/30 13:22:44/

目录

1 序言

2 Monte Carlo法计算积分

3 最优化计算Monte Carlo法


1 序言

蒙特卡罗方法(Monte Carlo)是由冯诺依曼和乌拉姆等人发明的,“蒙特卡罗”这个名字是出自摩纳哥的蒙特卡罗赌场,这个方法是一类基于概率的方法的统称。是一种应用随机数来进行计算机模拟的方法,此方法随研究的系统进行随机观察抽样,通过对样本值的观察统计,求得所研究系统的某些参数。

2 Monte Carlo法计算积分

考虑二重积分

I=\iint_{A}f(x,y)dxdy,\; \; f(x,y)\geq 0,\; \; \forall (x,y)\in A

 根据其几何意义,它是以f(x,y)为曲面顶,A为底的柱体C的体积。用下列简单思路求的近似值:假设C被包在几何体D的内部,D的体积已知,若在D内产生1个均分布的随机数,那么

P(随机数落在C内)\approxC的体积/D的体积

 现用Monte Carlo法计算:I=\iint_{x^{2}+y^{2}\leq 1}\sqrt{1-x^{2}}dxdy

% Monte Carlo Integration for f(x, y) = sqrt(1 - x^2) over x^2 + y^2 <= 1
clc; clear;% Number of random points
N = 1e6; % You can increase this for better accuracy% Initialize sum of function values
f_sum = 0;% Loop to generate random points and calculate contributions
for i = 1:N% Generate random (x, y) within the bounding box [-1, 1] x [-1, 1]x = -1 + 2*rand(); % Random x in [-1, 1]y = -1 + 2*rand(); % Random y in [-1, 1]% Check if the point is inside the circleif x^2 + y^2 <= 1f_sum = f_sum + sqrt(1 - x^2); % Accumulate the function valueend
end% Calculate area of the bounding box
A_box = 4; % The bounding box [-1, 1] x [-1, 1]% Calculate the integral estimate
integral_value = A_box * f_sum / N;% Display result
fprintf('Estimated value of the integral: %.6f\n', integral_value);

2.1 代码解释:

1)随机点生成:

  • 在 [−1,1]×[−1,1] 内均匀生成随机点。
  • 使用条件x^{2}+y^{2}\leq 1筛选落在单位圆内的点。

2)函数值累加:

  • 对满足条件的点,计算 \sqrt{1-x^{2}}并累加到 f_sum

3)积分估计公式:

  •  估计积分值为:

  • 这里的区域面积 Abox=4 是整个采样的矩形面积。 

4)效率: 

  • N越大,估计值越准确。
  • 通过筛选x^{2}+y^{2}\leq 1 ,只在实际目标区域内计算函数值。

2.2 运算结果

NI
N = 1e22.655043
N = 1e42.685272
N = 1e62.666568
N = 1e82.666756

3 最优化计算Monte Carlo法

求下列函数的最大值:

f(x)=(1-x^{3})sin(3x),\: \; \; \; \; -2pi<x<2pi

为了方便理解,先绘制这个函数:

% Define the function f(x)
f = @(x) (1 - x.^3) .* sin(3 * x);% Define the range for x
x = linspace(-2*pi, 2*pi, 1000); % Generate 1000 points in the range [-2*pi, 2*pi]% Compute the function values
y = f(x);% Plot the function
figure;
plot(x, y, 'b-', 'LineWidth', 1.5);
grid on;% Add labels and title
xlabel('x');
ylabel('f(x)');
title('Plot of f(x) = (1 - x^3)sin(3x)');
legend('f(x) = (1 - x^3)sin(3x)', 'Location', 'Best');

 matlab运行结果如下: 

在给出计算代码:

% Optimization using Monte Carlo for f(x) = (1 - x^3) * sin(3x)
clc; clear;% Number of random samples
N = 1e6; % Increase this for higher accuracy% Define the function
f = @(x) (1 - x.^3) .* sin(3 * x);% Generate random samples in the range [-2*pi, 2*pi]
x_samples = -2*pi + (2*pi - (-2*pi)) * rand(N, 1);% Evaluate the function for each sample
f_values = f(x_samples);% Find the maximum function value
f_max = max(f_values);% Find the corresponding x value(s) for the maximum
x_max = x_samples(f_values == f_max);% Display results
fprintf('Maximum value of f(x): %.6f\n', f_max);
fprintf('At x = %.6f (one of the possible values)\n', x_max(1));

3.1 代码解释

1)随机采样:

  • 使用rand(N,1)生成N个均匀分布的随机数映射到区间[-2pi,2pi]中,作为函数的自变量x值。

2)函数评估:

  • 定义函数f(x)=(1-x^{3})sin(3x),计算每个采样点上的函数值f(x_{sample})

3)最大值搜索:

  • 使用max函数找到函数值中的最大值f_{max}
  • 找到与最大值对应的x值。

4)输出结果:

  •  输出最大值及对应的一个可能的必值(可能有多个全局最大值点) 

2.2 运算结果

Nf_{max}x
N = 1e2191.3604115.858119
N = 1e4194.903941-5.814489
N = 1e6194.906195-5.816071
N = 1e8194.906195-5.816063

注:1)本篇内容均为对《MATLAB建模与仿真》(周品 赵新芬 编著,国防工业出版社)摘录与个人归纳总结,如需要更加详细了解,可阅读原书“第8章 随机模拟和统计分析”部分。
2)代码由chat gpt生成。


http://www.ppmy.cn/server/146160.html

相关文章

小程序 - 婚礼邀请函

小程序页面和样式练习 - 婚礼邀请函小程序开发笔记 目录 婚礼邀请函 准备工作 加载静态资源 项目初始化 标签栏的配置 各页面导航栏标题配置 全局导航栏样式配置 公共样式的编写 项目内容 邀请函页面内容 邀请函页面样式 照片页面内容 照片墙页面样式 美好时光页…

【Java基础入门篇】前言

Java基础入门篇 本系列内容主要针对Java基础知识&#xff0c;总共包含四大部分内容&#xff1a; 变量、数据类型和运算符控制语句和递归算法面向对象和JVM底层分析数组和排序 学习需要具备&#xff1a; IDEA编译器 JDK1.8版本 写在前面 在Java入门的最开始&#xff0c;我们需…

C++设计模式(工厂模式)

一、介绍 1.动机 在软件系统中&#xff0c;经常面临着创建对象的工作&#xff0c;这些对象有可能是一系列相互依赖的对象&#xff1b;由于需求的变化&#xff0c;需要创建的对象的具体类型经常变化&#xff0c;同时也可能会有更多系列的对象需要被创建。 如何应对这种变化&a…

【k8s深入理解之 Scheme 补充-7】理解无版本资源、有版本资源、元数据信息等联系和区别

代码 注意 无版本资源 —— 也是一种资源&#xff0c;可以理解为公共资源&#xff0c;用于记录或查询&#xff08;如 Status 或 APIGroup 等&#xff09; 由于 k8s 发展原因&#xff0c;一般放置在 核心组v1 版本种&#xff08;Group为空&#xff0c;版本为 v1&#xff09;&am…

maven 工具 clean、compile、package、install、deploy 常用命令使用区别

在 Maven 中&#xff0c;clean, compile, 和 deploy 是常用的生命周期阶段命令&#xff0c;它们各自有不同的用途和含义。下面是这些命令的详细解释&#xff1a; 1. mvn clean 含义&#xff1a; clean 阶段用于清理项目构建过程中生成的文件。 作用&#xff1a; 删除 target …

Could not locate device support files.

报错信息&#xff1a;Failure Reason: The device may be running a version of iOS (13.6.1 17G80) that is not supported by this version of Xcode.[missing string: 869a8e318f07f3e2f42e11d435502286094f76de] 问题&#xff1a;xcode15升级到xcode16之后&#xff0c;13.…

安装SQL Server 2022提示需要Microsoft .NET Framework 4.7.2 或更高版本

安装SQL Server 2022提示需要Microsoft .NET Framework 4.7.2 或更高版本。 原因是&#xff1a;当前操作系统版本为Windows Server 2016 Standard版本&#xff0c;其自带的Microsoft .NET Framework 版本为4.6太低&#xff0c;不满足要求。 根据报错的提示&#xff0c;点击链接…

【jvm】C1编译器

目录 1. 说明2. 作用3. 特点4. 编译流程5. C1编译器与分层编译6. C1编译器的相关参数 1. 说明 1.JVM&#xff08;Java Virtual Machine&#xff09;C1编译器是Java虚拟机中的一个即时编译器&#xff08;Just-In-Time Compiler&#xff0c;JIT&#xff09;&#xff0c;也称为Cl…