MATLAB绘图异常求助:双函数同图及误差图无法正常显示
问题排查与修正方案
咱们来一步步拆解你代码里的问题,顺便整理出能正常运行的完整方案:
你的代码核心错误点:
- 代码未完成:最后一行的
loglog(...没有写完,直接导致y2的绘制语句缺失,这是第一张图只显示y1的最直接原因。 - y2的计算逻辑错误:你用了
n*(log(n)'),这是矩阵乘法——行向量n(1×100)乘列向量log(n)'(100×1)会得到一个单一标量,而不是和n同长度的向量,就算写完绘图语句,也没法画出对应每个n的y2曲线。 - 缺少第二个绘图窗口:你需要绘制相对误差的第二张图,但代码里只调用了一次
figure,没有为新图创建独立画布。 - (可选优化)阶乘数值溢出风险:虽然n=100时
factorial(n)还没超出双精度范围,但n≥171时就会溢出为inf,用累加对数的方式计算ln(n!)会更稳定。
修正后的完整代码
n = 1:100; format long; % 计算y1:ln(n!),用累加对数的方式更稳定,避免大阶乘溢出 y1 = cumsum(log(n)); % 若坚持原方法,也可写 y1 = log(factorial(n)); (n=100时无问题) % 计算y2:n*ln(n),必须用元素级乘法.*,确保每个n对应计算 y2 = n .* log(n); % 第一张图:同时绘制y1和y2 figure; loglog(n, y1, 'b', 'DisplayName', 'ln(n!)'); hold on; loglog(n, y2, 'r', 'DisplayName', 'n*ln(n)'); grid on; legend('Location', 'best'); title('Comparison of ln(n!) and n*ln(n)'); xlabel('n'); ylabel('Value'); hold off; % 第二张图:绘制相对误差((y2-y1)/y1) figure; rel_error = (y2 - y1) ./ y1; % 同样用元素级除法./ plot(n, rel_error, 'k'); grid on; title('Relative Error: ((n*ln(n) - ln(n!))/ln(n!))'); xlabel('n'); ylabel('Relative Error');
修正点说明
- 补全绘图语句:完成了y2的
loglog调用,还添加了图例、网格、标题等元素,让图表更易读。 - 修正向量运算:把矩阵乘法
*换成元素级运算.*,除法也用./,确保每个n都能得到对应的计算结果。 - 新增第二个绘图窗口:调用
figure创建新画布,专门绘制相对误差曲线。 - 优化y1的计算:用
cumsum(log(n))代替log(factorial(n)),本质上ln(n!) = ln(1)+ln(2)+...+ln(n),这种方式避免了直接计算超大阶乘,适用性更广。
内容的提问来源于stack exchange,提问作者james
相关产品推荐
相关产品推荐

