【问题标题】:Plot heat conduction temperature at various radii with Matlab用 Matlab 绘制不同半径处的热传导温度
【发布时间】:2013-08-23 05:00:01
【问题描述】:

我在 Matlab 中有一个数组,每个时间步都会更新:每一行对应一个时间,每一列代表距离中心一定半径的温度。如果可以使用meshgridcontourf 命令将颜色渐变应用于绘图,那也会很方便。到目前为止,这是我拥有的 Matlab 代码,但我不确定如何将温度带入绘图并为温度变化设置动画。

Tinf = 200;  % ambient temperature

% where r1 = radius1, r2 = radius2, etc.
%        t = time
%        rows = time
%        columns = radius

%    r1   r2    r3    r4    r5
T = [98   105   110   118   128;  % t=1
     109  110   117   124   134;  % t=2
     110  118   120   130   144]; % t=3

r = 0.08;  % radius of circle

rx = -r:0.01:r;
ry = r:-0.01:-r;

[x_coor, y_coor] = meshgrid(rx, ry);

radius = sqrt(x_coor.^2+y_coor.^2);

figure(1)
contourf(radius,'edgecolor','none')

我正在尝试在 Matlab 中创建一个圆形图,该图将显示每个半径处的温度(颜色),并在温度随时间增加或减少时对温度(改变颜色)进行动画处理。

这样的情节在某个时间的一个例子是:

所以 T 数组中的第 1 列对应于图片中的节点 1,第 2 列对应于节点 2,依此类推。因此在时间 = 0 时,节点 1 = 98,节点 2 = 105,节点 3 = 110,节点 4 = 118,节点 5 = 128;在时间 = 1 时,节点 1 = 109,节点 2 = 110,节点 3 = 117,节点 4 = 124,节点 5 = 134;等等。

完成这样一个情节的任何建议都会非常有帮助。

【问题讨论】:

    标签: matlab plot geometry matlab-figure heatmap


    【解决方案1】:

    与@Magla 的好答案相同,但绘制了一个允许插值的表面(不是叠加层)

    T = [98   105   110   118   128;
        109  110   117   124   134;
        114  118   120   130   138];
    
    Rmax = 30;
    [x,y,z] = sphere(100);
    x=x*Rmax;
    y=y*Rmax;
    
    rxy2 = x.^2+y.^2;
    
    
    r = [0 10 20 30];
    r2 = r.^2;
    
    figure('Color', 'w');
    
    for ind_t = 1:size(T,1)
        for ii = 1:length(r2)-1
            ir_find = find(rxy2<=r2(ii+1) & rxy2>r2(ii));
            z(ir_find) = T(ind_t,ii);
        end
    
        hax = axes('Position',[0 0 1 1]);
        h = surf(x,y,z)  % sphere centered at origin
    
        shading interp
        set(h, 'EdgeColor', 'None');
    
        view(0,90);
        axis equal;
        set(hax, 'Visible', 'Off', 'CLim', [min(T(:)) max(T(:))]);
        pause(0.5);
    end
    

    编辑

    重写以使用网格网格并使用感兴趣的特定半径等。确保将 r_res 调整为您认为合适的值。

    T = [98   105   110   118   128;
        109  110   117   124   134;
        114  118   120   130   138];
    
    %---------------------------------------
    r = 0.08;  % radius of circle
    
    r_res = 0.0005;
    
    rx = -r:r_res:r;
    ry = rx;
    
    [x, y] = meshgrid(rx, ry);
    
    rxy2 = x.^2+y.^2;
    z=ones(size(rxy2))*NaN;
    
    %---------------------------------------
    
    Nshells = size(T,2);
    r = [0:1/Nshells:1]*r;
    r2 = r.^2;
    
    figure('Color', 'w');
    colormap hot
    
    for ind_t = 1:size(T,1)
        for ii = 1:Nshells
            ir_find = find(rxy2<=r2(ii+1) & rxy2>r2(ii));
            z(ir_find) = T(ind_t,ii);
        end
    
        hax = axes('Position',[0 0 1 1]);
        h = surf(x,y,z)  % sphere centered at origin
    
        shading interp
        set(h, 'EdgeColor', 'None');
    
        view(0,90);
        axis equal;
        set(hax, 'Visible', 'Off', 'CLim', [min(T(:)) max(T(:))]);
        pause(0.5);
    end
    

    【讨论】:

    • 请查看我的更新答案并添加了一些代码。我正在尝试使用meshgridcontourf 命令。
    • 我用contourf 替换了surf 命令。并删除了shading interpset(h,...)view(...) 行,一切正常。我现在要做的就是弄清楚如何显示 x 轴和 y 轴,然后就可以设置了。感谢您的帮助!
    • @Gavin 我忽略了你想使用contourf!很高兴能提供帮助。
    【解决方案2】:

    这是一个使用sphere 的解决方案。 sphere 生成矩阵xy,它们乘以递减的半径r,矩阵z 被缩减为单个值(球体变成圆盘)。 z 乘以温度,然后将磁盘绘制在彼此的顶部。颜色取决于整个输入矩阵的minmax。动画是用pause完成的。

    T = [98   105   110   118   128;
        109  110   117   124   134;
        114  118   120   130   138];
    
    [x,y,z] = sphere(100);
    r = [50 40 30 20 10];
    
    figure('Color', 'w');
    
    for ind_t = 1:size(T,1)
    
        hax = axes('Position',[0 0 1 1]);
    
        for ii = 1:length(r)
            h = surf(x*r(ii),y*r(ii),z*0+T(ind_t,ii))  % sphere centered at origin
            set(h, 'EdgeColor', 'None');
            hold on;
        end
    
        view(0,90);
        axis equal;
        set(hax, 'Visible', 'Off', 'CLim', [min(T(:)) max(T(:))]);
        pause(0.5);
    
    end
    

    这给了

    【讨论】:

    • contourf 中没有渐变。帮助文件说“等值线之间的区域是使用与当前图形的颜色图相对应的恒定颜色绘制的”。您可能希望有一个 Z 数据,该数据使用特定函数填充 2D meshgrid - 一个处理渐变的函数。对吗?
    • 很好,但是随着您向下一列,温度会升高...改用 size(T,1) 吗?
    • @Try Hard - 是的,谢谢! - 混合尺寸。答案已编辑!
    • @Magla 是否可以使用meshgrid 来设置使用半径的坐标,然后使用contourf 命令使用meshgrid 坐标和温度阵列进行绘图?
    • contourf 用于分割连续数据——通常由meshgrid 产生。您拥有的矩阵比连续矩阵更离散(某种五层蛋糕,这意味着您的数据已经分段)。 surf 在这种情况下更合适。如果您想使用contourfmeshgrid,则需要对您的数据进行插值(griddata),但我不确定您是否需要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多