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

如何在Matlab中于两条曲线的多个交点处绘制垂直线?

解决MATLAB中sin(x)与y=0.5交点垂直线仅显示一条的问题

问题根源

你用find(abs(curve - horizontal_line) < 1e-3)得到的索引,往往是连续的一组采样点——曲线穿过水平线时,相邻的多个点都会满足误差阈值条件,导致x_intersections里充斥大量重复/接近的x值。循环绘制时这些垂直线完全重叠,视觉上就像只画了一条。

修复方案

需要先提取每个交点的唯一x值,再绘制垂直线,以下是两种可行方法:

方法1:筛选去重(适配采样数据)

通过计算相邻x值的差值,过滤掉连续重复的点:

intersection_indices = find(abs(curve - horizontal_line) < 1e-3);
x_intersections = x(intersection_indices);

% 假设x是均匀采样,取步长的一半作为去重阈值
dx = x(2) - x(1);
% 保留第一个点,以及与前一个点间隔超过阈值的点
unique_mask = [true; diff(x_intersections) > dx/2];
x_unique = x_intersections(unique_mask);

% 循环绘制垂直线
for i = 1:length(x_unique)
    plot([x_unique(i), x_unique(i)], [min(curve), max(curve)], 'g:', 'LineWidth', 2);
end
hold on; % 保留原有曲线,避免被覆盖

方法2:解析求解(精准无误差)

利用sin(x)=0.5的解析解,直接计算x范围内的所有交点:

x_start = min(x);
x_end = max(x);
x_solutions = [];

% 遍历所有可能的周期解
k = 0;
while true
    % 正周期解
    sol1 = pi/6 + 2*pi*k;
    sol2 = 5*pi/6 + 2*pi*k;
    if sol1 > x_end
        break;
    end
    sol1 >= x_start && (x_solutions = [x_solutions, sol1]);
    sol2 <= x_end && sol2 >= x_start && (x_solutions = [x_solutions, sol2]);
    
    % 负周期解(若x范围包含负数)
    sol1_neg = pi/6 - 2*pi*abs(k);
    sol2_neg = 5*pi/6 - 2*pi*abs(k);
    if sol2_neg < x_start
        break;
    end
    sol1_neg >= x_start && (x_solutions = [x_solutions, sol1_neg]);
    sol2_neg >= x_start && (x_solutions = [x_solutions, sol2_neg]);
    
    k = k + 1;
end
x_solutions = sort(x_solutions);

% 绘制垂直线
for i = 1:length(x_solutions)
    plot([x_solutions(i), x_solutions(i)], [min(curve), max(curve)], 'g:', 'LineWidth', 2);
end
hold on;

额外提示

  • 必须加hold on,否则新绘制的垂直线会覆盖之前的曲线。
  • 若采样不均匀,方法1的阈值可根据实际数据调整,避免漏判或误判。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 17:03:14