【问题标题】:Division by zero error while calculating derivative at high precision在高精度计算导数时除以零误差
【发布时间】:2020-07-31 12:27:31
【问题描述】:

我正在使用斜率方法计算函数的导数。我需要放大图表以查看实际发生的情况,但数据点太低而无法给出平滑曲线。因此,当我增加循环中的迭代次数时,程序会给出 RuntimeWarning 的错误:在 true_divide 中遇到除以零。该函数是红色的,它的绿色导数图如下所示:

从这里可以看出,曲线并不平滑,即缺少数据点。我正在使用 for 循环来迭代我的程序,当我增加范围时它会给出错误。计算是通过使用数值方法完成的,我只使用 0.0001 的步长值。之后,该程序不提供正确的值。在这里可以做什么?

【问题讨论】:

  • 那么不要除以零。在功能评估期间会发生这种情况吗?数值导数公式没有除以可能为零的项。评估点不应该太接近发生灾难性取消。
  • 它是 arctan 的函数(见上文 RED),我计算了该图的斜率。问题是 x 轴上的行为在非常低的值处发生变化(如您在此处看到的 0.0005),这实际上是我系统中的波长,所以物理学没有错。所以图表的行为是正确的,但不幸的是,当我深入计算时,浮点数会变为 idk 小数位,因此无法完成计算。对不起,我是物理学家而不是程序员,所以我无法清楚地看到问题。我已经更新了问题请看
  • 这看起来对于某些值,您得到了错误的弧切线分支。我将从纠正这种行为开始,以使红色曲线没有奇点。
  • 你能尝试用一个简化的例子来获得类似的行为吗?在充分增加样本点的数量后,我在 gnuplot 中得到了一个与 pl [-1:1] atan(1/(x-0.01))+atan(1/(x+0.01))+((x<0)?2*pi:0) 相似的图形。
  • 对不起,我之前不清楚,这种接近零的行为就是我们所说的系统共振,我们只对系统的那一部分感兴趣,即共振发生了什么.我添加了红色曲线的放大照片。是的,我已经尝试绘制更简单的版本,在该版本中,它制作了一个可以理解的 S 形曲线,并且在接近零值时它不会表现出奇怪的行为,但是当我们将不同的参数添加到系统中时,它开始表现得很奇怪。而且我只运行了 10k 次迭代,我相信我应该能够做更多的事情。

标签: python matplotlib scipy data-science numerical-methods


【解决方案1】:

尝试减少导数,然后将分析结果乘以 10 到 5 的幂。

【讨论】:

  • 我无法理解您的建议。
  • 您将巨大的数字 (-20000) 与非常小的数字 (-0.0005) 进行比较,这就像比较太阳与地球一样。你将无法看到地球上的山脉!您需要减少第一个或增加第二个,然后通过将结果乘以正确的因子来调整结果。
  • 你是对的。但我每天都在 Mathematica 中这样做。我们的计算是光速与波长的关系,所以是的,它们就像比较太阳和地球。但我需要在 python 中做出这种转变。该函数在 Mathematica 中计算得很好,但斜率(导数)在那里也仍然存在问题。我只需要大规模地看到这种行为。
猜你喜欢
  • 1970-01-01
  • 2014-11-20
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
相关资源
最近更新 更多