2017-02-07 216 views
2

我想繪製三維笛卡爾座標系中極座標rtheta的二維函數。我有(抱歉壞數學格式,LaTeX的不兼容,它似乎)如何用MATLAB在三維空間中繪製二維函數?

f(r,theta) = r/2 * (cos(theta - pi/4) + sqrt(1 + 1/2 * cos(2*theta))) 

轉換rtheta到直角座標系

x = r * cos(theta), y = r * sin(theta) 

此外,域是-1<r<10<theta<2 * pi,我定義通過

r = -1:2/50:1; 

theta = 0:2*pi/50:2*pi; 

給我兩個相同維度的向量。

我可以

x = r. * cos(theta); 

y = r. * sin(theta); 

定義用於繪製作爲行向量的xy值,所以現在我需要定義z值,這將取決於價值xy。我想我應該做一個101x101,其中每個矩陣元素包含最終表面的數據點。但我應該怎麼做?我想過使用雙for循環:

for i=1:numel(r) 
    for j=1:numel(theta) 
     z(i,j) = r(i)/2 .* cos(theta(j) - pi/4) + r(i).*sqrt(1 + 1/2 * cos(2.*theta(j))); 
    end 
end 

然後簡單surf(z)

雖然這肯定給我的表面,它給了我不正確的面!我不知道這裏發生了什麼事。圖1給出了不正確的曲面,圖2給出了正確的曲面。任何人都可以幫助我嗎?作爲參考,正確表面用GeoGebra作圖,使用

A = Function[<expression 1>, <Expresison 2>, <Expression 3>, <var 1>, <start>, <stop>, <var 2>, <start>, <stop>] 

Incorrect surface

圖1.不正確的表面。

Correct surface

圖2.正確表面。

+0

你試圖從極性(球形)轉換爲笛卡爾?還是圓柱形到笛卡爾? – toshiomagic

+0

嘗試查看[this](https://www.mathworks.com/matlabcentral/fileexchange/13200-3d-polar-plot)是否可以幫助您。我成功地只繪製了它的上半部分。 – EBH

回答

1

正如其他人所說,你可以使用meshgrid,使這項工作。

這裏是你的例子使用網格rtheta和一個匿名函數來代替雙循環:

r = -1:2/50:1; 
theta = 0:2*pi/50:2*pi; 

% define anonymous function f(r,theta) 
f = @(r,theta) r/2 .* (cos(theta - pi/4) + sqrt(1 + 1/2 .* cos(2.*theta))); 

% generate grids for r and theta 
[r, theta] = meshgrid(r,theta); 
% calculate z from gridded r and theta 
z = f(r,theta); 

% convert r,theta to x,y and plot with surf 
x = r.*cos(theta); 
y = r.*sin(theta); 
surf(x,y,z); 
0

您需要使用meshgrid才能獲得矩陣座標如果您想使用surf。以你的xy(小寫),撥打

[X,Y] = meshgrid(x,y); 

然後XY(大寫)將有相同的價值觀,你給它,但二維數組中的佈局被surf預期。在這裏循環索引並計算你的Z,它應該有all(size(Z) == size(X))

https://www.mathworks.com/help/matlab/ref/meshgrid.html

相關問題