如何无需循环,基于比较结果为蒙特卡洛法中的点按颜色绘图?
解决蒙特卡洛法绘制随机点时维度不匹配的问题
嘿,我来帮你搞定这个维度不匹配的问题!你用蒙特卡洛法求曲线下面积的思路完全没问题,但报错的核心原因是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
相关产品推荐
相关产品推荐

