我正在尝试在圆形网格上绘制函数的渐变。要创建圆形网格,我有以下代码
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
和contour
图。但我也需要渐变,我在matlab中使用gradient
函数,如下所示:
[u, v] = gradient(distanceFunc);
然后quiver
绘制渐变向量。
quiver(X, Y, u, v)
但是我没有为quiver情节找到正确的方向。极地/笛卡尔坐标之间可能有一些变化,但我似乎无法找到它是什么!
答案 0 :(得分:1)
gradient
假定您的distanceFunc
是在x
和y
方向上具有相等网格间距的矩形域上进行评估的。显然,情况并非如此。
有两个选项,从矩形网格插入(使用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))