> restart:#"m11_p31"

Considérese una gruesa capa de agua lìquida inicialmente a 0 ºC y que a partir de un cierto instante se mantiene una de sus caras a -50 ºC (problema de Stefan). Se pide:

a) Encontrar la solución de semejanza que resuelve el problema.

b) Estimar el tiempo que tardaría en formarse una costra de hielo de 1 cm

c) Perfil de temperaturas en ese instante.

Datos:

Image

> read`../therm_eq.m`:read`../therm_const.m`:read`../therm_proc.m`:with(therm_proc):assume(a>0,b>0):

> su1:="Hielo":su2:="H2O":dat:=[Tf=(273+0)*K_,DT=50*K_,L=0.01*m_];

`:=`(dat, [Tf = `+`(`*`(273, `*`(K_))), DT = `+`(`*`(50, `*`(K_))), L = `+`(`*`(0.1e-1, `*`(m_)))])

Eqs. const.:

> sdat:=get_sol_data(su1):dat:=op(dat),sdat,a[sol]=subs(sdat,k/(rho*c)),Const,SI1,SI2:ldat:=get_liq_data(su2):

a) Encontrar la solución de semejanza que resuelve el problema.

Basta estudiar la fase sólida (en la líquida no hay transmisión de calor). La ecuación es eqBE y las condiciones iniciales (I) y de contorno (C) son:

> eqBE:=subs(phi=0,eq11_6_11);eqI1:=T(t=0,x)=Tf;eqC1:=T(t,x=0)=Tf+DT;eqC2:=T(t,x=xf)=Tf;eqC3:=k*limit(diff(T(t,x),x),x=xf,left)=rho*h[sl0]*diff(xf(t),t);

`:=`(eqBE, diff(T(x, t), t) = `*`(a, `*`(diff(T(x, t), `$`(x, 2)))))

`:=`(eqI1, T(t = 0, x) = Tf)

`:=`(eqC1, T(t, x = 0) = `+`(Tf, DT))

`:=`(eqC2, T(t, x = xf) = Tf)

`:=`(eqC3, `*`(k, `*`(diff(T(t, xf), xf))) = `*`(rho, `*`(h[sl0], `*`(diff(xf(t), t)))))

> eqX1:=theta=(Tf-T)/DT;eqX2:=xi=x/L;eqX3:=tau=t*a/L^2;eqJa:=Ja=c*DT/h[lv0];eqX4:=zeta=xi/sqrt(4*tau);

`:=`(eqX1, theta = `/`(`*`(`+`(Tf, `-`(T))), `*`(DT)))

`:=`(eqX2, xi = `/`(`*`(x), `*`(L)))

`:=`(eqX3, tau = `/`(`*`(t, `*`(a)), `*`(`^`(L, 2))))

`:=`(eqJa, Ja = `/`(`*`(c, `*`(DT)), `*`(h[lv0])))

`:=`(eqX4, zeta = `+`(`/`(`*`(`/`(1, 2), `*`(xi)), `*`(`^`(tau, `/`(1, 2))))))

> eqBE_:=diff(theta(xi,tau),tau)=diff(theta(xi,tau),xi,xi);eqI1_:=theta(xi,0)=0;eqC1_:=theta(0,tau)=1;eqC2_:=theta(xif(tau),tau)=0;eqC3_:=limit(diff(theta(xi,tau),xi),xi=xif,left)=-(1/Ja)*diff(xif(tau),tau);

`:=`(eqBE_, diff(theta(xi, tau), tau) = diff(theta(xi, tau), `$`(xi, 2)))

`:=`(eqI1_, theta(xi, 0) = 0)

`:=`(eqC1_, theta(0, tau) = 1)

`:=`(eqC2_, theta(xif(tau), tau) = 0)

`:=`(eqC3_, diff(theta(xif, tau), xif) = `+`(`-`(`/`(`*`(diff(xif(tau), tau)), `*`(Ja)))))

> zeta(xi,tau):=xi/sqrt(4*tau);eq1:=lhs(eqBE_)=diff(theta(zeta),zeta)*diff(zeta(xi,tau),tau);eq2:=diff(theta(xi),xi)=diff(theta(zeta),zeta)*diff(zeta(xi,tau),xi);eq3:=rhs(eqBE_)=diff(rhs(eq2),zeta)*diff(zeta(xi,tau),xi);eqBE__:=subs(zeta(xi,tau)=zeta,xi=zeta*sqrt(4*tau),rhs(eq1)=rhs(eq3))*4*tau;dsol1:=dsolve({eqBE__,theta(0)=1,theta(zetaf)=0},theta(zeta));

`:=`(zeta(xi, tau), `+`(`/`(`*`(`/`(1, 2), `*`(xi)), `*`(`^`(tau, `/`(1, 2))))))

`:=`(eq1, diff(theta(xi, tau), tau) = `+`(`-`(`/`(`*`(`/`(1, 4), `*`(diff(theta(zeta), zeta), `*`(xi))), `*`(`^`(tau, `/`(3, 2)))))))

`:=`(eq2, diff(theta(xi), xi) = `+`(`/`(`*`(`/`(1, 2), `*`(diff(theta(zeta), zeta))), `*`(`^`(tau, `/`(1, 2))))))

`:=`(eq3, diff(theta(xi, tau), `$`(xi, 2)) = `+`(`/`(`*`(`/`(1, 4), `*`(diff(theta(zeta), `$`(zeta, 2)))), `*`(tau))))

`:=`(eqBE__, `+`(`-`(`*`(2, `*`(diff(theta(zeta), zeta), `*`(zeta))))) = diff(theta(zeta), `$`(zeta, 2)))

Error, (in dsolve/func_in_args/check) the independent variable (zeta in theta(zeta)) cannot be a procedure name

¡Vaya! no vale zeta; pongamos zeta_.

> dsol1:=dsolve({-2*diff(theta(zeta_),zeta_)*zeta_=diff(theta(zeta_),zeta_,zeta_),theta(0)=1,theta(zetaf)=0},theta(zeta_));dsol1:=subs(zeta_=zeta,%);

`:=`(dsol1, theta(zeta_) = `+`(1, `-`(`/`(`*`(erf(zeta_)), `*`(erf(zetaf))))))

`:=`(dsol1, theta(zeta) = `+`(1, `-`(`/`(`*`(erf(zeta)), `*`(erf(zetaf))))))

> eqC31:=subs(zeta=zetaf,eval(subs(subs(dsol1,eq2))));eqC32:=rhs(eqC3_)=eval(subs(xif(tau)=2*zetaf*sqrt(tau),rhs(eqC3_)));eqC3__:=rhs(eqC31)=rhs(eqC32);eqC3___:=Ja=simplify(solve(eqC3__,Ja));

`:=`(eqC31, diff(theta(xi), xi) = `+`(`-`(`/`(`*`(exp(`+`(`-`(`*`(`^`(zetaf, 2)))))), `*`(`^`(Pi, `/`(1, 2)), `*`(erf(zetaf), `*`(`^`(tau, `/`(1, 2)))))))))

`:=`(eqC32, `+`(`-`(`/`(`*`(diff(xif(tau), tau)), `*`(Ja)))) = `+`(`-`(`/`(`*`(zetaf), `*`(Ja, `*`(`^`(tau, `/`(1, 2))))))))

`:=`(eqC3__, `+`(`-`(`/`(`*`(exp(`+`(`-`(`*`(`^`(zetaf, 2)))))), `*`(`^`(Pi, `/`(1, 2)), `*`(erf(zetaf), `*`(`^`(tau, `/`(1, 2)))))))) = `+`(`-`(`/`(`*`(zetaf), `*`(Ja, `*`(`^`(tau, `/`(1, 2))))))))

`:=`(eqC3___, Ja = `*`(zetaf, `*`(`^`(Pi, `/`(1, 2)), `*`(erf(zetaf), `*`(exp(`*`(`^`(zetaf, 2))))))))

b) Estimar el tiempo que tardaría en formarse una costra de hielo de 1 cm

> eqJa;eq1:=subs(dat,ldat,dat,eqJa);eq2:=zetaf=fsolve(subs(eq1,eqC3___),zetaf=0..1);eq3:=subs(eq2,dsol1);plot(subs(eq2,{[[zetaf,-10],[zetaf,10]],rhs(eq3)}),zeta=0..1,theta=-1..1,color=black);

Ja = `/`(`*`(c, `*`(DT)), `*`(h[lv0]))

`:=`(eq1, Ja = 0.4519273371e-1)

`:=`(eq2, zetaf = .1492078373)

`:=`(eq3, theta(zeta) = `+`(1, `-`(`/`(`*`(erf(zeta)), `*`(erf(.1492078373))))))
Plot_2d

> assume(L>0):eq3_:=simplify(eval(subs(eqX4,eqX3,eqX2,eqX1,theta=rhs(eq3))));eq3__:=subs(a=a[sol],dat,eq3_);eq3_xf_:=subs(T=Tf,x=xf,dat,eq3__);t_xf_L:=fsolve(subs(xf=L,dat,SI0,eq3_xf_),t=0..1e4)*s_;

`:=`(eq3_, `+`(`-`(`/`(`*`(`+`(`-`(Tf), T)), `*`(DT)))) = `+`(1., `-`(`*`(5.983656417, `*`(erf(`+`(`/`(`*`(.5000000000, `*`(x)), `*`(`^`(a, `/`(1, 2)), `*`(`^`(t, `/`(1, 2))))))))))))

`:=`(eq3__, `+`(`-`(`/`(`*`(`/`(1, 50), `*`(`+`(`-`(`*`(273, `*`(K_))), T))), `*`(K_)))) = `+`(1., `-`(`*`(5.983656417, `*`(erf(`+`(`/`(`*`(451.9089944, `*`(x)), `*`(`^`(`/`(`*`(`^`(m_, 2)), `*`(s_)),...

`:=`(eq3_xf_, 0 = `+`(1., `-`(`*`(5.983656417, `*`(erf(`+`(`/`(`*`(451.9089944, `*`(xf)), `*`(`^`(`/`(`*`(`^`(m_, 2)), `*`(s_)), `/`(1, 2)), `*`(`^`(t, `/`(1, 2))))))))))))

`:=`(t_xf_L, `+`(`*`(917.3154320, `*`(s_))))

i.e. se tardarían unos 900 s en congelar 1 cm.

> T_:=subs(eq2,a=a[sol],dat,SI0,(Tf-DT*subs(zeta=x/(2*L*sqrt(t*a[sol]/L^2)),rhs(eq3_))));plot({[x,subs(t=917,T_-273),x=0..0.01],[x,subs(dat,SI0,Tf)-273,x=0.01..0.015]},x=0..0.015,color=black,thickness=2);

`:=`(T_, `+`(223., `*`(299.1828208, `*`(erf(`+`(`/`(`*`(451.9089944, `*`(x)), `*`(`^`(t, `/`(1, 2))))))))))
Plot_2d

i.e. el perfil de temperaturas en el hielo es lineal a todos los efectos, lo que podríamos haber supuesto para simplificar enormemente el problema, que ahora quedaría plateado así:

> eqC3;eqC3:=k*DT/xf(t)=rhs(%);dsolve({%,xf(0)=0},xf(t));xf_:=rhs(%[1]);

`*`(k, `*`(diff(T(t, xf), xf))) = `*`(rho, `*`(h[sl0], `*`(diff(xf(t), t))))

`:=`(eqC3, `/`(`*`(k, `*`(DT)), `*`(xf(t))) = `*`(rho, `*`(h[sl0], `*`(diff(xf(t), t)))))
xf(t) = `/`(`*`(`^`(2, `/`(1, 2)), `*`(`^`(`*`(rho, `*`(h[sl0], `*`(k, `*`(DT, `*`(t))))), `/`(1, 2)))), `*`(rho, `*`(h[sl0]))), xf(t) = `+`(`-`(`/`(`*`(`^`(2, `/`(1, 2)), `*`(`^`(`*`(rho, `*`(h[sl0],...

`:=`(xf_, `/`(`*`(`^`(2, `/`(1, 2)), `*`(`^`(`*`(rho, `*`(h[sl0], `*`(k, `*`(DT, `*`(t))))), `/`(1, 2)))), `*`(rho, `*`(h[sl0]))))

y podemos comparar la evolución del frente con esta aproximación y la exacta.

> xf__:=evalf(subs(ldat,dat,SI0,xf_));xf_exact:=subs(eq2,sdat,SI0,sqrt(zetaf*k*t/(rho*c)));plot([xf__,xf_exact],t=0..1000);

`:=`(xf__, `+`(`*`(0.4242649172e-3, `*`(`^`(t, `/`(1, 2))))))

`:=`(xf_exact, `+`(`*`(0.4273806321e-3, `*`(`^`(t, `/`(1, 2))))))
Plot_2d

la coincidencia es perfecta.

>