Python中正定函数的数值求根方法

-2 投票
1 回答
849 浏览
提问于 2025-04-19 05:06

我有一个非常复杂的正定线性连续函数,这个函数只涉及一个变量k。我想在一个特定的范围内找到这个函数的所有根,比如说-4 < k < 4

到目前为止,我的做法是先估算这个函数的最小值。我会寻找一些点k_j,这些点满足条件$k_{j+1}>k_j$$k_{j-1}>k_j$。然后,我会把这些点作为起始点,使用一个优化函数scipy.optimize.newton来进行计算。这个方法在某种程度上是有效的。但是,随着我的函数变得越来越复杂,寻找最小值的过程变得越来越耗时,并且可能不够准确。

请问在numpyscipy中有没有内置的函数,可以在给定的范围内(例如-4 < k < 4)搜索并找到所有的根?我愿意牺牲一些计算效率,以便不需要指定确切的搜索点。

谢谢

1 个回答

0

你可以使用范围(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)

我想应该有 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

撰写回答