【问题标题】:Octave fplot abs looks very strangeOctave fplot abs 看起来很奇怪
【发布时间】:2021-12-03 04:25:47
【问题描述】:
f = @(x)(abs(x))
fplot(f, [-1, 1]

全新安装的 octave,未编辑任何配置。它会产生以下图像,它看起来好像在 0 附近一段时间内保持不变,看起来更像 \_/ 而不是 \/:

为什么它看起来与通常的接近 0 的绝对值图如此不同?如何解决这个问题?

【问题讨论】:

  • Octave 的默认安装不再使用 gnuplot,而是通常使用 Qt(graphics_toolkit 的输出是什么?)。在我看来,您的问题与 gnuplot 无关......

标签: gnuplot octave


【解决方案1】:

由于fplot 是用 Octave 编写的,因此相对容易阅读。它的位置可以使用which 命令找到。在我的系统上,这给出了:

octave:1> which fplot
'fplot' is a function from the file /usr/share/octave/5.2.0/m/plot/draw/fplot.m

检查fplot.m 发现要绘制的函数 f(x) 在给定限制之间的 n 个等距点处进行评估。确定 n 的算法从第 192 行开始,可以总结如下:

  1. n 最初选择为 8(除非用户指定不同)
  2. 使用 n/2 + 1 个点的较粗网格构造参数向量: x0 = linspace (limits(1), limits(2), n/2 + 1)' (linspace 函数将接受点数的非整数值,并向下舍入)
  3. 计算相应的值: y0 = f(x0)
  4. 使用 n 个点的网格构造参数向量: x = linspace (limits(1), limits(2), n)'
  5. 计算相应的值: y = f(x0)
  6. 使用函数interp1(),通过线性插值从x0 和y0 计算出与x 的成员相对应的值向量: yi = interp1 (x0, y0, x, "linear")
  7. 使用以下公式计算错误度量: err = 0.5 * max (abs ((yi - y) ./ (yi + y + eps))(:)) 也就是说,err 与计算值和线性插值之间的最大差值成正比。
  8. 如果err 大于tol(除非用户指定,否则为2e-3)然后输入n = 2*(n-1) 并重复。否则绘制(x,y)。

因为abs(x)本质上是一对直线,如果x0包含零,那么线性插值将始终与其对应的计算值完全匹配,err将完全为零,因此上述算法将在最后终止的第一次迭代。如果 x 不包含零,那么 plot(x,y) 将在一组不包括函数“尖点”的点上被调用,并且会发生奇怪的行为。

如果限制在零的任一侧等距且 floor(n/2 + 1) 为奇数,则会发生这种情况,默认值就是这种情况(limits = [-5, 5], n = 8) .

可以通过选择nlimits 的组合来避免这种行为,这样就可以满足以下任一情况: a) m = floor(n/2 + 1) 等间距点的集合不包括零或 b) n 个等距点的集合确实包括零。

例如,在零和奇数 n 的任一侧等距的限制将正确绘制。但是,这不适用于 n=5,因为奇怪的是,如果用户输入 n=5,fplot.m 会用 8 代替它(我不确定它为什么这样做,我认为这可能是一个错误)。所以fplot(@abs, [-1, 1], 3)fplot(@abs, [-1, 1], 7) 会正确绘制,但fplot(@abs, [-1, 1], 5) 不会。

(n/2 + 1) 是奇数,因此对于对称限制,x0 包含零,仅对于每第二个偶数 n。这就是为什么它在 n=6 时正确绘制的原因,因为对于该值 n/2 + 1 = 4,所以 x0 不包含零。对于 n=10、14、18 等也是如此。

选择稍微不对称的限制也可以解决问题,试试:fplot(@abs, [-1.1, 1.2])

【讨论】:

  • 为什么fplot(@abs, [-1, 1], N=6) 会产生正确的情节(见我的回答)?限制是等距的,N 是偶数...
  • 刚刚编辑了我的答案来解释这一点。
【解决方案2】:

奇怪的形状来自采样率,即函数被评估的点数。这是由fplot 的参数N 控制的,默认调用似乎不小心跳过了x=0,而fplot(@abs, [-1, 1], N=5) 我得到了和你一样有趣的形状:

但是,尝试不同的 N 值可以产生正确的形状,例如尝试fplot(@abs, [-1, 1], N=6):

虽然一般来说我建议使用更高的数字,例如N=100

【讨论】:

  • 这是有道理的。我在N=100 上也可以看到相同的效果(虽然更小)。
  • @Carla_display 确实,N=100 再次遇到了问题,N=101 对我来说看起来不错。如果您认为您的问题已解决,请考虑接受此答案。
  • @Elraid 是的,我相信这里的问题发生在 N 为偶数时。如果 N 是奇数,则它到达原点。所以即使N=3 也可以很好地完成这个功能
【解决方案3】:

文档说:“fplot 最适用于连续函数。具有不连续性的函数不太可能很好地绘制。这个限制将来可能会被删除。”所以它可能是函数本身的一个错误/特性,除了开发人员之外无法修复。普通的plot() 函数可以正常工作:

x = [-1 0 1];
y = abs(x);
plot(x, y);

【讨论】:

  • Abs 是一个连续函数。
猜你喜欢
  • 1970-01-01
  • 2021-07-02
  • 1970-01-01
  • 2021-03-25
  • 2015-03-20
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 2012-07-17
相关资源
最近更新 更多