【问题标题】:Can scipy.integrate.fixed_quad compute integral with functional boundaries?scipy.integrate.fixed_quad 可以计算功能边界的积分吗?
【发布时间】:2017-07-05 08:32:30
【问题描述】:

我想在三角形上对函数进行数值积分,类似于

import scipy.integrate as integrate
inside = lambda x: integrate.quad(lambda x,y: 1, 0, x, args=(x))[0]
outside = integrate.quad(inside, 0, 1)[0]
print(outside)
0.5

但使用scipy.integrate.fixed_quad 函数(它具有集成顺序n 作为参数)。但是,当我写

inside = lambda x: integrate.fixed_quad(lambda x,y: 1, 0, x, args=(x), n=5)
print(inside(5))

Traceback(最近一次调用最后一次):文件“”,第 1 行,in 文件“”,第 1 行,在文件中 "/Users/用户名/anaconda/lib/python3.5/site-packages/scipy/integrate/ quadrature.py”,第 82 行,在 fixed_quad 中 return (b-a)/2.0 * np.sum(w*func(y, *args), axis=0), None

TypeError: () 参数后 * 必须是可迭代的,而不是 int

我不知道自己做错了什么,因为我正在关注scipy.integrate.fixed_quad 上的文档。

【问题讨论】:

    标签: python scipy numerical-integration


    【解决方案1】:

    问题在于您对argsargs=(x) 的定义。它应该作为一个元组传递,因此您需要添加一个额外的逗号以使其成为一个元组:

    inside = lambda x: integrate.fixed_quad(lambda x,y: 1, 0, x, args=(x,), n=5)
    

    然后

    inside(5)
    

    产量

    (5.0, None)
    

    线

    integrate.quad(lambda x,y: 1, 0, x, args=(x))[0]
    

    quad 中工作,它检查args 是否是一个元组;如果不是则转换(直接取自源代码):

    if not isinstance(args, tuple):
            args = (args,)
    

    fixed_quad 中并非如此,这就是为什么您在一种但不是两种情况下都收到错误的原因。

    【讨论】:

    • 有趣,没想到这一点,因为它适用于不带逗号的Integrate.quad。但是执行 'outside = integration.fixed_quad(inside, 0, 1, n=5)[0]' 会给出另一个 ValueError,所以我仍然无法计算双积分。虽然它适用于“integrate.quad(inside, 0, 1)”,但我更喜欢在两个积分中都有 n(高斯积分阶)参数。
    • @Jan:我编辑了我的帖子,说明了为什么在调用 quad 时它不会崩溃。
    猜你喜欢
    • 2017-07-05
    • 1970-01-01
    • 2019-09-05
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 2023-01-01
    • 1970-01-01
    相关资源
    最近更新 更多