Tuesday, February 19, 2013

Matlab code for wave equation


c=1; % speed of wave;
dx=1; % space step;
dt=0.05; % time step;


szx=200;
szy=200; % size of the drawing area

tm=3000; % time
k=0.002; % decay factor
dsz=3; % droplet size
da=0.07; % droplet amplitude


x=0:dx:(szx-dx); % Generate a x vector from 0 to 200 with step 1
y=0:dx:(szy-dx); % Generate a y vector from 0 to 200 with step 1
t=0:dt:tm; % time, generate a time vector from 0 to 3000 with step 0.05

[X,Y] = meshgrid(x,y); % Create base planes for the graph

Lx=length(x);
Ly=length(y);

u=zeros(Ly,Lx); % initial value (a null matrix for u)
uo=u; % previous = curent => velocties =0

% Initialize the drawing and the axis
close all;
hf=figure;
ha=axes;
hi=imagesc(x,y,u);
set(ha,'clim',[-1 1]); % set colors


D=[0 1 0; 1 -4 1; 0 1 0]; % 2d laplace operator, this will be used in the convolution (probably a laplace 2d operator substitute?)

 % Kdt = decay factor * dt (timestep), that's how much the wave decays per time step
 kdt=k*dt;
 % !!!! this c1 is constant, but I can't figure out what it is
 c1=dt^2*c^2/dx^2;

 % droplet as gaussian, the initial droplet is nothing else but a gaussian in a 2D matrix
 xd=-2*dsz:dx:2*dsz;
 yd=-2*dsz:dx:2*dsz;
 [Xd,Yd] = meshgrid(xd,yd);
 Zd=-da*exp(-(Xd/dsz).^2-(Yd/dsz).^2);


 % Used to count droplets
 One_single_droplet = 0;


 for tt=t
     % !!!!!! Calculate wave equation evolution -> this is exactly where I can't figure out what does this mean
    un=(2-kdt)*u+(kdt-1)*uo+c1*conv2(u,D,'same');

    uo=u; % current become old
    u=un; % new become current

       % Draw the wave updating the graph matrix values (u)
       set(hi,'Cdata',u);
       drawnow;

    % droplets, just one
    if One_single_droplet == 0
        x0d= 100;
        y0d= 100; % droplet center

        % Place the droplet centered on x0d and y0d: adds to the u matrix (the wave function) the gaussian 2d droplet
        u(y0d-2*dsz:y0d+2*dsz,x0d-2*dsz:x0d+2*dsz)=...
            u(y0d-2*dsz:y0d+2*dsz,x0d-2*dsz:x0d+2*dsz)+Zd;

        One_single_droplet = 1;
    end
 end

No comments:

Post a Comment