【发布时间】:2020-03-26 08:36:16
【问题描述】:
我的代码使用蒙特卡洛技术来绘制在氢原子周围可以找到电子的点,但是在绘制这个时,程序可能需要几个小时才能生成我一直在查看的图表减少这个时间的方法并尝试使用 numba 我不知道我是否正确使用它,但它没有任何区别
谁能帮帮我
from scipy.special import genlaguerre, sph_harm
from numpy import random, linspace, sqrt, pi, arccos, exp
from matplotlib.pyplot import plot, figure, show
from numba import jit
n = 2
l = 1
m = -1
Lx = 3*10**-9
Ly = Lx
a_0 = 5.29*10**-11
x = linspace(0,Lx, 100000)
fi = linspace(0,2*pi, 100000)
def fact(x):
if x == 0:
return 1
else:
return x*fact(x-1)
def row(r):
return (2*r)/(n*a_0)
def Hydrograd(r):
return -1*sqrt((2/(n*a_0))**3*(fact(n - l- 1))/(2*n*(fact(n+l))**3))*exp(-1*row(r)/2)*row(r)**l*genlaguerre(n-l-1, 2*l+1)(row(r))
def Hydrogsph(theta, phi):
return sph_harm(m,l,theta,phi).real
@jit
def HydroFunc(r,theta, phi):
return abs(Hydrograd(r))**2*abs(Hydrogsph(theta, phi))**2
def rFinder(x,y,z):
return sqrt(x**2 + y**2 + z**2)
def phiFinder(x,y,z):
return arccos(x/rFinder(x,y,z))
i = 0
p = 50
@jit
def monty(Lx,Ly,x,fi):
i = 0
p = 50
X = []
Y = []
while i < p:
xr = random.uniform(-Lx,Lx)
yr = random.uniform(-Ly,Ly)
if HydroFunc(rFinder(xr,yr,0),0,phiFinder(xr,yr,0))>random.uniform(0,max(HydroFunc(x,0,fi))/100):
X.append(xr)
Y.append(yr)
i += 1
print(i)
figure()
plot(X,Y,'.')
show()
monty(Lx,Ly,x,fi)
【问题讨论】:
标签: python montecarlo