【问题标题】:Finding all roots in a given interval in 1d在 1d 中查找给定间隔内的所有根
【发布时间】:2017-12-23 18:12:16
【问题描述】:

为了补充here 提出的问题,我想问一下我如何才能在某个间隔内找到所有根,直到某个粒度。现在我用穷人的方法,通过

import numpy as np
x = np.linspace(0,10,1000)
data = np.sin(x)
roots = (np.abs(data) < 0.1)
# Cluster the data using some other poor man's approach

【问题讨论】:

  • roots = (np.abs(data) &lt; granularity) 是做什么的? “粒度”是什么意思?也就是说,它代表什么?好的,现在从最后一次编辑来看很清楚。谢谢!
  • 求根时能否评估函数,还是只有采样数据?
  • 你知道所有的根都是真实的吗?如果出现复杂的共轭对,你会错过其中的许多。
  • @Jon,我只需要真正的根。
  • @kazemakase:我有一个表现良好的函数,可以按任意间隔进行采样。

标签: python scipy numerical-methods


【解决方案1】:

我认为没有一种神奇的方法可以找到一般方程的所有根。您的“穷人的方法”开始时还不错。我会使用产品而不是|data|&lt;eps。例如,

dp = data[1:] * data[:-1]
indices = np.where(dp <= 0)

将提供“可疑”区间的位置。然后,您可以运行一个更好的方法,提供每个此类可疑区间的中心坐标作为初始猜测。一种更复杂的方法可能会适应斜率并调整函数采样,而不是像 linspace() 那样使用恒定的采样。

【讨论】:

    【解决方案2】:

    很明显,如果没有关于手头功能的任何信息,穷人的方法是最优的(在某种概率意义上)。

    因为一般函数的根分布均匀且彼此独立,因此可能基于函数值的不相等步长将是浪费时间。

    当您可以利用函数的某些属性时,您将处于更好的位置。例如,如果您对某个区间内的导数有一个界限,那么对于端点处函数的合适值,您可以证明不存在根。

    【讨论】:

      猜你喜欢
      • 2020-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-26
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      • 2012-05-04
      相关资源
      最近更新 更多