使用 scipy.integrate.quad 积分复数

2023-12-01

我现在正在使用 scipy.integrate.quad 成功地积分一些真实的被积函数。现在出现了一种情况,我需要对一个复杂的被积函数进行积分。与其他 scipy.integrate 例程一样,quad 似乎无法做到这一点,所以我问:有没有什么方法可以使用 scipy.integrate 积分复杂的被积函数,而不必将积分的实部和虚部分开?


仅仅将其分为实部和虚部有什么问题吗?scipy.integrate.quad要求集成函数为其使用的算法返回浮点数(也称为实数)。

import scipy
from scipy.integrate import quad

def complex_quadrature(func, a, b, **kwargs):
    def real_func(x):
        return scipy.real(func(x))
    def imag_func(x):
        return scipy.imag(func(x))
    real_integral = quad(real_func, a, b, **kwargs)
    imag_integral = quad(imag_func, a, b, **kwargs)
    return (real_integral[0] + 1j*imag_integral[0], real_integral[1:], imag_integral[1:])

E.g.,

>>> complex_quadrature(lambda x: (scipy.exp(1j*x)), 0,scipy.pi/2)
((0.99999999999999989+0.99999999999999989j),
 (1.1102230246251564e-14,),
 (1.1102230246251564e-14,))

这是您期望的舍入误差 - exp(i x) 从 0 开始的积分,pi/2 为 (1/i)(e^i pi/2 - e^0) = -i(i - 1) = 1 +我〜(0.99999999999999989+0.99999999999999989j)。

为了避免大家不是 100% 清楚,积分是一个线性函数,这意味着 ∫ { f(x) + k g(x) } dx = ∫ f(x) dx + k ∫ g(x ) dx (其中 k 是相对于 x 的常数)。或者对于我们的具体情况 ∫ z(x) dx = ∫ Re z(x) dx + i ∫ Im z(x) dx 为 z(x) = Re z(x) + i Im z(x)。

如果您尝试对复平面中的路径(而不是沿实轴)或复平面中的区域进行积分,则需要更复杂的算法。

注意:Scipy.integrate不会直接处理复杂的集成。为什么?它在 FORTRAN 中完成繁重的工作QUADPACK图书馆,特别是在qagse.f它明确要求函数/变量在执行“基于每个子区间内的 21 点高斯-克朗罗德求积的全局自适应求积,并通过 Peter Wynn 的 epsilon 算法加速”之前必须是实数。因此,除非您想尝试修改底层 FORTRAN 以使其能够处理复数,并将其编译到新的库中,否则您将无法让它工作。

如果您确实想在一次积分中对复数进行 Gauss-Kronrod 方法,请查看维基百科页面并直接按照下面的方式实施(使用 15 点、7 点规则)。请注意,我记忆了函数以重复对公共变量的公共调用(假设函数调用很慢,就好像该函数非常复杂一样)。也只做了 7 点和 15 点规则,因为我不想自己计算节点/权重,这些是维基百科上列出的,但测试用例出现合理的错误(~1e-14)

import scipy
from scipy import array

def quad_routine(func, a, b, x_list, w_list):
    c_1 = (b-a)/2.0
    c_2 = (b+a)/2.0
    eval_points = map(lambda x: c_1*x+c_2, x_list)
    func_evals = map(func, eval_points)
    return c_1 * sum(array(func_evals) * array(w_list))

def quad_gauss_7(func, a, b):
    x_gauss = [-0.949107912342759, -0.741531185599394, -0.405845151377397, 0, 0.405845151377397, 0.741531185599394, 0.949107912342759]
    w_gauss = array([0.129484966168870, 0.279705391489277, 0.381830050505119, 0.417959183673469, 0.381830050505119, 0.279705391489277,0.129484966168870])
    return quad_routine(func,a,b,x_gauss, w_gauss)

def quad_kronrod_15(func, a, b):
    x_kr = [-0.991455371120813,-0.949107912342759, -0.864864423359769, -0.741531185599394, -0.586087235467691,-0.405845151377397, -0.207784955007898, 0.0, 0.207784955007898,0.405845151377397, 0.586087235467691, 0.741531185599394, 0.864864423359769, 0.949107912342759, 0.991455371120813]
    w_kr = [0.022935322010529, 0.063092092629979, 0.104790010322250, 0.140653259715525, 0.169004726639267, 0.190350578064785, 0.204432940075298, 0.209482141084728, 0.204432940075298, 0.190350578064785, 0.169004726639267, 0.140653259715525,  0.104790010322250, 0.063092092629979, 0.022935322010529]
    return quad_routine(func,a,b,x_kr, w_kr)

class Memoize(object):
    def __init__(self, func):
        self.func = func
        self.eval_points = {}
    def __call__(self, *args):
        if args not in self.eval_points:
            self.eval_points[args] = self.func(*args)
        return self.eval_points[args]

def quad(func,a,b):
    ''' Output is the 15 point estimate; and the estimated error '''
    func = Memoize(func) #  Memoize function to skip repeated function calls.
    g7 = quad_gauss_7(func,a,b)
    k15 = quad_kronrod_15(func,a,b)
    # I don't have much faith in this error estimate taken from wikipedia
    # without incorporating how it should scale with changing limits
    return [k15, (200*scipy.absolute(g7-k15))**1.5]

测试用例:

>>> quad(lambda x: scipy.exp(1j*x), 0,scipy.pi/2.0)
[(0.99999999999999711+0.99999999999999689j), 9.6120083407040365e-19]

我不相信错误估计——我从 wiki 中获取了一些内容作为从 [-1 到 1] 集成时推荐的错误估计,并且这些值对我来说似乎不合理。例如,与真实情况相比,上述错误是 ~5e-15 而不是 ~1e-19。我确信如果有人查阅了 num 食谱,您可以获得更准确的估计。 (可能必须乘以(a-b)/2某种力量或类似的东西)。

回想一下,Python 版本的准确度不如仅调用 scipy 的基于 QUADPACK 的集成两次。 (如果需要,您可以对其进行改进)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 scipy.integrate.quad 积分复数 的相关文章

随机推荐

  • Java 原始数据膨胀异常

    我试图在 java 中解码 JWT 有效负载 但该有效负载被压缩 放气 zip DEF java util zip DataFormatException 标头检查不正确 private static byte decompress byt
  • 空手道 - 如何从单个主要功能调用多个外部功能

    Feature Principal feature Background url http example com Scenario Feature calling def inputTable call read input table
  • LDAP 的连接字符串是什么?

    这是我需要如何使用它 string tmpDirectory String Format LDAP ou 0 dc 1 dc 2 parentOrganizationUnit domainName domainExtension 当我尝试使
  • 如何创建一个可以将按键发送到控件而不窃取焦点的按钮 - 虚拟键盘

    如何制作一个可以将键发送到 datagridview 的按钮 因此我需要以某种方式将 datagridview 返回到其失去焦点之前的状态 我来解释一下问题 我有一个带有 datagridview 和一些按钮的表单 我可以点击按钮 它会输入
  • 防止conda自动降级python包

    I had problems with pandas datareader软件包 v0 8 1 为了解决我的问题 我必须通过运行以下命令将软件包升级到较新的版本 0 9 conda install c anaconda pandas dat
  • 启用禁用表格行中的控件

    我想在选中相应的 chkView 时启用该行的编辑和删除复选框 如果未选中则禁用它们 这段代码一开始根本就没有触发 我哪里错了 http jsfiddle net 75rVH 1 HTML table tr td td tr table
  • 将 ifelse 函数应用于系统发育扇的颜色提示

    作为系统发育爱好者 我想通过应用 if 语句对提示 类似于本例中的 62 个物种 进行颜色编码 我目前正在使用以下代码 试图将与 O 相关的所有物种着色为深绿色 ColourIf ifelse LU O blue darkgreen tif
  • 检测另一个进程的位数(在 Windows 中)

    如何检测 Windows 中是否有另一个进程以 32 64 位运行 我知道如何为我自己的流程执行此操作 但不知道如何为不同的流程执行此操作 任何语言的提示或解决方案都可以 谢谢 查看是Wow64进程
  • 将列表运算符“in”与浮点值一起使用

    我有一个包含浮点数的列表 每个数字有 3 位小数 例如 474 259 如果我像这样验证列表中的号码 if 474 259 in list sample print something 然后显示消息 但如果我从另一个列表中取出数字并将其四舍
  • clojure 宏生成函数

    我正在尝试编写一个将生成 n 个函数的宏 这是我到目前为止所拥有的 only defined this because if I inline this into make placeholders it s unable to expan
  • 如何从 java 程序运行 mvn 命令?

    我正在构建一个 Java 程序 用于在服务器端自动执行一个过程 通常我 cd 到 Desktop GIT 并使用此 Maven 命令 mvn Integration test DskipTests P Interactive e 我正在构建
  • x86 masm 你好世界

    我正在尝试使用 VS 2010 附带的 ML 和 LINK 在 Windows 上编译一个 hello world MODEL FLAT STACK 4096 data msg db Hello World 0 code INCLUDELI
  • 有没有办法永久关闭 Composer 的 ANSI?

    当我在 shell 中运行 Composer 时 它会将所有文本呈现为深黄色背景色 因此几乎无法阅读 有一个选项可以提供 no ansi与我运行的每个命令争论 但这看起来确实很痛苦 有没有办法将其默认关闭 或者甚至将颜色更改为更易读的颜色
  • 如何在 D3 中的多个单独过渡多边形之间添加过渡延迟?

    原始代码可以在以下位置找到 http bl ocks org Guerino1 3a51eeb95d3a8345bc27370e8c9d5b77 我有许多多边形正在转换到 svg 画布上 从左到右 位于 HTML 页面的底部 我用来创建 V
  • SQL Server 行值作为列名数据透视表?

    我在 SQL Server 2008 中有以下视图 DEPT EMP ID EMP NAME P DATE HOURS WORKED 我希望视图是这样的 DEPT EMP ID EMP NAME 2012 09 28 2012 09 29
  • 为什么图像开头有不需要的额外字节?

    问题 我为我兄弟制作了一个主页 可以在这里访问 http www daniel steiger ch 它在 Linux 上使用 Microsoft ASP NET MVC3 和 mono 3 通过 fastcgi 和 nginx 加上我自己
  • 编写安全的 RMI 服务器-客户端应用程序

    我正在编写一个服务器客户端应用程序 其中通过互联网进行通信 我有几个关于安全性的问题和担忧 我做了一些研究 发现这里的一些帖子很有用 但我想要更多信息 我读到的一些相关问题是 通过 RMI 进行客户端的安全身份验证 java rmi 身份验
  • 选择直到 postgresql 中的行匹配?

    有没有办法选择行直到满足某些条件 IE 一种limit 但不限于N行 但直到第一个不匹配行为止的所有行 例如 假设我有一张桌子 CREATE TABLE t id SERIAL PRIMARY KEY rank INTEGER value
  • 如何在 watchOS 6 中注入 .environment Object()

    我想在 watchOS 6 中创建 SwiftUI 视图时注入环境对象 但由于 WKHostingController 需要具体类型 我无法执行以下操作ContentView environmentObject UserData class
  • 使用 scipy.integrate.quad 积分复数

    我现在正在使用 scipy integrate quad 成功地积分一些真实的被积函数 现在出现了一种情况 我需要对一个复杂的被积函数进行积分 与其他 scipy integrate 例程一样 quad 似乎无法做到这一点 所以我问 有没有