2015-09-24 16 views
0

我有点卡在函数上,我试图通过scipy,python进行数值整合。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 

很显然,函数并不像我那样通过一列值来把它写入我写这个的方式中。有没有办法做到这一点? (对不起,这可能是措辞问题的更好方式)。

+0

不能您交换和整合?定义一个大的被积函数作为你所有被积函数的总和。 – yevgeniy

+0

这基本上就是我想要做的,然而常量a和b是从程序中的前几个步骤中产生的,并且在程序期间也确定了(anx + bny)的数量,所以我不能用运行该程序之前已有的常量。我将编辑帖子以包含反映我正在尝试做什么的代码... – Phil

回答

0

我不能完全肯定,但似乎你的bug基本上仅仅是你指的是要传递为argsfvariables(这也应该是一个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。)

+0

Thankyou为此。我已经将它应用于这种情况,并且代码运行良好。不幸的是,在我的情况下,它不会让事情变得更快,但这对于了解未来有用。 – Phil