Python中正定函数的数值求根方法
我有一个非常复杂的正定线性连续函数,这个函数只涉及一个变量k
。我想在一个特定的范围内找到这个函数的所有根,比如说-4 < k < 4
。
到目前为止,我的做法是先估算这个函数的最小值。我会寻找一些点k_j
,这些点满足条件$k_{j+1}>k_j$
和$k_{j-1}>k_j$
。然后,我会把这些点作为起始点,使用一个优化函数scipy.optimize.newton
来进行计算。这个方法在某种程度上是有效的。但是,随着我的函数变得越来越复杂,寻找最小值的过程变得越来越耗时,并且可能不够准确。
请问在numpy
或scipy
中有没有内置的函数,可以在给定的范围内(例如-4 < k < 4
)搜索并找到所有的根?我愿意牺牲一些计算效率,以便不需要指定确切的搜索点。
谢谢
1 个回答
你可以使用范围(range)来生成数字:
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
的方法来解决有多个相同变量的公式。不过我对这两个库都不是专家,所以无法给你建议。
另见: http://docs.scipy.org/doc/numpy/reference/generated/numpy.roots.html http://docs.scipy.org/doc/numpy/reference/generated/numpy.polyval.html#numpy.polyval