Contents

file:   pde_heat_transfer_1D_v2.m
author: Polcz Péter <ppolcz@gmail.com>
Created on 2016.12.07. Wednesday, 11:51:36
Reviewed on 2016.12.08. Thursday, 22:43:29
% fname: full path of the actual file
pcz_cmd_fname('fname');
persist = pcz_persist(fname);
%persist.backup();

Hővezetés egyenlete adott kezdeti feltétel mellett

A $u'_t = k u''_{xx}$ hővezetés egyenletét oldjuk meg a következő kezdeti feltétel mellett: $ u(x,0) = f(x) = \left\{ \begin{aligned} &0 &, \text{ ha } x < 0 \\ &e^{-x} &, \text{ ha } x \ge 0 \end{aligned}\right. $
A Matlab pdepe függvénye a következő típusú egyváltozós időfüggő PDE-t tudja megoldani: $c(x,t,u,u'_x) \, u'_t = x^{-m} \frac{\partial}{\partial x} \Big(x^m f(x,t,u,u'_x)\Big) + s(x,t,u,u'_x)$, ahol $m=0,1,2$.
Ha $c = 1$, $m=0$, $f = k u'_x$, $s=0$, akkor épp a hullámegyenletet kapjuk.
A Matlab numerikus megoldója peremfeltételeket is kíván, ezért legyen $u(-5,t) = u(10,t) = 0$.
k = 1;
pde = @(x,t,u,DuDx) deal( 1 , k*DuDx , 0);
ic1 = @(x) exp(-x) * (1 + sign(x)) / 2;
bc = @(xl,ul,xr,ur,t) deal( ul, 0, ur , 0 );

x_lim1 = -5;
x_lim2 = 10;

m = 0;
x = linspace(x_lim1,x_lim2,1000);
t = linspace(0,0.1,201);

sol = pdepe(m,pde,ic1,bc,x,t);
% Extract the first solution component as u.
u = sol(:,:,1);

fig = figure('Position', [165 540 1066 380], 'Color', 'white');
subplot(121),
surf(x,t,u), light, shading interp
xlabel('Distance x')
ylabel('Time t')

clear frames
for i = 10 % 1:numel(t)
    subplot(222),

    u_ref = 0.5 * exp(k*t(i)-x) .* ...
        erfc((2*k*t(i) - x) / sqrt(4*k*t(i)));

    plot(x, [ u(i,:) ; u_ref ]);
    title(sprintf('time = %.4f, %s', t(i),...
        '$u(x,t) = 0.5 e^{kt-x}\,\mathrm{Erfc}\left(\frac{2 k t - x}{2 \sqrt{k t}}\right)$'), 'Interpreter', 'latex'),
    axis([-5, 5, 0, 1.5]);

    L = legend('numerikus megoldás 0-0 kezdeti feltételekkel',...
        'analitikus megoldás végtelen hosszú rúd esetén');
    L.FontSize = 8;

    subplot(224),
    plot(x,(u_ref - u(i,:)))
    L = legend('negyzetes hiba');
    L.Location = 'southeast';
    xlim([-5 5])

    pause(0.1);
    % Felvétel
    % frames(i) = getframe(fig);
end


% v = VideoWriter(persist.simple('fig','heat_diffusion_1D_v2.avi'));
% open(v)
% writeVideo(v,frames)
% close(v)
% persist.savefig('heat_diffusion_1D_v3_poster.png')


Hővezetés egyenlete más kezdeti feltétel mellett

sigma = 1;
k = 1;

pde = @(x,t,u,DuDx) deal( 1 , k*DuDx , 0);
ic2 = @(x) (sigma * sqrt(2*pi)) \ exp(-x.^2 / (2 * sigma^2));
bc = @(xl,ul,xr,ur,t) deal( ul, 0, ur , 0 );

x_lim = 10;

m = 0;
x = linspace(-x_lim,x_lim,1000);
t = linspace(0,2,101);

sol = pdepe(m,pde,ic2,bc,x,t);
% Extract the first solution component as u.
u = sol(:,:,1);

figure('Position', [165 540 1066 380], 'Color', 'white');

% A surface plot is often a good way to study a solution.
subplot(121),
surf(x,t,u), light, shading interp
xlabel('Distance x')
ylabel('Time t')
% zlim([0,10])

subplot(122),
for i = 30 %1:numel(t)
   plot(x, u(i,:));
   title(sprintf('time = %0.2f, $\\int u(x,t) = %g$', t(i), trapz(x, u(i,:))), 'Interpreter', 'latex'),
   axis([-x_lim, x_lim, 0, 1])
   pause(0.1),
end