2015-02-06 2 views
0

Я довольно новичок в среде Matlab, и я работаю над симуляцией теплопередачи в Matlab (2014b). Я намерен иметь многослойную стену из разных материалов (на данный момент имеется только один материал - медь) и отображать результаты на одном участке. Все работает нормально, пока я не попытаюсь добавить третий слой стены к сюжету. Ниже приводится определение основных переменных и геометрии для PDE решателем (r3-r0):MatLab PDE plotting issue

k = 400; 
rho = 8960; 
specificHeat = 386; 
thick = .01; 
stefanBoltz = 5.670373e-8; 
hCoeff = 1; 
ta = 300; 
emiss = .5; 

c = thick*k; 
a = sprintf('2*%g + 2*%g*%g*u.^3', hCoeff, emiss, stefanBoltz); 
f = 2*hCoeff*ta + 2*emiss*stefanBoltz*ta^4; 
d = thick*rho*specificHeat; 

r0 = [3 4 0 1 1 0 1 1 1.3 1.3]; 
r1 = [3 4 0 1 1 0 0.6 0.6 1 1]; 
r2 = [3 4 0 1 1 0 0.3 0.3 0.6 0.6]; 
r3 = [3 4 0 1 1 0 0 0 0.3 0.3]; 

Теперь, следующий фрагмент кода вычисляет перенос тепла через нижний слой (r3) стенки, с входом температура 1000 к:

gdm = r3'; 
g = decsg(gdm, 'R3', ('R3')'); 
hmax = .1; % element size 
[p, e, t] = initmesh(g, 'Hmax', hmax);  

numberOfPDE = 1; 
pb = pde(numberOfPDE); 
pg = pdeGeometryFromEdges(g); 
uBottom = pdeBoundaryConditions(pg.Edges(1),'u',1000); 
pb.BoundaryConditions = uBottom; 

u = pdenonlin(pb,p,e,t,c,a,f, 'jacobian', 'lumped'); 
fprintf('Temperature at the top edge of the plate = %5.1f degrees-K\n', ... 
u(4)); 

figure 
pdeplot(p, e, t, 'xydata', u, 'contour', 'on', 'colormap', 'jet') 

hold on 

После того, как «удерживать», я в основном повторить предыдущий код для прямоугольника «r2», с температурой на входе «и (4)» (выход предыдущего слоя), за которым следует этот последний бит кода:

hold off 
axis([0,1,0,2]) 
caxis manual 
caxis([u(4) 1000]); 
colorbar; 

Как я уже сказал, все это работает, и результаты для первого и второго уровней находятся в одном и том же сюжете. Но после повторения процесса для третьего слоя (r1) и построения результатов в исходном рисунке (конечно, бит «hold off» находится в самом конце кода, конечно), график отображает только результат для третий слой. Я не уверен, что это ограничение Matlab или если мое решение неверно, поэтому я хотел бы попросить немного помощи или какого-то направления. Заранее спасибо

Ниже приведен полный код для лучшего понимания:

k = 400; 
rho = 8960; 
specificHeat = 386; 
thick = .01; 
stefanBoltz = 5.670373e-8; 
hCoeff = 1; 
ta = 300; 
emiss = .5; 

c = thick*k; 
a = sprintf('2*%g + 2*%g*%g*u.^3', hCoeff, emiss, stefanBoltz); 
f = 2*hCoeff*ta + 2*emiss*stefanBoltz*ta^4; 
d = thick*rho*specificHeat; 

r0 = [3 4 0 1 1 0 1 1 1.3 1.3]; 
r1 = [3 4 0 1 1 0 0.6 0.6 1 1]; 
r2 = [3 4 0 1 1 0 0.3 0.3 0.6 0.6]; 
r3 = [3 4 0 1 1 0 0 0 0.3 0.3]; 
%--------------------------------------------------------- 

gdm = r3'; 
g = decsg(gdm, 'R3', ('R3')'); 
hmax = .1; % element size 
[p, e, t] = initmesh(g, 'Hmax', hmax); 

numberOfPDE = 1; 
pb = pde(numberOfPDE); 
pg = pdeGeometryFromEdges(g); 
uBottom = pdeBoundaryConditions(pg.Edges(1),'u',1000); 
pb.BoundaryConditions = uBottom; 

u = pdenonlin(pb,p,e,t,c,a,f, 'jacobian', 'lumped'); 
fprintf('Temperature at the top edge of the plate = %5.1f degrees-K\n', ... 
u(4)); 

figure 
pdeplot(p, e, t, 'xydata', u, 'contour', 'on', 'colormap', 'jet') 

hold on 

%---------------------------------------------------------------------- 
gdm = r2'; 
g = decsg(gdm, 'R2', ('R2')'); 
hmax = .1; % element size 
[p, e, t] = initmesh(g, 'Hmax', hmax); 

numberOfPDE = 1; 
pb = pde(numberOfPDE); 
pg = pdeGeometryFromEdges(g); 
uBottom = pdeBoundaryConditions(pg.Edges(1),'u',u(4)); 
pb.BoundaryConditions = uBottom; 

u = pdenonlin(pb,p,e,t,c,a,f, 'jacobian', 'lumped'); 
fprintf('Temperature at the top edge of the plate = %5.1f degrees-K\n', ... 
u(4)); 

pdeplot(p, e, t, 'xydata', u, 'contour', 'on', 'colormap', 'jet') 

%---------------------------------------------------------------------------- 
gdm = r1'; 
g = decsg(gdm, 'R1', ('R1')'); 
hmax = .1; % element size 
[p, e, t] = initmesh(g, 'Hmax', hmax); 

numberOfPDE = 1; 
pb = pde(numberOfPDE); 
pg = pdeGeometryFromEdges(g); 
uBottom = pdeBoundaryConditions(pg.Edges(1),'u',u(4)); 
pb.BoundaryConditions = uBottom; 

u = pdenonlin(pb,p,e,t,c,a,f, 'jacobian', 'lumped'); 
fprintf('Temperature at the top edge of the plate = %5.1f degrees-K\n', ... 
u(4)); 

pdeplot(p, e, t, 'xydata', u, 'contour', 'on', 'colormap', 'jet') 

%---------------------------------------------------------------------------- 
gdm = r0'; 
g = decsg(gdm, 'R0', ('R0')'); 
hmax = .1; % element size 
[p, e, t] = initmesh(g, 'Hmax', hmax); 

numberOfPDE = 1; 
pb = pde(numberOfPDE); 
pg = pdeGeometryFromEdges(g); 
uBottom = pdeBoundaryConditions(pg.Edges(1),'u',u(4)); 
pb.BoundaryConditions = uBottom; 

u = pdenonlin(pb,p,e,t,c,a,f, 'jacobian', 'lumped'); 
fprintf('Temperature at the top edge of the plate = %5.1f degrees-K\n', ... 
u(4)); 

pdeplot(p, e, t, 'xydata', u, 'contour', 'on', 'colormap', 'jet') 

%hold off 

axis([0,1,0,2]) 
%caxis manual 
caxis([u(4) 1000]); 
+1

В конце нет необходимости ни для последнего 'hold off', ни для' caxis manual'. Вы можете удалить их. – Ratbert

+0

спасибо, но это все равно не разрешает мою проблему с сюжетом, отображающим только один слой стены. –

+0

Можете ли вы опубликовать всю свою программу? – Ratbert

ответ

1

По какой-то причине (что не совсем ясно, для меня) функция pdeplot внутренне вызывает hold off.

Итак, для получения желаемого результата вам необходимо добавить hold on после каждого звонка до pdeplot.

+0

Это странное поведение, но оно полностью решило мою проблему. Большое спасибо :) –

Смежные вопросы