Python中正定函数的数值求根

Python中正定函数的数值求根,python,optimization,numpy,scipy,minima,Python,Optimization,Numpy,Scipy,Minima,我有一个非常复杂的单变量的正定线性连续函数k,我试图找到给定范围k内的所有根;说-4k_j$。然后使用这些点作为起点,我应用优化函数,scipy.optimize.newton。在某种程度上,这种方法是有效的。然而,随着我的函数变得越来越复杂,搜索极小值变得越来越耗时,而且可能不准确 在numpy或scipy中是否有任何内置函数在函数的给定域(例如-4

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

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

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

谢谢

您可以使用范围:

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
值并求解以找到根

例如:

我希望有一种
numpy
scipy
方法来解决同一变量的多个实例的公式。尽管我不是这两种库的专家,所以我无法向您提供这方面的建议

另见:

一个非常复杂的单变量线性函数?如果这不是一篇troll文章,你必须更好地解释自己如果你给了我函数本身,我可能能够扩展我的答案,使其更好。虽然你在写这篇文章时所做的努力值得赞扬,但我认为这不是重新设计的正确地方或格式数值优化领域从无到有。我的意图不是重新发明数值优化(而在这个主题上,是否真的要把数值优化放在一起?)。正如你在评论“一个非常复杂的单变量线性函数”问题时提到的没什么可谈的。我真正需要做的就是他给出的范围。我想做的是给OP提供构建范围的工具,迭代它并找到根。根据给出的信息,很难说“这是为公式找到该范围根的代码”。我确实理解你的意思。
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)