python中概率分布函数加权的二次积分

2024-04-26 03:18:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个问题,在一个依赖于2个变量(q,r)的函数中执行二定积分,并且其中有一个额外的积分。 我想用高斯函数加权的函数是:

F(q,r)=f(q,r)+int_{0,r}(h(q,r')dr')

并且in必须再次积分才能用高斯函数加权:

I(q)=int_{0,inf}(F(q,r)^2*g(r)dr)

高斯g(r)位于坐标R的中心。在

你可以看到的主要问题是我把数组和标量混合在一起。对于高斯函数(np.ogrid和轴上求和)使用相同的方法可能是一个解决方案,但我不知道如何实现它。在

import numpy as np
from scipy.integrate import quad
import math as m

R=53.
R0=40.
delta=50.
c=2.
qm, rm = np.ogrid[0.0005:2.0:0.0005, 20:100:500j]

#normalized gauss function
#g(r)
def gauss_grid(r,Rmin,pd):
    def gauss(r,Rmin,pd):
        sigma=1.5
        return (1/sigma)*np.exp(-((r-Rmin)**2)/(2*sigma**2))
    gauss_grid = gauss(r,Rmin,pd)
    #normalization of gaussian
    gauss_grid /= np.sum(gauss_grid)
    return gauss_grid

#spherical function 
#f(q,r) 
def form(q,R):
    return (4/3)*m.pi*3*(np.sin(q*R)-q*R*np.cos(q*R))/(q**3)

#FINAL function
#I(q)
def helfand():
    def F(q,R):
        #integral (0,R) of h(q,r)
        def integral(q,Rmax):
            #h(q,r)
            def integrand(r,q):
                return np.sin(q*r)*(r**2)/(q*r*(1+np.exp(c*(R0-r))))
            return quad(integrand, 0, Rmax, args=(q))[0]
        return (form(q,R)+delta*integral(q,R))**2

    FF_hel=F(qm,rm)
    FF_hel *= gauss_grid(rm,R,pd)
    I=FF_hel.sum(axis=1)
    return I,qm.ravel()

helfand()

*更新****

我试过用整合库(使用quad)和我做不到。就像它没有将正确的参数(q)传递给下一个函数。这里有一个非常简单的版本:

^{pr2}$

错误说明:

Supplied function does not return a valid float.


Tags: 函数rmimportreturndefnpfunctionsigma
2条回答

我想你可以用两个单积分来计算。在

如果你写出二重积分,你会得到两部分:

int{0,inf}(f(q,r)*g(r)dr)+int(0,inf)(int{0,r}(h(q,r')dr')*g(r)dr)

我们可以在第二次交换积分的顺序

整数(0,inf)(int{r',inf}(g(r)dr)*h(q,r')dr')

内积分可以用补积分来表示 错误函数。在

我将创建一个简单的二维矩形网格点跨越积分点的限制。我更喜欢用高斯求积来计算积分。这意味着在每个积分点调用函数,不管是否加权,乘以求积权重,然后求和。在

它类似于二维四边形有限元,用数值积分法求刚度矩阵。在

SciPy中有二维求积方法。在写我自己的之前我会用这个。在

http://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.quadrature.html

相关问题 更多 >