【问题标题】:numerical root finding for positive definite function in PythonPython中正定函数的数值根查找
【发布时间】:2014-10-25 16:21:50
【问题描述】:

我有一个非常复杂的单个变量k 的正定线性连续函数,我试图在k 的给定范围内找到所有根;说-4 < k < 4

到目前为止,我首先通过搜索点k_j 估计了函数的最小值,其中$k_{j+1}>k_j$$k_{j-1}>k_j$ 都在其中。然后使用这些点中的每一个作为起点,我应用优化函数scipy.optimize.newton。在某种程度上,这种方法奏效了。然而,随着我的函数变得越来越复杂,搜索最小值变得越来越耗时并且可能不准确。

numpyscipy 中是否有任何内置函数在函数的给定域(例如-4 < k < 4)中搜索并找到所有根。我愿意牺牲一些计算效率,这样我就不必指定精确的点来搜索附近。

谢谢

【问题讨论】:

  • 一个非常复杂的单变量线性函数?如果这不是一个巨魔帖子,你将不得不更好地解释一下自己
  • 如果你给了我函数本身,我也许可以扩展我的答案以使其更好

标签: python optimization numpy scipy minima


【解决方案1】:

你可以使用范围:

k_list = range(-4, 4)

但这仅适用于整数,这里的问题是指定您的步骤。显然 -4 和 4 之间有无限小数,所以你需要指定你想去多少个小数。

您可以使用numpy.arange 从范围中创建列表并设置递增值

例如

k_list = numpy.arange(-4, 4, 0.5)

将增加 0.5

>>> numpy.arange(-4, 4, 0.5)
>>> [-4, -3.5, -3, -2.5, -2, -1.5, -1, -0.5, 0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4]

如果您想增加较小的数量并因此获得更大范围的值,则将 0.5 变小。

如前所述,您必须指定增量,因为该范围内有无限小数。

指定列表后,您可以使用函数遍历列表以查找根。

for k in k_list:
    some_function(k)
    return root

编辑:

为此,您当然需要一个找到 k 根的函数,但是如果我正确理解了您的问题,这应该只是您的线性方程,使用一个简单的例子:root = 2k(数学写这个的方式当然是y=2x

为了简单起见,假设您的函数是y=2x,此时您的脚本将变为

k_list = numpy.arange(-4, 4, 0.5)

for k in k_list:
    root = 2*k
    return root

然后您只需将自己的值指定为 0.5 即可决定您的 k 值的十进制数

当然,除非您正在研究一种二次方形式。在这种情况下,我们可能会有类似

y = x^2 - 2x +2

这会使您的问题更加混乱。您显然可以通过设置 y=0 找到 x 的根,但是,现在您有一个变量,我想这就是您指定的 k 的意思,留下一个总和而不是公式。

在这种情况下,我会让y=k 然后指定您的k 值并求解以找到您的根。

例如:

y = 32x^2 - 7.2x + 12
let y = k
k = 32x^2 - 7.2x +12
let k = -4 (we'd iterate through your range in reality)
4 = 32x^2 - 7.2x + 12
0 = 32x^2 - 7.2x + 8
and solve for x (aka. root)

我希望有一个 numpyscipy 方法可以解决具有多个相同变量实例的公式。虽然我不是这两个库的专家,所以我无法在这个方向上为你提供建议。

另请参阅: http://docs.scipy.org/doc/numpy/reference/generated/numpy.roots.html http://docs.scipy.org/doc/numpy/reference/generated/numpy.polyval.html#numpy.polyval

【讨论】:

  • 虽然您写这篇文章的努力值得称赞,但我认为这不是从头开始重新发明数值优化领域的正确位置或格式。
  • 我的意图不是重新发明数值优化(虽然这个话题真的是数值优化的地方吗?)。正如您在对“单个变量的非常复杂的线性函数”问题的评论中提到的那样,没什么可继续的。我真正需要处理的只是他给出的范围。我试图做的是给 OP 工具来构建范围,遍历它并找到根源。根据给出的信息,很难说“这是在该范围内为该公式找到根的代码”。不过我明白你在说什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
  • 1970-01-01
相关资源
最近更新 更多