【问题标题】:Numerical double integration of a function in python with a list of fixed variablespython中函数与固定变量列表的数值双积分
【发布时间】:2015-12-22 11:38:34
【问题描述】:

我有点卡在我试图通过 scipy、python 进行数值积分的函数上。

为简单起见,我将函数定义为:

integral f(x,y)= SUM[double integral(ax+by)dxdy]

ab 是常数,但对于每个积分方程它们都是不同的。我已经分别集成了每个函数,然后对所有积分的结果求和,但是这需要大量时间来计算,而且对于我想要实现的目标来说并不理想。

有没有办法通过扩展总和来一次集成整个函数:

integral f(x,y)=double integral [(a1x+b1y)+(a2x+b2y)...(anx+bny)]dxdy 

然后将带有(a,b) 元组列表等的函数传递给 scipy 的 dblquad 函数?

目前,我正在努力在与此相关的文献中找到任何内容。

*编辑

我已经包含了一个示例代码,以更清楚地展示我想要实现的目标:

import sys
import re
import math
from scipy.integrate import dblquad
def f((x,y),variables):
  V=0
  for v in variables:
    a,b=v
    V=V+ax+by
  return (V)

def integral(x_max,y_max,variables):

  return dblquad(f, 0, y_max, lambda x: 0, lambda x: x_max,args=variables)

def main():
  variables=[(1,2),(3,4),(5,6)] #example variables. The length of this list can change with the code I am running.
  x_max=y_max=1
  integral(x_max,y_max,variables)


if __name__ == '__main__':
  main()

因此返回的错误是:

Traceback (most recent call last):
  File "integration_example.py", line 23, in <module>
    main()
  File "integration_example.py", line 19, in main
    integral(x_max,y_max,variables)
  File "integration_example.py", line 14, in integral
    return dblquad(f, 0, y_max, lambda x: 0, lambda x: x_max,args=variables)
  File "/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.py", line 435, in dblquad
    return quad(_infunc,a,b,(func,gfun,hfun,args),epsabs=epsabs,epsrel=epsrel)
  File "/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.py", line 254, in quad
    retval = _quad(func,a,b,args,full_output,epsabs,epsrel,limit,points)
  File "/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.py", line 319, in _quad
    return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit)
  File "/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.py", line 382, in _infunc
    myargs = (x,) + more_args
TypeError: can only concatenate tuple (not "list") to tuple

显然,该函数不喜欢我以我编写的方式传递值列表以放入积分中。有没有办法做到这一点? (抱歉,这可能是表达问题的更好方式)。

【问题讨论】:

  • 你不能交换 sum 和 integration 吗?将一个大被积函数定义为所有被积函数的总和。
  • 这基本上是我想要做的,但是常量 a 和 b 是从程序中的前面步骤生成的,并且 (anx+bny) 的数量也在程序期间确定,所以我无法在运行程序之前使用适当的常量定义确切的函数。我将编辑帖子以包含反映我正在尝试做的代码...

标签: python numpy scipy numerical-integration


【解决方案1】:

我不完全确定,但似乎您的错误基本上只是您将作为args 传递给f 的参数称为variables(也应该是tuple,不是list)。然后你应该用*argsunpack 未知数量的变量。试试:

import sys
import re
import math
from scipy.integrate import dblquad
def f(x,y,*args):
  V=0
  for v in args:
    a,b=v
    V=V+a*x+b*y
  return (V)

def integral(x_max, y_max, variables):
  return dblquad(f, 0, y_max, lambda x: 0, lambda x: x_max, args=variables)

def main():
  variables=((1,2),(3,4),(5,6)) #example variables. The length of this list can change with the code I am running.
  x_max=y_max=1
  integral(x_max,y_max,variables)


if __name__ == '__main__':
  main()

(请注意,您需要a*x,而不是ax。)

【讨论】:

  • 谢谢你。我已经将它应用于这种情况并且代码运行良好。不幸的是,在我的情况下它并没有让事情变得更快,但这对未来很有用。
猜你喜欢
  • 1970-01-01
  • 2016-11-05
  • 2011-10-16
  • 2020-02-25
  • 2016-08-14
  • 1970-01-01
  • 2016-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多