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

Octave 9.2.0中插值点在半对数刻度显示异常问题咨询

问题:半对数刻度下插值交点显示偏差的原因分析

我正在使用Octave 9.2.0。线性刻度下,通过插值得到的绿线与蓝线交点坐标显示完全准确,但因可视化需求切换为Y轴半对数(semilogy)刻度后,这些插值点的显示位置出现偏差,放大后该问题更为明显。我仅改变了数据的展示方式,无法理解为何会出现此问题,请问这是Octave的Bug还是我存在认知遗漏?

更新数据

x_border=[89.851, 89.381, 88.206, 84.483, 76.524, 63.118, 48.013, 32.873, 20.891];
y1_limit = [950.64, 988.06, 238.63, 333.22, 902.78, 282.25, 776.69, 993.59, 891.05];
y2_limit = [2091.4, 2173.7, 524.99, 733.09, 1986.1, 620.95, 1708.7, 2185.9, 1960.3];
y3_limit = [5.2596e+06, 5.0604e+06, 2.0953e+07, 1.5005e+07, 5.5385e+06, 1.7715e+07, 6.4376e+06, 5.0323e+06, 5.6113e+06];
measured_y=[435.18, 1610.4, 7327.3, 39667, 2.2852e+05, 1.2228e+06, 5.4267e+06, 1.6834e+07, 3.5808e+07];

limit1_pts(1), limit1_pts(2) = [89.638, 967.59];
limit2_pts(1), limit2_pts(2) = [89.291, 2047.6];
limit3_pts(1), limit3_pts(2) =[46.819, 6.3267e+06];

半对数刻度绘图代码

figure(999);
clf;
semilogy(x_border, y1_limit,'-.','linewidth',1,'color','b');
hold on;
semilogy(x_border, y2_limit,'-','linewidth',1,'color','b');
hold on;
semilogy(x_border, y3_limit,'-.','linewidth',1,'color','b');
hold on;
semilogy(x_border,measured_y,'-','linewidth',1,'color','g');
hold on;
semilogy(limit1_pts(1), limit1_pts(2),'*','linewidth',3,'color','r');
hold on;
semilogy(limit2_pts(1), limit2_pts(2),'x','linewidth',3,'color','r');
hold on;
semilogy(limit3_pts(1), limit3_pts(2),'*','linewidth',3,'color','r');
hold on;

线性刻度绘图代码

figure(999);
clf;
plot(x_border, y1_limit,'-.','linewidth',1,'color','b');
hold on;
plot(x_border, y2_limit,'-','linewidth',1,'color','b');
hold on;
plot(x_border, y3_limit,'-.','linewidth',1,'color','b');
hold on;
plot(x_border,measured_y,'-','linewidth',1,'color','g');
hold on;
plot(limit1_pts(1), limit1_pts(2),'*','linewidth',3,'color','r');
hold on;
plot(limit2_pts(1), limit2_pts(2),'x','linewidth',3,'color','r');
hold on;
plot(limit3_pts(1), limit3_pts(2),'*','linewidth',3,'color','r');
hold on;

解答

这不是Octave的Bug,是你对插值逻辑与刻度变换的匹配性存在认知遗漏。

核心原因

  • 你在线性空间中计算的插值交点,直接放到对数空间的坐标系里显示,自然会出现位置偏差。半对数刻度下,Y轴的像素位置是对原始Y值取对数后映射的,而你的插值点是基于线性Y值计算的,完全没考虑对数变换的非线性特性。
  • 举个直观例子:线性空间中Y=100和Y=1000的中点是550,但在对数空间(以10为底)中,log₁₀(100)=2,log₁₀(1000)=3,中点是2.5,对应原始Y值是316.23,和线性中点完全不同。

解决方法

如果要在半对数图上得到准确的交点,必须在对数空间中重新计算插值:

  1. 对所有Y轴数据(包括y1_limit、y2_limit、y3_limit、measured_y)取对数(比如用log10()函数)
  2. 在对数化后的Y值与X值之间做插值,得到交点的对数Y值
  3. 把对数Y值反变换为原始Y值(即10.^log_y),再用semilogy绘图

验证示例

以你的limit1_pts为例:

  • 线性空间中你得到的交点是(89.638, 967.59),在半对数图上,这个点的Y轴像素位置是基于log10(967.59)≈2.9857计算的
  • 但实际在对数空间中,绿线和蓝线的交点应该是对log(Y)做线性插值的结果,反推回原始Y值后,再绘图才会和两条线准确重合

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 04:25:57