-2

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

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

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

谢谢

4

1 回答 1

0

您可以使用范围:

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

这使您的问题更加混乱。您显然可以通过设置找到 x 的根,y=0但是,现在您有一个变量,我想这就是您指定的 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

于 2014-09-01T12:35:39.767 回答