当前位置: 首页 > 面试题库 >

如何使用numpy(和scipy)查找函数的全零?

赖淇
2023-03-14
问题内容

假设我f(x)a和之间定义了一个函数b。此函数可以有多个零,但也可以有许多渐近线。我需要检索此函数所有 零。最好的方法是什么?

实际上,我的策略如下:

  1. 我在给定数量的点上评估我的功能
  2. 我检测是否有体征变化
  3. 我发现正在改变符号的点之间为零
  4. 我验证找到的零是否真的是零,或者这是一个渐近线
    U = numpy.linspace(a, b, 100) # evaluate function at 100 different points
    

    c = f(U)
    s = numpy.sign(c)
    for i in range(100-1):
    if s[i] + s[i+1] == 0: # oposite signs
    u = scipy.optimize.brentq(f, U[i], U[i+1])
    z = f(u)
    if numpy.isnan(z) or abs(z) > 1e-3:
    continue
    print(‘found zero at {}’.format(u))

除了我看到两个潜在的问题外,该算法似乎有效:

  1. 它不会检测到不与x轴交叉的零(例如,在类似的函数中f(x) = x**2),但是,我认为在我正在评估的函数中不会出现零。
  2. 如果离散点太远,则它们之间可能存在多个零,并且算法可能无法找到它们。

您是否有更好的策略(仍然有效)来找到函数的所有零?

我认为这个问题并不重要,但是对于那些好奇的人,我正在研究光纤中波传播的特征方程。该函数看起来像(其中Vell是先前定义的,并且ell是一个正整数):

def f(u):
    w = numpy.sqrt(V**2 - u**2)

    jl = scipy.special.jn(ell, u)
    jl1 = scipy.special.jnjn(ell-1, u)
    kl = scipy.special.jnkn(ell, w)
    kl1 = scipy.special.jnkn(ell-1, w)

    return jl / (u*jl1) + kl / (w*kl1)

问题答案:

我看到的主要问题是,如果您实际上可以找到 所有的
根源,就像注释中已经提到的那样,这并非总是可能的。如果您确定您的功能不完全是病态的(sin(1/x)已经提到过),那么下一个就是您对缺少一个或多个根的容忍度是多少。换句话说,要确保您没有错过任何东西,要准备多长时间
—据我所知,没有通用的方法可以为您隔离所有根,因此您必须自己做。您所显示的已经是一个合理的第一步。几点评论:

  • 布伦特的方法在这里确实是一个不错的选择。
  • 首先,应对分歧。由于在您的函数中分母中存在贝塞尔,因此您可以首先求解 它们的根源 -更好地在例如Abramovitch和Stegun中查找它们(Mathworld链接)。这将比使用您正在使用的临时网格更好。
  • 你可以做什么,一旦你发现了两个根或分歧,x_1并且x_2,在该区间再次搜索[x_1+epsilon, x_2-epsilon]。继续,直到没有更多的根被找到(Brent的方法保证收敛到 一个 根,提供有一个)。
  • 如果您无法列举所有差异,则可能需要更加仔细地核实候选人是否确实存在差异:x不仅要检查f(x)较大的 物体,还应检查例如(1e-8,1e)的|f(x-epsilon/2)| > |f(x-epsilon)|多个值epsilon-9、1e-10等)。
  • 如果要确保没有简单地接触零的根,请查找函数的极值,对于每个极值x_e,请检查的值f(x_e)


 类似资料:
  • 我正在开发一个Python3.4模块,它依赖于scipy和numpy。所以我在设置中声明了它们。py在install_下需要。 下面是我的设置的最低运行示例。派克 在运行python安装程序时。py安装发生以下异常。 然而,当我按照pip安装的顺序安装所有这些包时,根本不会发生错误。可能easy_install问题? 提前谢谢你们。

  • 我试图在我正在分发的包中创建所需的库。它需要SciPy和NumPy库。在开发过程中,我使用 它安装了SciPy 0.9。0和NumPy 1.5。1,而且效果很好。 我想使用-执行同样的操作,以便能够在设置中指定依赖项。我自己的包裹。 问题是,当我尝试时: 它很好用。 但是 惨败 我如何让它工作?

  • 问题内容: 我正在尝试在要分发的程序包中创建所需的库。它需要SciPy和NumPy库。在开发过程中,我同时使用 它安装了SciPy 0.9.0和NumPy 1.5.1,并且运行良好。 我想使用-做同样的事情,以便能够在我自己的包的setup.py中指定依赖项。 问题是,当我尝试: 它工作正常。 但是之后 惨败 我该如何工作? 问题答案: 我假设我的回答是Linux经验。我发现要顺利进行有三个先决条

  • 问题内容: 在numpy或scipy(或其他库)中是否有一个函数将cumsum和cumprod的概念推广为任意函数。例如,考虑(理论上的)函数 func是一个接受两个浮点数并返回一个浮点数的函数。特殊情况 和 分别是cumsum和cumprod。例如,如果 我将其应用于: 我想要 问题答案: NumPy的ufunc有: 不幸的是,呼吁在“编Python函数失败,一个奇怪的错误: 这是将NumPy

  • 问题内容: 我想使用功能生成视频。 我已按照此处和此处的说明进行操作。 现在,我可以通过以下过程来构建函数: 第1步 触发实例并以root身份在其上运行: 第2步 我将生成的tarball压缩到笔记本电脑中。然后运行此脚本以构建一个zip存档。 目前,脚本仅是测试以查看堆栈是否正常的测试: 第三步 然后,我将生成的归档文件上传到S3作为我的函数的来源。当我测试功能时,我得到以下信息: 我不明白为什

  • 我怎样才能导入阶乘函数分别从Numpy和sippy为了看看哪一个更快? 我已经通过导入数学从python本身导入了阶乘。但是,它不适用于Numpy和smpy。

  • 译者:cangyunye 作者: Adam Paszke 修订者: Adam Dziedzic 在这个教程里,我们要完成两个任务: 创建一个无参神经网络层。 这里需要调用numpy作为实现的一部分。 创建一个权重自主优化的伸进网络层。 这里需要调用Scipy作为实现的一部分。 import torch from torch.autograd import Function 无参数示例 这一层并

  • 问题内容: SciPy似乎在其自己的名称空间中提供了NumPy的大多数(但不是全部[1])功能。换句话说,如果有一个名为的函数,几乎可以肯定有一个。在大多数情况下,两者看起来是完全相同的,甚至有时指向相同的功能对象。 有时,它们是不同的。举一个最近出现的例子: 是一个ufunc该返回的NaN为负参数; 返回负参数的复杂值,并且似乎不是ufunc。 同样可以说,大约,和,但不是关于[2]。 另一方面