python中概率分布函数(PDF)加权的数值二重积分
我在一个函数中执行双定积分时遇到了一个问题,这个函数依赖于两个变量(python中概率分布函数(PDF)加权的数值二重积分,python,math,probability,numerical-methods,Python,Math,Probability,Numerical Methods,我在一个函数中执行双定积分时遇到了一个问题,这个函数依赖于两个变量(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 n
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()
*更新****
我尝试使用scipy.integrate库(使用quad
),但无法完成。这就像它没有将正确的参数(q
)传递给下一个函数一样。下面是我尝试的一个非常简化的版本:
import numpy as np
from scipy.integrate import quad
import matplotlib.pyplot as plt
R=53.
R0=41.
pd=15.
sigma=1.5
def I(q):
#(function with integral inside) squared
def FF(q,r):
def integral_f(q,r):
def f(r1,q):
return np.sin(q*r1)
return quad(f,0,r,args=(q))[0]
def h(q,r):
return (r*np.cos(q*r))
return (h(q,r)+integral_f(q,r))**2
#gaussian function normalized
def g(r,R0):
def gauss(r,R0):
return (1/sigma)*np.exp(-((r-R0)**2)/(2*sigma**2))
return gauss(r,R0)/(quad(gauss,0,np.inf,args=(R0))[0])
#main function to be integrated with gaussian
def function(r,q):
return FF(q,r)*g(r,R)
return quad(function,0,np.inf,args=(q))[0]
q=np.arange(0.001,1.,0.001)
plt.plot(q,I(q))
错误显示:
提供的函数不返回有效的浮点值
我将创建一个简单的二维矩形网格点,跨越积分点的限制。然后我更喜欢高斯求积来计算积分。这意味着在每个积分点调用函数,不管是否加权,乘以正交权重,然后求和 它类似于二维四边形有限元,通过数值积分计算刚度矩阵 SciPy中有2D求积方法。我会在写我自己的之前用它
我想你可以用两个单积分来计算 如果你写出二重积分,你会得到两部分: int{0,inf}(f(q,r)*g(r)dr)+int{(0,inf)(int{0,r}(h(q,r')dr')*g(r)dr) 我们可以在第二秒内交换积分顺序以获得 int(0,inf)(int{r',inf}(g(r)dr)*h(q,r')dr') 内部积分可以用互补积分表示
误差函数。这是一个非常酷的想法,但它对这个问题不起作用,因为函数F(q,r)在高斯积分中是平方的,并且该规则无法应用。我现在正在尝试使用scify.integrate.quad…正如在编辑的问题中一样,我一直在尝试这种方法,但我还不能让它工作。可能我在传递参数时对
quad
做了一些错误的处理。。。