作业帮 > 数学 > 作业

Mathematica 加快计算速度与作图

来源:学生作业帮 编辑:灵鹊做题网作业帮 分类:数学作业 时间:2024/05/14 20:51:12
Mathematica 加快计算速度与作图
Clear["Global`*"];
lamda = 0.6; k = 2.*Pi/lamda;
R = 1.;(*Radius of the diffraction hole*)
z0 = 0.9;(*Distance between the diffraction screen and the reception \
screen*)
ra = 5.;(*Radius of the diffration result*)
dl = 0.1;
intensity = {};
r1 = {\[Rho]1*Cos[\[Theta]1],\[Rho]1*Sin[\[Theta]1],z0};(*Coordinates describing the recption Screen*)
r0 = {x,y,0};(*Coordinates describing the screen where diffraction hole lies*)
\
area = UnitStep[R^2 - x^2 - y^2];
integrand = area*Exp[-I*k*(r0.r1)];
u[\[Rho]1_,\[Theta]1_] :=
NIntegrate[integrand,{x,-R,R},{y,-R,R}];
Do[
Do[AppendTo[
intensity,{\[Rho]1,\[Theta]1,Norm[u[\[Rho]1,\[Theta]1]]^2/Norm[r1[\[Rho]1,\[Theta]1,z0]]}],{\[Rho]1,0.,ra,l}]
,{\[Theta]1,0.,2*Pi,2*Pi*dl}];
ListDensityPlot[intensity,Mesh -> False]
这是一个模拟衍射图像的程序.看看怎么加快一下运行速度,跑了半个小时还没结果.而且,我用希腊字母rou和theta(极坐标)表示投影屏上的点的位置,所以希望画出来的衍射图像能呈圆形而不是方形,但第一次跑出来的结果是方形的图像.
程序的大致意思就是按照老师给出的一个电(磁)振幅积分公式,然后用NIntegrate做积分。取函数u的平方作为光强,画图。
附注:在Append命令中,把r1[/Rho,/Theta,zo]这个函数形式去掉,可以出一些结果,但还是很慢
Mathematica 加快计算速度与作图
l的定义到哪里去了?
再问: copy的时候少了一个字符,那里是(dl),表示步长
再答: 把area的定义用Boole改写: area = Boole[R^2 >= x^2 - y^2]; 然后把数值积分改成符号积分: Integrate[integrand, {x, -R, R}, {y, -R, R}] 这样依旧不够,你的代码里蕴含了低级错误。但是影响速度的项就这些。剩下的错误我就不再找了。
再问: 谢谢您。 可否请您告知如何做出一个圆形的衍射图像,我的图像总是方形的
再答: ListDensityPlot没有坐标系的选项,应该在设参数阶段就用直角坐标,或者对结果进行换算。顺便,如果要进一步增加点数的话,那么请去掉AppendTo,这个指令其实也很拖速度,应改用Flatten和Table。
此外对于你这个的可视化,因为已经获得了解析式,所以其实使用Plot3D或者DensityPlot来出图,会更好: