无法绘制圆形网格的渐变

时间:2015-02-09 04:39:34

标签: matlab plot

我正在尝试在圆形网格上绘制函数的渐变。要创建圆形网格,我有以下代码

r0 = 6; 
N = 40;
r = linspace(0, r0, N);
theta = linspace(0, 2*pi, N);
[Theta, R] = meshgrid(theta, r);
[X, Y] = pol2cart(Theta, R); % X,Y grid of a circular mesh on Cartesian Coordinate

我有一个简单的功能

distanceFunc = r0^2 - (X.^2 + Y.^2);

我可以轻松地绘制surfcontour图。但我也需要渐变,我在matlab中使用gradient函数,如下所示:

[u, v] = gradient(distanceFunc);

然后quiver绘制渐变向量。

quiver(X, Y, u, v)

但是我没有为quiver情节找到正确的方向。极地/笛卡尔坐标之间可能有一些变化,但我似乎无法找到它是什么!

1 个答案:

答案 0 :(得分:1)

gradient假定您的distanceFunc是在xy方向上具有相等网格间距的矩形域上进行评估的。显然,情况并非如此。

有两个选项,从矩形网格插入(使用interp2)到圆形网格上进行绘图;

r0 = 6; 
N = 41;
r = linspace(0, r0, N);
theta = linspace(0, 2*pi, N);
[Theta, R] = meshgrid(theta, r);
[X2, Y2] = pol2cart(Theta, R);

[X,Y]=meshgrid(linspace(-r0,r0,N)); %// rectangular grid for gradient
distanceFunc = r0^2 - (X.^2 + Y.^2);    
[u, v] = gradient(distanceFunc);

u2=interp2(X,Y,u,X2,Y2); %// interpolate u and v back on to circular grid
v2=interp2(X,Y,v,X2,Y2);

quiver(X2,Y2,u2,v2)

或者,使用符号代数查找渐变函数并绘制它们;

r0 = 6; 
N = 41;
r = linspace(0, r0, N);
theta = linspace(0, 2*pi, N);
[Theta, R] = meshgrid(theta, r);
[X2, Y2] = pol2cart(Theta, R);

syms X Y %// initialise symbolic variables
distanceFunc = r0^2 - (X.^2 + Y.^2); %// define distanceFunc

%// Find derivatives in each direction and convert to numeric functions with matlabFunction
u=matlabFunction(diff(distanceFunc,X),'vars',{'X','Y'});
v=matlabFunction(diff(distanceFunc,Y),'vars',{'X','Y'});

%// plot the result
quiver(X2,Y2,u(X2,Y2),v(X2,Y2))