Python中的无限求和

时间:2015-07-15 19:57:50

标签: python numpy scipy mathematical-optimization integral

我有一个函数,我需要在数值上对(在所有整数上)进行无限求和。总和并不总是需要收敛,因为我可以改变内部参数。该函数看起来像,

m(g, x, q0) = sum(abs(g(x - n*q0))^2 for n in Integers)
m(g, q0) = minimize(m(g, x, q0) for x in [0, q0])

使用Pythonic伪代码

使用Scipy集成方法,我只是对n进行拼接,并对固定的x进行整合,

m(g, z, q0) = integrate.quad(lambda n:
                             abs(g(x - int(n)*q0))**2,
                             -inf, +inf)[0]

这很好用,但是我必须对x作为x的函数进行优化,然后对其进行另一个求和,得到积分优化的积分。差不多需要很长时间。

你知道更好的方法来做更快的求和吗?手工编码似乎变慢了。

目前,我正在使用

g(x) = (2/sqrt(3))*pi**(-0.25)*(1 - x**2)*exp(-x**2/2)

但解决方案应该是通用的

这篇文章来自Daubechies的“小波变换,时频定位和信号分析”(IEEE 1990)

谢谢

3 个答案:

答案 0 :(得分:4)

感谢所有有用的评论,我写了自己的加法器,似乎运行速度非常快。任何人都有任何建议让它变得更好,我很乐意接受它们。

我将对我正在处理的问题进行测试,一旦它表现出成功,我将宣称它有效。

def integers(blk_size=100):
    x = arange(0, blk_size)
    while True:
        yield x
        yield -x -1
        x += blk_size

#                                                                                                                                                                                                            
# For convergent summation                                                                                                                                                                                   
# on not necessarily finite sequences                                                                                                                                                                        
# processes in blocks which can be any size                                                                                                                                                                  
# shape that the function can handle                                                                                                                                                                         
#                                                                                                                                                                                                            
def converge_sum(f, x_strm, eps=1e-5, axis=0):
    total = sum(f(x_strm.next()), axis=axis)
    for x_blk in x_strm:
        diff = sum(f(x_blk), axis=axis)
        if abs(linalg.norm(diff)) <= eps:
            # Converged                                                                                                                                                                                      
            return total + diff
        else:
            total += diff

答案 1 :(得分:2)

UITextView几乎肯定是你的瓶颈。一个非常快速和肮脏的解决方案是将其矢量化以对整数数组进行操作,然后使用np.trapz使用梯形规则估计积分:

NSString

除此之外,您可以使用Cython或numba重新编写g(x)来加快速度。

答案 2 :(得分:1)

Numba有可能显着提高速度 - http://numba.pydata.org

安装起来有点痛苦但很容易使用。看一下: https://jakevdp.github.io/blog/2015/02/24/optimizing-python-with-numpy-and-numba/