最近几天我一直在处理这个问题,但我还看不出问题出在哪里。
我正在尝试在具有特定平均值 ( ) 和偏差 ( )f(q,r)
的高斯分布中使用 2 个变量对函数进行加权。这是必需的,因为理论函数在实验分析时其变量具有一定的分散性。因此,我们使用概率密度函数来衡量我们在变量中的函数。g(r)
R0
sigma
f(q)
r
r
我包含了有效的代码,但没有给出预期的结果(加权曲线应该随着多分散性的增长(更高sigma
)更平滑,如下所示。如您所见,我整合了来自的 2 个函数的f(r,q)*g(r)
卷积r = 0
到r = +inf
.
绘制结果以将称重结果与简单函数进行比较:
from scipy.integrate import quad, quadrature
import numpy as np
import math as m
import matplotlib.pyplot as plt
#function weighted with a probability density function (gaussian)
def integrand(r,q):
#gaussian function normalized
def gauss_nor(r):
#gaussian function
def gauss(r):
return m.exp(-((r-R0)**2)/(2*sigma**2))
return (m.exp(-((r-R0)**2)/(2*sigma**2)))/(quad(gauss,0,np.inf)[0])
#function f(r,q)
def f(r,q):
return 3*(np.sin(q*r)-q*r*np.cos(q*r))/((r*q)**3)
return gauss_nor(r)*f(r,q)
#quadratic integration of the integrand (from 0 to +inf)
#integrand is function*density_function (gauss)
def function(q):
return quad(integrand, 0, np.inf, args=(q))[0]
#parameters used in the function
R0=20
sigma=5
#range to plot q
q=np.arange(0.001,2.0,0.005)
#vector where the result of the integral will be saved
function_vec = np.vectorize(function)
#vector for the squared power of the integral
I=[]
I=(function_vec(q))**2
#function without density function
I0=[]
I0=(3*(np.sin(q*R0)-q*R0*np.cos(q*R0))/((R0*q)**3))**2
#plot of weighted and non-weighted functions
p1,=plt.plot(q,I,'b')
p3,=plt.plot(q,I0,'r')
plt.legend([p1,p3],('Weighted','No weighted'))
plt.yscale('log')
plt.xscale('log')
plt.show()
非常感谢。我已经遇到这个问题好几天了,我还没有发现错误。
也许有人知道如何以更简单的方式使用 PDF 来衡量函数。