0

我在函数中执行双定积分时遇到问题,该函数取决于 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()

*更新* * **

我尝试使用 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))

错误说:

提供的函数不返回有效的浮点数。

4

2 回答 2

0

我认为你可以用两个单积分来计算这个。

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

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

我们可以在秒内交换积分的顺序得到

int_(0,inf)(int_{r',inf}(g(r)dr) * h(q,r')dr')

内积分可以用互补误差函数来表示。

于 2013-10-02T10:05:35.403 回答
0

我将创建一个简单的 2D 矩形点网格,跨越积分点的限制。然后我更喜欢高斯求积而不是每个元素来评估积分。这意味着在每个积分点调用函数,无论是否加权,乘以正交权重,然后求和。

它类似于二维四边形有限元并通过数值积分来评估刚度矩阵。

SciPy 中有 2D 求积方法。在写我自己的之前我会使用它。

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

于 2013-09-27T18:54:41.187 回答