【问题标题】:Heatmap on a sphere球体上的热图
【发布时间】:2018-04-25 21:54:20
【问题描述】:

我做了一个项目,我正在冷却一个金属球。现在我想在 Matlab 中模拟球体表面的温度。我有我想在 r=1 处绘制的傅立叶序列 u(r,t)。我如何绘制这个?到目前为止我有

R=1
t=0;
N=1000;
T0=-10;
T1=10;
a=1.3*(10^-7);
u=T0;

[x,y,z]= meshgrid(0:.1:R, 0:.1:R, 0:.1:R);
S= sqrt(x.^2+ y.^2 + z.^2);
r=1
for k= 1:1:N;

    La_k= (k.*(pi)/R).^2;
    r_k=(r.^(-1)).*sin(sqrt(La_k).*r);
    u= u+ ((T1-T0)^2) *  ((-1)^(k+1))  *  (R/(k*(pi)))  *  exp(-a.*La_k.*t)        
end
surf(x,y,u)
colorbar
colormap(jet)

【问题讨论】:

  • RN的值是多少?
  • R 是金属球的半径,所以在本例中 R=1。
  • N 是我从傅里叶级数中包含的术语。
  • 您似乎想绘制u(r=1, t),但您没有记录历史演变过程。还有,x,y,zu中没有使用,是不是因为它只取决于半径大小?
  • 是的,我想绘制 u(r=1,t)。是的,温度仅取决于 r 和 t

标签: matlab plot heatmap


【解决方案1】:

您可以随时记录u的演变。 由于温度仅取决于半径,因此对于每个时间范围,您必须将单个温度值转换为surf 可接受的矩阵,即CData,其大小与x,y,z 相同。

r=1;
t=0;
N=1000;
T0=-10;
T1=10;
a=1.3e-7;

% evaluate u(r,t) at each time step, and record
[x,y,z]= sphere(100);
u = zeros(N,1);
u(1) = T0;
for k = 2:N
    La_k= (k*pi/r)^2;
    r_k=(r^-1).*sin(sqrt(La_k)*r);
    u(k) = u(k-1)+ (T1-T0)^2 * (-1)^(k+1) * r_k/(k*pi) * exp(-a*La_k*t);
end
% create dummy plot
hs = surf(x,y,z,nan(size(z)));
colorbar
colormap(jet)
title(' ')
% fix color scale so you can see color change along with time
hs.Parent.CLim = [min(u),max(u)];
% iterate over time and show temperature with color
for kk = 1:N
    hs.CData = ones(size(z))*u(kk);
    title(sprintf('t = %d', kk))
    drawnow
    pause(0.01)
end

【讨论】:

  • 谢谢。在 u(k) 中,你忘记包含 r_k。
  • @hola 刚刚做了。
  • 如果我想要更长的时间,我会增加N,但是为什么颜色条不会随之改变?
  • 它只是从 -10 到 -9.9999999
  • @hola 这里有两个问题。首先,我认为系统趋于稳定。随着时间的推移,您可能会看到温度的变化越来越小。其次,t 在循环中不会改变。你可以考虑使用dt,但具体的实现真的取决于你的物理问题。
猜你喜欢
  • 2017-11-19
  • 2018-08-10
  • 1970-01-01
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-11
相关资源
最近更新 更多