#---------------^_^-------------^_^-------
#利用python仿真双缝实验
#程序再版与2019/1/5,初版写于2017年12月
#作者:cclplus
#仅供学习交流使用
#如有疑问或者需求,可以联系作者707101557@qq.com
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import math
n=int(50) #方镜上点的个数
rd=0.005#方镜的边长——单位m
ld=1.0 #确定谐振腔的腔长
#假设起始时光强处处相等
I=np.ones((n,n),float)
#这是一个需要长时间运行的程序
for t in range(30):
In=np.zeros((n,n),float)
for i in range(n):
for j in range(n):
for i1 in range(n):
for j1 in range(n):
In[i][j]=In[i][j]+1.0/(4.0*math.pi)*I[i1][j1]*
(1.0+ld/math.sqrt((rd/float(n)*(i1-i))**2+
(rd/float(n)*(j1-j))**2+ld**2))
/float(n)/float(n)
I=In*[1.0]
S_I=sum(sum(I[i]) for i in range(len(I)))
mul=float(n)*float(n)/S_I
I*=[mul]
I*=I
fig = plt.figure()
ax = Axes3D(fig)
X=range(n)
Y=range(n)
ax.plot_surface(X, Y, I, rstride=1, cstride=1, cmap='rainbow')
plt.show()
matlab程序
%作者:cclplus
%时间:2017年12月
clc
clear all;
close all;
%%%%%以下程序用于建立反射镜的模型top
%%%方形镜
n=50;%取点,确定精度
rd=0.005;%确定方形镜的边长
ld=1;%确定谐振腔的长度
%%%%以上程序用于建立反射镜的模型bottom
I=ones(n,n);%假设初始光强处处相等
for t=1:50
In=zeros(n,n);
for i=1:n
for j=1:n
for i1=1:n
for j1=1:n
In(i,j)=In(i,j)+1/(4*pi)*I(i1,j1)*(1+ld/sqrt((rd/n*(i1-i))^2+(rd/n*(j1-j))^2+ld^2))*1/2500;
end
end
end
end
I=In;
end
%%%bottom
S_I=sum(sum(In)');
multipe=n^2/S_I;
I=multipe.*In;
%当找到有一组不符合的数据,即可跳出
%绘制图像
x=1:n;
y=1:n;
I=I.^2;
surf(x,y,I);
shading interp
axis equal
##实验结果图
受衍射的影响,激光的能量逐渐集中
对程序的改进
我想有的人通过Python执行这段程序的时候,估计要怀疑计算机死机了,这确实是个问题,我在第一次写作时确实是等待了很长的运行时间,然后再把图片保存下来。
想要改进这个程序,需要采用动态链接库(dll)的方法
#---------------^_^-------------^_^-------
#利用python仿真双缝实验
#程序再版与2019/1/5,初版写于2017年12月
#作者:cclplus
#仅供学习交流使用
#如有疑问或者需求,可以联系作者707101557@qq.com
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import math
from ctypes import *
#dll = cdll.LoadLibrary('laser.dll');
dll=WinDLL('laser.dll')
class StructPointer(Structure):
_fields_ = [("arr", c_double * 2500)]
def __init__( self ):
for i in range(2500):
self.arr[i]=0.0
dll.laser_mode.restype = POINTER(StructPointer)
n=c_long(50) #方镜上点的个数
n_b=int(50)
k=c_long(30)
#ccl=np.ones((n,n),float)
ccl=StructPointer()
#dll.hello()
ccl=dll.laser_mode(n,k)
I=np.zeros((n_b,n_b),float)
for i in range(n_b):
for j in range(n_b):
I[i][j]=ccl.contents.arr[i*n_b+j]
X=range(n_b)
Y=range(n_b)
fig = plt.figure()
ax = Axes3D(fig)
ax.plot_surface(X,Y,I, rstride=1, cstride=1, cmap='rainbow')
plt.show()
想要获取更详细的相关资料可以访问我的github主页https://github.com/YuruTu/laser