MATLAB从Cart到Pol再到Cart坐标的柱面绘图

MATLAB从Cart到Pol再到Cart坐标的柱面绘图,matlab,plot,coordinate-transformation,polar-coordinates,cylindrical,Matlab,Plot,Coordinate Transformation,Polar Coordinates,Cylindrical,1。我想做什么: (i)使用输入n生成n*n笛卡尔网格 [x y] = meshgrid(linspace(-1,1,n)); (ii)生成极坐标 [theta r] = cart2pol(x,y); z = f(theta,r); (iii)在柱坐标中计算函数 [theta r] = cart2pol(x,y); z = f(theta,r); (iv)使用(比如)pcolor(或surf,或任何东西)绘制结果 2。我能做的。。。我能让绘图工作的唯一方法是从我的极

1。我想做什么:
(i)使用输入n生成n*n笛卡尔网格

[x y] = meshgrid(linspace(-1,1,n));  
(ii)生成极坐标

[theta r] = cart2pol(x,y);  
z = f(theta,r);  
(iii)在柱坐标中计算函数

[theta r] = cart2pol(x,y);  
z = f(theta,r);  
(iv)使用(比如)pcolor(或surf,或任何东西)绘制结果

2。我能做的。。。我能让绘图工作的唯一方法是从我的极坐标参数开始,然后从那里返回笛卡尔坐标:
(i)
定义参数

r=linspace(0,1,n); theta=linspace(0,2*pi,n);  
(ii)创建网格并计算f

[theta r]=meshgrid(theta,r);  
[x y]=pol2cart(theta,r);  
z=f(theta,r);  
(iii)绘图

pcolor(x,y,abs(z).^2)  
问题是,现在我的网格是圆形的,我想在矩形网格上到处计算函数(因为我的分析依赖于方形像素阵列)。再次重申,使用上面的方法2,我得到了一个正方形外接的圆形图;想象一个黑色的圆圈,边缘是白色的。。。但是我想计算这个“白色”区域的函数。但是,使用方法1不起作用——当我绘图时,函数都被弄乱了(只需通过谷歌搜索Laguerre-Gauss模式来查看绘图应该是什么样子)

我希望能够从矩形网格开始,为每个点指定一个极坐标,而不是从极坐标开始,为它们指定所有笛卡尔点

我已经断断续续地处理这件事很长时间了,我想不出如何回避这个看似简单的问题

编辑1
问题似乎在于如何生成坐标矩阵。下面我发布了一个简单的3by3示例的屏幕截图,说明了方法1和方法2如何生成不同的数字

如何使这些数字兼容

我没有信誉点,所以我不能直接上传图片。。。下面的链接显示了3by3示例。。。请参阅注释,以获取我试图制作的拉盖尔-高斯图的实际图像链接


编辑2

目前,进近的结果(1.)给出了错误的结果,如下所示:

第二种方法给出了正确的图像,不幸的是,它只是一个圆,而不是整个正方形。如图所示:

显示了两种方法的3D图-只有顶部图形的彩色部分是正确的

编辑3

这是上面正在使用的一个。注意,它要求的输入参数不仅仅是
r,theta
。典型值为:

w0 = 0.5;
p = 0;
l = 5;
函数
C
给出了一个标准化,
L
是拉盖尔多项式。这两种功能都经过了彻底的测试,并得到了预期的结果

编辑4
这里有足够的代码来运行我的示例
z=U(0,5,r,phi,w0)+U(0,-5,r,phi,w0)显式。绘图本身由pcolor(x,y,abs(z)给出。^2)

请注意,
Lpl()
函数作为注释插入。必须将其保存为自己的m文件,U函数才能正常运行

%% Laguerre-Gauss Modes U = U(p,l,r,phi,w0)
%  Source: OAM theory paper section 2.A eqn 1.
%  Assuming POLAR coordinates and evaluating AT beam waist.
% -- That is, z=0 for w(z)=w0(sqrt(1+z/zR)) 
% ---- ie, w(0) = w0
% Assuming z=0 also renders the Gouy phase arctan(z/zR) irrelevant.
% Note: Rayleigh Range zR is not explicitly defined because z=0 --> it is irrelevant too.
% Since zR is the only wavelength dependent term, wavelength also doesn't
% matter.

function out = U(p,l,r,phi,w0)
%Function handles for clarity
e = @(x) exp(x);
C = @(p,l) sqrt((2*factorial(p))/(pi*factorial(p+abs(l))));
L = @(p,l,z) Lpl(p,l,z);

%% Lpl() FUNCTION
% function out = Lpl(p,l,z)
% 
% l=abs(l);
% LL=0;
% for mm=1:p+1
%     m=mm-1;
%     L=LL;
%     LL= L+((-1)^m)*(factorial(p+l)/(factorial(p-m)*factorial(l+m)*factorial(m)))*(z.^m); 
% end
% out = LL;

%% 

out = (C(p,l)/w0)*...
    (((sqrt(2).*r)/w0)^abs(l))*...
    (e((-r.^2)/w0^2))*...
    (L(p,l,((2.*r.^2)/w0^2)))*...
    (e((-1)*1i*l.*phi)); ``
编辑
答案根据问题的编辑4中提供的代码重写

我认为故障源于功能
U
。你并不适用于方程的所有部分。如果将其更改为:

out = (C(p,l)./w0).* ...              % here it's a .* instead of *
    (((sqrt(2).*r)./w0).^abs(l)).* ... % here it's a .* instead of *
    (e((-r.^2)./w0.^2)).* ...          % here it's a .* instead of *
    (L(p,l,((2.*r.^2)./w0.^2))).* ...  % here it's a .* instead of *
    (e((-1)*1i*l.*phi));
您将得到以下两个结果,如下所示

此图使用笛卡尔坐标输入:

这个图使用了极坐标:


第二个图中的“粗糙”分辨率是由于网格的分辨率不太合适。但本质上,您解决了相同的功能

数字不完全相同是有道理的,但是半径为1的圆应该很容易映射成笛卡尔网格,在每个方向上跨越(-1,1)。在我看来,在每种情况下,我都是在同一个域(本质上)上评估函数。显然这不是真的。。。我不知道我错过了什么。非常感谢你的帮助!就这样!!!我已经在大约30种组合上测试了您的解决方案,并且都给出了预期的结果。这实际上是元素乘法中的一个基本错误。thhhannkk YOUUUUUU!!!我的暑期研究终于可以开始了(因为这些函数是我正在做的每件事的基础):)我想确保我做了一切必要的事情,为你提供最大的道具。如果我忘了什么(新的)东西,请告诉我。@caseyfitz:不客气接受答案后,你就没事了。