help-octave
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Trying to solve u_tt - u_xx = 0


From: John B. Thoo
Subject: Trying to solve u_tt - u_xx = 0
Date: Sat, 4 Jul 2009 15:41:03 -0700

Hello, everyone.

I'm trying to solve the wave equation

(E)  u_tt - u_xx = 0,

(I)  u(x,0) = u0,  u_t(x,0) = u0_t.

Since lsode can solve a system of first-order, I define v = u, w = u_t and write (E) as

(E-sys)  v_t = w,  w_t = v_xx,

(I-sys)  v0(x) = u0,  w0(x) = u0_t.

Now comes my difficulty: putting all this into Octave. Actually, I think my code (given below) works correctly.

My question is this: Because I'm new to Octave and numerics in general, can you tell me if my code is decent or how I can improve on it?

%------------------begin here--------------------
%% Set time parameters
%%
t0 = 0;   % initial time
tf = 2;   % final time
M = 20;   % number of time intervals (at least 10 for animation)
dt = (tf - t0)/M;   % time mesh width for plotting (see next line)
t = t0:dt:tf; % time interval for plotting; does not affect the time mesh % used in the solver (either "lsode" or "ode45") which uses
                % its own adaptive time stepping

%% Set space parameters
%%
ord = 8;   % n = 2^ord  space grid points --> n  Fourier modes(?)
x = 0:(2^ord-1);   % }
x = x/2^ord;       % } space interval
x = 2*pi*x;        % }
dx = x(2)-x(1);   % space mesh width

global lx;
lx = length (x);


%% Define the initial conditions

%u0 = exp (-25*(x - 1).^2);
%u0 = exp (-25*(x-1).^2) + 0.6*exp (-9*(x-3).^2);
u0 = cos (x);

%u0_t = zeros (1, lx);
u0_t = -sin (x);


%% "make_k" is to multiply  k  by the fft  correctly
function k = make_k (n)
  k = 1:n;
k = heaviside(n/2 + 1 - k).*(-1*(k - 1)) + heaviside(k - n/2).*(n - k + 1);
  k = -k;
endfunction

global k;
k = make_k (lx);

%% "dderiv" calculates the second derivative in Fourier space
function d2ydx2 = dderiv (u, k)
  d2ydx2 = real (ifft (-k.*k.*fft (u).'));
endfunction

%% Define  v_t  and  w_t
function v_t = f (w, t)
  v_t = w;
endfunction

function w_t = g (v, t)
global k;

  w_t = dderiv (v, k);
endfunction

%% Define the system of ODEs to be solved
function U_t = F (U, t)  % use this for "lsode"
global k;
global lx;

  v = U(1:lx);
  w = U(lx+1:2*lx);

  v_t = f (w, t);
  w_t = g (v, t);

  U_t = [v_t.', w_t];
endfunction


%% Solve the system of ODEs

%lsode_options ("absolute tolerance", 1.0e-2*ones (1, lx));
%lsode_options ("relative tolerance", 1.0e-2);

u = lsode ("F", [u0, u0_t], t);



%% Plot the solution
clf

u = u.';
u = u(1:lx,:);

%% static plot
%
%plot(x, u(:,1), 'r', x, u(:,2), 'g', x, u(:,3), 'b')

%% animation
%
wait = max (1/(tf - t0 + 1), 0.05);   % pause time between frames

N = 10;   % number of time intervals to plot
time = ones (1, N);
time(2:N+1) = floor (M/N)*(1:N) + 1;

for j = 1:N+1
  plot (x, u(:,time(j)));
  title (strcat ('time =', num2str ((tf-t0)*(time(j) - 1)/M)));
%  axis ([0 2*pi -1.5 1.5]);
  axis([0 2*pi 2*min(real(u0)) 2*max(real(u0))]);
  pause(wait);
endfor
%-------------------end here---------------------


Thanks for your patience and your help.

---John.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]