【问题标题】:Can't plot gradient for a circular mesh无法绘制圆形网格的渐变
【发布时间】:2015-02-10 06:03:51
【问题描述】:

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

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 情节找到正确的方向。极坐标/笛卡尔坐标之间可能有一些变化,但我似乎找不到它是什么!

【问题讨论】:

    标签: matlab plot


    【解决方案1】:

    gradient 假设您的distanceFuncxy 方向上具有相等网格间距的矩形域上进行评估。显然这里不是这样。

    有两个选项,或者从矩形网格插入(使用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)) 
    

    【讨论】:

    • 谢谢。但我希望保留圆形网格,因为它可以生成更好的 3D 图。
    • 谢谢。正是我想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多