0

0

使用 SciPy quad 积分指示函数:问题与解决方案

心靈之曲

心靈之曲

发布时间:2025-09-19 23:15:00

|

959人浏览过

|

来源于php中文网

原创

使用 scipy quad 积分指示函数:问题与解决方案

本文探讨了在使用 SciPy 的 quad 函数积分包含指示函数的复杂函数时可能遇到的问题,即由于 quad 的自适应性质,可能导致积分结果不准确。文章提供了问题分析,并介绍了使用 qmc_quad 函数的解决方案,该函数通过增加采样点数量来提高积分精度,并给出了详细的代码示例。

在使用 SciPy 的 quad 函数进行数值积分时,如果被积函数包含指示函数(indicator function),可能会遇到一些问题。指示函数在特定区间内取值为 1,在其他区间取值为 0,这可能导致 quad 函数的自适应积分算法失效,从而得到不准确的结果。

问题分析

scipy.integrate.quad 采用自适应求积方法,它会根据被积函数的性质动态调整采样点。如果指示函数定义的区间非常小,并且初始采样点恰好都落在指示函数值为 0 的区域,quad 可能会过早地认为积分已经收敛,从而返回不正确的结果(例如 0)。

以下代码展示了这个问题:

import numpy as np
from scipy.integrate import quad

def indac(x, xc, rad):
    if xc - rad <= x <= xc + rad:
        return 1
    else:
        return 0

phi = lambda ii, x: np.sin(ii * x)

xc = 0.1586663
rad = 0.01 * np.pi

result, _ = quad(lambda x: phi(1, x) * indac(x, xc, rad), 0., np.pi)
print(result)  # 0.0

a, b = xc - rad, xc + rad
result, _ = quad(lambda x: phi(1, x) * indac(x, xc, rad), a, b)
print(result)  # 0.009925887836572549

在上面的代码中,直接在 [0, np.pi] 区间上积分,得到的结果是 0。但是,如果我们指定积分区间为指示函数非零的区间 [a, b],就能得到正确的结果。

解决方案:使用 qmc_quad

ShopWe 网店系统
ShopWe 网店系统

1.修正会员卡升级会员级别的判定方式2.修正了订单换货状态用户管理中心订单不显示的问题3.完善后台积分设置数据格式验证方式4.优化前台分页程序5.解决综合模板找回密码提示错误问题6.优化商品支付模块程序7.重写优惠卷代码8.优惠卷使用方式改为1卡1号的方式9.优惠卷支持打印功能10.重新支付模块,所有支付方式支持自动对账11.去掉规格库存显示12.修正部分功能商品价格显示4个0的问题13.全新的支

下载

为了解决这个问题,可以使用 scipy.integrate.qmc_quad 函数。该函数使用拟蒙特卡洛(Quasi-Monte Carlo, QMC)方法进行积分,它通过在积分区间内均匀分布采样点来更准确地估计积分值。

以下是使用 qmc_quad 函数的示例代码:

import numpy as np
from scipy import integrate

def indac(x, xc, rad):
    return (xc - rad <= x) & (x <= xc + rad)

phi = lambda ii, x: np.sin(ii * x)

xc = 0.1586663
rad = 0.01 * np.pi

# The integrand callable needs to be vectorized to evaluate
# the integrand at `n_points` points in a single call. 
# Increase `n_points` for more accurate results.
res = integrate.qmc_quad(lambda x: phi(1, x) * indac(x, xc, rad), 
                         0., np.pi, n_points=10000)

print(res)
# QMCQuadResult(integral=0.009904273812591187, standard_error=1.5619537172522532e-05

代码解释

  1. indac 函数:定义指示函数,当 x 落在 [xc - rad, xc + rad] 区间内时返回 True (等价于1),否则返回 False (等价于0)。需要注意的是,这里返回的是布尔值,可以被 numpy 直接转换为数值。
  2. phi 函数:定义被积函数的另一部分,这里是一个正弦函数。
  3. integrate.qmc_quad 函数:使用 QMC 方法进行积分。
    • 第一个参数是被积函数,这里使用 lambda 表达式将 phi 和 indac 函数组合在一起。
    • 第二个和第三个参数是积分区间的下限和上限。
    • n_points 参数指定采样点的数量。增加 n_points 可以提高积分的精度,但也会增加计算时间。

注意事项

  • qmc_quad 函数要求被积函数是向量化的,即可以接受一个数组作为输入,并返回一个包含每个元素积分值的数组。在上面的例子中,indac 函数已经满足这个要求。
  • 选择合适的 n_points 值非常重要。如果 n_points 太小,积分结果可能不准确。如果 n_points 太大,计算时间会很长。通常需要根据具体问题进行调整。

总结

当使用 scipy.integrate.quad 积分包含指示函数的复杂函数时,可能会遇到精度问题。scipy.integrate.qmc_quad 函数提供了一种更可靠的解决方案,通过增加采样点数量来提高积分精度。在使用 qmc_quad 函数时,需要注意被积函数的向量化以及 n_points 参数的选择。

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

206

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

190

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

50

2026.01.05

function是什么
function是什么

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果。本专题为大家提供function是什么的相关的文章、下载、课程内容,供大家免费下载体验。

481

2023.08.04

js函数function用法
js函数function用法

js函数function用法有:1、声明函数;2、调用函数;3、函数参数;4、函数返回值;5、匿名函数;6、函数作为参数;7、函数作用域;8、递归函数。本专题提供js函数function用法的相关文章内容,大家可以免费阅读。

163

2023.10.07

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

404

2023.08.14

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

9

2026.01.23

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

25

2026.01.22

PHP后端开发相关内容汇总
PHP后端开发相关内容汇总

本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

18

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号