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,和线性中点完全不同。
解决方法
如果要在半对数图上得到准确的交点,必须在对数空间中重新计算插值:
- 对所有Y轴数据(包括
y1_limit、y2_limit、y3_limit、measured_y)取对数(比如用log10()函数) - 在对数化后的Y值与X值之间做插值,得到交点的对数Y值
- 把对数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
相关产品推荐
相关产品推荐

