我有一个非常复杂的单个变量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
)中搜索并找到所有根。我愿意牺牲一些计算效率,这样我就不必指定准确的点来搜索附近。
由于
答案 0 :(得分: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
这使您的问题更加混乱。你显然可以通过设置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)
我希望有一个numpy
或scipy
方法来解决具有相同变量的多个实例的公式。我不是lib的专家,所以我无法向你提出这方面的建议。
另见: http://docs.scipy.org/doc/numpy/reference/generated/numpy.roots.html http://docs.scipy.org/doc/numpy/reference/generated/numpy.polyval.html#numpy.polyval