MATLAB无法生成目标曲线求助:Excel可正常绘制同公式曲线
解决MATLAB中复现Excel曲线时的空白绘图问题
我来帮你排查下问题所在,你的MATLAB代码出现空白绘图主要是因为数据中存在无效值(Inf、NaN和复数),导致plot无法正常渲染曲线,下面一步步分析并给出修正方案:
问题根源分析
你的公式在以下x值范围内会产生无效数据:
- x=0时:分母中的
4*x*(1-x)等于0,整个表达式会计算出Inf(无穷大); - x>1时:
(1-x)为负数,对负数开平方在MATLAB中会得到复数,而plot默认只处理实数数组,混合复数的数组会导致绘图异常; - 你提到Excel能正常显示曲线,大概率是Excel自动忽略了这些错误值(比如x>1时公式返回
#NUM!但绘图时跳过了这些点,或者你实际的Excel数据范围是0到1而非0到5)。
修正后的代码方案
方案1:仅保留公式有效的x范围(0到1)
这是最贴合公式数学意义的方案,因为当x>1时公式中的根号内为负,属于无效的实数输入:
v = 10; x = 0.01:0.01:1; % 避开x=0,同时限制x≤1保证根号内非负 % 逐元素计算表达式,确保数组运算正确 y = 1./(1 + (sinh(v^(1/2)*(1 - x).^(1/2))).^2./(4*x.*(1-x))); % 过滤掉可能存在的异常值(比如x=0附近的Inf) valid_idx = ~isinf(y) & ~isnan(y); x_valid = x(valid_idx); y_valid = y(valid_idx); % 绘图 plot(x_valid, y_valid, 'LineWidth', 2) grid on xlabel('x') ylabel('Transmittance')
方案2:处理x>1的复数情况(如果确实需要绘制到x=5)
如果你确认Excel中x到5时能显示曲线,可能是Excel对复数做了隐式处理(比如取实部),你可以在MATLAB中手动提取实部并过滤无效值:
v = 10; x = 0.01:0.01:5; % 避开x=0 % 计算表达式,提取实部 y = real(1./(1 + (sinh(v^(1/2)*(1 - x).^(1/2))).^2./(4*x.*(1-x)))); % 过滤异常值 valid_idx = ~isinf(y) & ~isnan(y); x_valid = x(valid_idx); y_valid = y(valid_idx); % 绘图 plot(x_valid, y_valid, 'LineWidth', 2) grid on xlabel('x') ylabel('Transmittance')
额外提示
- 检查你的Excel数据:如果x>1时Excel单元格显示
#NUM!,说明这些点其实是无效的,绘图时Excel自动跳过了它们,这也解释了为什么Excel能显示曲线而MATLAB不行; - MATLAB的plot函数会忽略单独的NaN/Inf,但如果数组中存在大量复数或连续的无效值,就会导致整个曲线不显示,所以过滤无效值是关键。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

