无法为圆形网格绘制渐变

Can't plot gradient for a circular mesh

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

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);

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

[u, v] = gradient(distanceFunc);

然后 quiver 绘制梯度向量。

quiver(X, Y, u, v)

但我没有得到 quiver 情节的正确指示。 Polar/Cartesian 坐标之间可能有一些变化,但我似乎找不到它是什么!

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))