无法为圆形网格绘制渐变
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
是在 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))
我正在尝试在圆形网格上绘制函数的梯度。要创建圆形网格,我有以下代码
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
是在 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))