MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn moreOpportunities for recent engineering grads.

Apply Today
Asked by Jeremy Pearson on 17 Nov 2012

In general, the syntax for a surf plot is surf(X,Y,Z). I have u = F(r,z). I'd like to do surface plots of u for multiple cross sections at z = h1, h2, h3, etc. Is there a simple way to create a surf plot in cylindrical coordinates, i.e., something that would be analagous to the syntax: surf(r,phi,u) where u = u(r,h1)?

*No products are associated with this question.*

Answer by Jonathan Epperl on 19 Nov 2012

Accepted answer

Or even easier, remember that you're not forced to put just one variable `X` in the first argument of `surf`, all you need is a parametrization. So in your case, assume you have vectors `r` and `phi`. Then make them into a grid, obtain a matrix with z-values using your function F and just plot:

[R PHI] = meshgrid(r,phi); Z = F(R,PHI); % which assumes your function is vectorized surf(R.*cos(PHI), R.*sin(PHI), Z);

Jeremy Pearson on 19 Nov 2012

Jonathan,

Works great! I had to modify the code a little bit to get it to work since F is a function of r and z and not r and phi, but your tip put me in the right direction. This is the code I entered:

>> [r,theta] = meshgrid(linspace(0,0.7,30),linspace(0,2*pi,30));

>> flux = F(r,meshgrid(linspace(0.4,0.4,30))); % new meshgrid defines z

>> surf(r.*cos(theta),r.*sin(theta),flux);

I may have not had to create and extra meshgrid and define everything in linspace but I just fiddled with it until it worked.

Thanks for all your help!

Jeremy

Answer by Matt J on 17 Nov 2012

Use TriScatteredInterp to interpolate your data onto a cartesian grid. Then plot using SURF as usual.

Answer by Teja Muppirala on 19 Nov 2012

You can use POL2CART to convert the data from r/theta to x/y and then call SURF.

[R,TH] = ndgrid(0:0.1:5,linspace(0,2*pi,41));

F = @(r,th) sin(th).*sinc(1+r); Z = F(R,TH);

[X,Y] = pol2cart(TH,R); surf(X,Y,Z);

## 0 Comments