2013-08-21 85 views
2

我在Matlab中有一個數組,每個時間步更新:每行對應一個時間,每列代表距離中心一定半徑處的溫度。如果可以使用meshgridcontourf命令將顏色漸變應用於繪圖,它也會很方便。到目前爲止,這是我有的Matlab代碼,但我不知道如何將溫度加入到繪圖中並使溫度變化動畫化。使用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圓形的情節,將顯示在每個半徑的溫度(顏色)和動態顯示溫度(變色),因爲它增加或隨時間而減少。

在一定的時間這樣的情節的一個例子是:

radius temperature

所以第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;等等。

任何建議來完成這樣的情節將是非常有益的。

回答

2

同@ 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 

編輯

重寫了使用meshgrid並使用感興趣的特定半徑等。確保將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 
+0

請參閱我更新的答案並添加了一些代碼。我正在嘗試使用'meshgrid'和'contourf'命令。 – wigging

+0

@Gavin我更新了代碼,看看... –

+1

我用'contourf'替換了'surf'命令。並刪除了'陰影interp','set(h,...)'和'view(...)'行,一切正常。我現在所要做的就是弄清楚如何顯示x和y軸,然後我將被設置。謝謝您的幫助! – wigging

1

這是一個使用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 

這給

enter image description here

+0

'contourf'中沒有漸變。幫助文件顯示「等值線之間的區域使用與當前圖形的色彩圖對應的常量顏色繪製」。你可能想要一個'Z'數據來填充2D'meshgrid'和一個特殊的函數 - 一個處理漸變的函數。是對的嗎? – marsei

+0

不錯,但是當你沿着一個柱子升高溫度時......用尺寸(T,1)代替? –

+0

@苦惱 - 是的,謝謝! - 混合了尺寸。回答編輯! – marsei

相關問題