You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何无需循环,基于比较结果为蒙特卡洛法中的点按颜色绘图?

解决蒙特卡洛法绘制随机点时维度不匹配的问题

嘿,我来帮你搞定这个维度不匹配的问题!你用蒙特卡洛法求曲线下面积的思路完全没问题,但报错的核心原因是X的维度和随机点矩阵RP不兼容——X是1×n的行向量,而RP是m×n的矩阵,直接拿X和RPA/RPB绘图时,MATLAB会因为两者维度不匹配抛出错误。下面我来一步步帮你修正代码,同时保留你的核心逻辑:

原问题代码分析

先重现你给出的代码片段(补充了缺失的变量定义):

clf 
f = @(x) sin(x/10) + cos(x/60); % Function 
xMin = 1; 
xMax = 100; % x范围
n = 100; % 假设x的采样点数
m = 50; % 假设每个x对应的随机点数
X = linspace(xMin, xMax, n);
Y = f(X);
RP = rand(m, n); % 这里原代码可能缺失y范围的定义

% 尝试划分点(这里会出现维度问题)
RPA = RP(RP <= Y);
RPB = RP(RP > Y);
plot(X, Y); hold on;
plot(X, RPA); % 报错:维度不匹配

问题出在:X是1×n,但RPA/RPB是从m×n矩阵中提取的一维向量,两者无法直接配对绘图。我们需要给每个随机点匹配对应的x值。

修正后的完整代码

clf
f = @(x) sin(x/10) + cos(x/60); % 定义目标函数
xMin = 1; 
xMax = 100; 
n = 100; % x轴的采样点数(可按需调整)
m = 50; % 每个x对应的随机点数量(可按需调整)

% 生成X和对应的函数值Y
X = linspace(xMin, xMax, n); % 1×n的x行向量
Y = f(X); % 1×n的函数值行向量

% 生成随机点矩阵RP:m×n,每一列对应X中一个x的m个随机y值
% 先确定y的范围(基于函数值的极值,增加缓冲让点分布更直观)
yMin = min(Y) - 0.5;
yMax = max(Y) + 0.5;
RP = yMin + (yMax - yMin)*rand(m, n); % m×n的随机y矩阵

% 关键:生成和RP维度匹配的X矩阵——把1×n的X复制m行,变成m×n
X_mat = repmat(X, m, 1); % m×n的x矩阵,每一行都是原X的复制

% 划分随机点:用逻辑掩码标记曲线上下的点
% MATLAB会自动把1×n的Y广播成m×n矩阵,和RP逐元素比较
RPA_mask = RP <= Y; % m×n的逻辑矩阵,标记曲线下方的点
RPB_mask = ~RPA_mask; % 标记曲线上方的点

% 提取对应的点(将矩阵转成一维向量,方便scatter绘图)
x_A = X_mat(RPA_mask);
y_A = RP(RPA_mask);
x_B = X_mat(RPB_mask);
y_B = RP(RPB_mask);

% 绘图:曲线+不同颜色的随机点
plot(X, Y, 'b-', 'LineWidth', 2); % 绘制原函数曲线
hold on;
scatter(x_A, y_A, 10, 'g', 'filled'); % 曲线下方的点:绿色填充
scatter(x_B, y_B, 10, 'r', 'filled'); % 曲线上方的点:红色填充
xlabel('x');
ylabel('y');
title('蒙特卡洛法:曲线上下随机点分布');
legend('原函数曲线', '曲线下方随机点', '曲线上方随机点');
hold off;

% 可选:用蒙特卡洛法近似计算曲线下面积
total_points = m * n;
below_points = sum(RPA_mask(:)); % 统计曲线下方的总点数
area_approx = (xMax - xMin) * (yMax - yMin) * (below_points / total_points);
fprintf('曲线下面积的蒙特卡洛近似值:%.4f\n', area_approx);

关键修正点说明

  • 扩展X维度:用repmat(X, m, 1)将1×n的X复制为m×n的矩阵,让每个随机点都有对应的x值,彻底解决维度不匹配问题。
  • 逻辑掩码提取点:通过RPA_mask = RP <= Y生成逻辑矩阵,MATLAB会自动完成维度广播(把1×n的Y扩展成m×n),然后用掩码提取对应点的x和y,转成一维向量后完美适配scatter绘图。
  • 更直观的随机点范围:基于函数Y的极值设置随机y的范围,避免随机点超出函数可视区域。

内容的提问来源于stack exchange,提问作者mins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:36:03