【问题标题】:How to deal with functions that approach infinity in NumPy?如何处理 NumPy 中接近无穷大的函数?
【发布时间】:2022-01-26 11:59:44
【问题描述】:

在一本关于 matplotlib 的书中,我发现了一个 1/sin(x) 的图,看起来与我制作的这个图相似:

我使用了域名

input = np.mgrid[0 : 1000 : 200j]

这里让我极度困惑的是正弦函数只是周期性的这一事实。我不明白为什么最大绝对值在减少。在 wolfram-alpha 中绘制相同的函数并没有显示出这种递减效应。使用不同的步数

input = np.mgrid[0 : 1000 : 300j]

提供不同的结果:

我们在最大绝对值方面也有这种下降趋势。

所以我的问题是:

  1. 如何使这样的图保持一致,即独立于步长/步长?
  2. 为什么即使函数是纯周期性的,也会看到这种下降趋势?

【问题讨论】:

  • 你能发布你用来生成图的代码吗?您如何处理除以零错误?
  • 相关:sampling theorem
  • 1. 的简短回答是:你不能。步长需要高于某个阈值。
  • @L.Grozinger 要绘制的代码非常基本,我觉得它会使已经很长的帖子变得混乱。我没有因为除以 0 而出现任何错误,因为我必须处理这些错误。例如在0 结果数组只是读取inf 所以我想 NumPy 会在内部处理该错误。

标签: python numpy math


【解决方案1】:

正弦函数的周期比绘制的要高,因此您看到的是混叠来自采样频率的差异和真实频率的一些倍数。由于其中一个根为 0,因此前几个样本与 π 本身的倍数 从 0 线性缩放,产生 1/x 包络。

在这个例子中,input[5] 是 5(1000/(200-1))=8π−0.007113,所以那里的函数大约是 -141,如图所示。 input[10]当然是16π−0.014226,所以函数大约是−70,以此类推,只要差异远小于π。

有可能某个准周期样本序列最终落在更接近 nπ 的位置,从而产生更复杂的模式,例如第二个图中的模式。

【讨论】:

  • 感谢您提供别名参考,这让事情变得更加清晰。你能稍微扩展一下你对 1/x 信封的解释吗?那个我还没搞定。
【解决方案2】:

为什么即使函数是纯周期性的,也会看到这种下降趋势?

请记住,实际上在pi 的每个倍数处,函数都会变为无穷大。并且显示的跳跃大小实际上只反映了该函数仍然有意义的采样值的最大值。因此,如果您碰巧对一个值进行采样,如果该函数很大但又不是太大而不能成为浮点数,那么您将获得很大的飞跃。

为了能够绘制任何东西matplotlib 会丢弃没有意义的值。就像np.nan 一样,你得到的值是pi±np.infs 的倍数,你得到的值非常接近。我相信会发生的情况是,从零开始,你碰巧得到一个小到不会被丢弃但仍然非常大的值。而当您到达 pi 和它的倍数时,最大值会被丢弃。

如何使这样的图保持一致,即独立于步长/步长?

当你的函数变得不合理的大时,你会在值周围出现奇怪的行为。只需选择 ylimit 即可避免绘制那些疯狂的大值。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.transforms import Bbox

x = np.linspace(10**-10,50, 10**4)
plt.plot(x,1/np.sin(x))
plt.ylim((-15,15))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 2022-08-12
    • 1970-01-01
    • 2022-01-17
    • 2014-04-24
    • 1970-01-01
    相关资源
    最近更新 更多