Links to .m source file and .out output file, click to read test_mtx.m source file test_mtx_m.out output file
Links to .m source file and .png output, shown below
stiff1.m  source file using ode23
stiff1_m.png  plot output
% stiff1.m  using  ode23
% y1' = y2    y2' = (1-y1^2)*y2-y1
function stiff1()
  [t,y]=ode23(@vdp, [0 20], [2; 0]);
  plot(t,y(:,1),'-o',t,y(:,2),'-o')
  title('Solution of van der Pol Equation (\mu = 1) with ODE23');
  xlabel('Time t');
  ylabel('Solution y');
  legend('y_1','y_2')
  function dydt = vdp(t, y)
    dydt = [y(2); (1-y(1)^2)*y(2)-y(1)];
  end % vdp
end % stiff1
 Links to .m source file and .png output, shown below
stiff.m  source file using ode15s
stiff_m.png  plot output
% stiff.m  using  ode15s
% y1' = y2    y2' = 1000*(1-y1^2)*y2-y1
function stiff()
  [t,y]=ode15s(@vdp1000, [0 3000], [2 0]);
  plot(t,y(:,1),'-o')
  title('Solution with(\mu = 1000) with ODE15');
  xlabel('Time t');
  ylabel('Solution y');
  legend('y_1','y_2')
  function dydt = vdp1000(t, y)
    dydt = [y(2); 1000*(1-y(1)^2)*y(2)-y(1)];
  end % vdp1000
end % stiff
Links to .m source file and .png output, shown below
stiff.m  source file using ode15s
stiff_m.png  plot output
% stiff.m  using  ode15s
% y1' = y2    y2' = 1000*(1-y1^2)*y2-y1
function stiff()
  [t,y]=ode15s(@vdp1000, [0 3000], [2 0]);
  plot(t,y(:,1),'-o')
  title('Solution with(\mu = 1000) with ODE15');
  xlabel('Time t');
  ylabel('Solution y');
  legend('y_1','y_2')
  function dydt = vdp1000(t, y)
    dydt = [y(2); 1000*(1-y(1)^2)*y(2)-y(1)];
  end % vdp1000
end % stiff
 Links to .m source file and .png output, shown below
difeq1.m  ODE definition, first order
run_difeq1.m  source file using ode45
difeq1_m.png  plot output
% difeq1.m  simple ODE
function dydt=difeq1(t,y)
dydt = t*t + 2.0*t + 3.0;
% run_difeq1.m  simple first order
t_range = [0 1];
[t,y] = ode45(@difeq1, t_range, [0]);
size(t);
size(y);
for i=1:20
    j=(i-1.0)/19.0;
    t2(i) = j;
    y2(i) = j*j*j/3.0 + j*j + 3.0*j;
end
plot(t, y, t2, y2, '--');
xlabel('time');
ylabel('y');
title('ODE solution and exact solution');
Links to .m source file and .png output, shown below
difeq1.m  ODE definition, first order
run_difeq1.m  source file using ode45
difeq1_m.png  plot output
% difeq1.m  simple ODE
function dydt=difeq1(t,y)
dydt = t*t + 2.0*t + 3.0;
% run_difeq1.m  simple first order
t_range = [0 1];
[t,y] = ode45(@difeq1, t_range, [0]);
size(t);
size(y);
for i=1:20
    j=(i-1.0)/19.0;
    t2(i) = j;
    y2(i) = j*j*j/3.0 + j*j + 3.0*j;
end
plot(t, y, t2, y2, '--');
xlabel('time');
ylabel('y');
title('ODE solution and exact solution');
 Links to .m source file and .png output, shown below
difeq1.m  ODE definition, first order
run_difeq1.m  source file using ode45
difeq1_m.png  plot output
% difeq2.m  second order
function dydt=difeq2(t,y)
   dydt = [y(2);-y(1)]; % dy^2 = -y   y=sin(t)
% run_difeq2.m   second order
t_range = [0 6.28];
[t,y] = ode45(@difeq2, t_range, [0 1.0]);
size(t);
size(y);
for i=1:64
    j=(i-1.0)/10.0;
    t2(i) = j;
    y2(i) = sin(j);
end
plot(t, y(:,1), t, y(:,2), '.', t2, y2, '--');
xlabel('time');
ylabel('y');
title('ODE solution and first, and exact solution');
Links to .m source file and .png output, shown below
difeq1.m  ODE definition, first order
run_difeq1.m  source file using ode45
difeq1_m.png  plot output
% difeq2.m  second order
function dydt=difeq2(t,y)
   dydt = [y(2);-y(1)]; % dy^2 = -y   y=sin(t)
% run_difeq2.m   second order
t_range = [0 6.28];
[t,y] = ode45(@difeq2, t_range, [0 1.0]);
size(t);
size(y);
for i=1:64
    j=(i-1.0)/10.0;
    t2(i) = j;
    y2(i) = sin(j);
end
plot(t, y(:,1), t, y(:,2), '.', t2, y2, '--');
xlabel('time');
ylabel('y');
title('ODE solution and first, and exact solution');
 
Links to .m source file and .png output, shown below
driver_cg.m  source file to be timed
test_driver_cg.m  source file various n
test_driver_cg_m.out timing output various n
driver_cg4.png  one plot output
function driver_cg(N,fid)
  h = 1 / (N+1);
  x = [h : h : 1-h];
  y = x;
  [X, Y] = ndgrid(x,y);
  F = (-2*pi^2) * (cos(2*pi*X).*(sin(pi*Y)).^2 + (sin(pi*X)).^2.*cos(2*pi*Y));
  b = h^2 * F(:);
  clear X Y F;
  tic;
  A = setupA(N);
  tol = 1.0e-6;
  maxit = 99999;
  u = zeros(N^2,1);
  [u,flag,relres,iter,resvec] = pcg(A,b,tol,maxit,[],[],u);
  Uint = reshape(u, [N N]); % N.B.: Uint has only solutions on interior points
  timesec = toc;
  % append boundary to x, y, and to U:
  x = [0 x 1];
  y = [0 y 1];
  [X, Y] = ndgrid(x,y);
  U = zeros(size(X));
  U(2:end-1,2:end-1) = Uint;
  % plot numerical solution:
  figure;
  H = mesh(X,Y,U);
  xlabel('x');
  ylabel('y');
  zlabel('u');
  % compute and plot numerical error:
  Utrue = (sin(pi*X)).^2 .* (sin(pi*Y)).^2;
  E = U - Utrue;
  figure;
  H = mesh(X,Y,E);
  xlabel('x');
  ylabel('y');
  zlabel('u-u_h');
  % compute L^inf norm of error and print:
  enorminf = max(abs(E(:)));
  fprintf(fid,'N = %5d\n', N);
  fprintf(fid,'tol = %10.1e, maxit = %d\n', tol, maxit);
  fprintf(fid,'flag = %1d, iter = %d, relres = %24.16e\n', flag, iter, relres);
  fprintf(fid,'h                  = %24.16e\n', h);
  fprintf(fid,'h^2                = %24.16e\n', h^2);
  fprintf(fid,'enorminf           = %24.16e\n', enorminf);
  fprintf(fid,'C = enorminf / h^2 = %24.16e\n', (enorminf/h^2));
  fprintf(fid,'wall clock time    = %10.2f seconds\n', timesec);
  function A = setupA(N)
    I = speye(N);
    s = [-1*ones(1,N-1) 2*ones(1,N) -1*ones(1,N-1)]';
    i = [2:N    1:N  1:N-1]';
    j = [1:N-1  1:N  2:N  ]';
    T = sparse(i,j,s);
    A = kron(I,T) + kron(T,I);
% test_driver_cg.m  Gobberts driver_cg.m
function test_driver_cg
  fid=fopen('test_driver_cg_m.out','w');  
  N=4;
  fprintf(fid,'test_driver_cg running, N=%d \n', N);
  driver_cg(N,fid);
  fprintf(fid,'driver_cg ran, N=%d \n\n', N);
  N=8;
  fprintf(fid,'test_driver_cg running, N=%d \n', N);
  driver_cg(N,fid);
  fprintf(fid,'driver_cg ran, N=%d \n\n', N);
  N=16;
  fprintf(fid,'test_driver_cg running, N=%d \n', N);
  driver_cg(N,fid);
  fprintf(fid,'driver_cg ran, N=%d \n\n', N);
  N=32;
  fprintf(fid,'test_driver_cg running, N=%d \n', N);
  driver_cg(N,fid);
  fprintf(fid,'driver_cg ran, N=%d \n\n', N);
  N=64;
  fprintf(fid,'test_driver_cg running, N=%d \n', N);
  driver_cg(N,fid);
  fprintf(fid,'driver_cg ran, N=%d \n\n', N);
  N=128;
  fprintf(fid,'test_driver_cg running, N=%d \n', N);
  driver_cg(N,fid);
  fprintf(fid,'driver_cg ran, N=%d \n\n', N);
  N=256;
  fprintf(fid,'test_driver_cg running, N=%d \n', N);
  driver_cg(N,fid);
  fprintf(fid,'driver_cg ran, N=%d \n\n', N);
  N=512;
  fprintf(fid,'test_driver_cg running, N=%d \n', N);
  driver_cg(N,fid);
  fprintf(fid,'driver_cg ran, N=%d \n\n', N);
  N=1024;
  fprintf(fid,'test_driver_cg running, N=%d \n', N);
  driver_cg(N,fid);
  fprintf(fid,'driver_cg ran, N=%d \n\n', N);
  fprintf(fid,'test_driver_cg finished \n');
end % test_driver_cg
test_driver_cg running, N=4 
N =     4
tol =    1.0e-06, maxit = 99999
flag = 0, iter = 3, relres =   4.0645864755649299e-16
h                  =   2.0000000000000001e-01
h^2                =   4.0000000000000008e-02
enorminf           =   1.1672672560746400e-01
C = enorminf / h^2 =   2.9181681401865993e+00
wall clock time    =       0.18 seconds
driver_cg ran, N=4 
test_driver_cg running, N=8 
N =     8
tol =    1.0e-06, maxit = 99999
flag = 0, iter = 10, relres =   1.3833872844782684e-15
h                  =   1.1111111111111110e-01
h^2                =   1.2345679012345678e-02
enorminf           =   3.9152467804694280e-02
C = enorminf / h^2 =   3.1713498921802370e+00
wall clock time    =       0.02 seconds
driver_cg ran, N=8 
test_driver_cg running, N=16 
N =    16
tol =    1.0e-06, maxit = 99999
flag = 0, iter = 24, relres =   6.6499448293299502e-07
h                  =   5.8823529411764705e-02
h^2                =   3.4602076124567475e-03
enorminf           =   1.1267467797972608e-02
C = enorminf / h^2 =   3.2562981936140836e+00
wall clock time    =       0.02 seconds
driver_cg ran, N=16 
test_driver_cg running, N=32 
N =    32
tol =    1.0e-06, maxit = 99999
flag = 0, iter = 48, relres =   5.5636640914657905e-07
h                  =   3.0303030303030304e-02
h^2                =   9.1827364554637292e-04
enorminf           =   3.0127765546470453e-03
C = enorminf / h^2 =   3.2809136680106321e+00
wall clock time    =       0.02 seconds
driver_cg ran, N=32 
test_driver_cg running, N=64 
N =    64
tol =    1.0e-06, maxit = 99999
flag = 0, iter = 96, relres =   7.0188563830089490e-07
h                  =   1.5384615384615385e-02
h^2                =   2.3668639053254440e-04
enorminf           =   7.7810619700791062e-04
C = enorminf / h^2 =   3.2874986823584220e+00
wall clock time    =       0.04 seconds
driver_cg ran, N=64 
test_driver_cg running, N=128 
N =   128
tol =    1.0e-06, maxit = 99999
flag = 0, iter = 192, relres =   9.3340277731590903e-07
h                  =   7.7519379844961239e-03
h^2                =   6.0092542515473829e-05
enorminf           =   1.9764834768531969e-04
C = enorminf / h^2 =   3.2890661538314050e+00
wall clock time    =       0.24 seconds
driver_cg ran, N=128 
test_driver_cg running, N=256 
N =   256
tol =    1.0e-06, maxit = 99999
flag = 0, iter = 387, relres =   8.9244309654496858e-07
h                  =   3.8910505836575876e-03
h^2                =   1.5140274644582053e-05
enorminf           =   4.9797438427923169e-05
C = enorminf / h^2 =   3.2890710107258974e+00
wall clock time    =       1.94 seconds
driver_cg ran, N=256 
test_driver_cg running, N=512 
N =   512
tol =    1.0e-06, maxit = 99999
flag = 0, iter = 783, relres =   9.0704526218887027e-07
h                  =   1.9493177387914229e-03
h^2                =   3.7998396467669058e-06
enorminf           =   1.2494278882391185e-05
C = enorminf / h^2 =   3.2881068792000065e+00
wall clock time    =      14.70 seconds
driver_cg ran, N=512 
test_driver_cg running, N=1024 
N =  1024
tol =    1.0e-06, maxit = 99999
flag = 0, iter = 1581, relres =   9.3989188600245957e-07
h                  =   9.7560975609756097e-04
h^2                =   9.5181439619274241e-07
enorminf           =   3.1266064945967287e-06
C = enorminf / h^2 =   3.2848909483856881e+00
wall clock time    =     142.16 seconds
driver_cg ran, N=1024 
test_driver_cg finished 
 
some timing, using ge rather than cg
Links to .m source file and .png output, shown below
driver_ge.m  source file to be timed
test_driver_ge.m  source file various n
test_driver_ge_m.out timing output various n
driver_ge4.png  one plot output
function driver_ge(N,fid)
  h = 1 / (N+1);
  x = [h : h : 1-h];
  y = x;
  [X, Y] = ndgrid(x,y);
  F = (-2*pi^2) * (cos(2*pi*X).*(sin(pi*Y)).^2 + (sin(pi*X)).^2.*cos(2*pi*Y));
  b = h^2 * F(:);
  clear X Y F;
  tic;
  A = setupA(N);
  u = A \ b;
  Uint = reshape(u, [N N]); % N.B.: Uint has only solutions on interior points
  timesec = toc;
  % append boundary to x, y, and to U:
  x = [0 x 1];
  y = [0 y 1];
  [X, Y] = ndgrid(x,y);
  U = zeros(size(X));
  U(2:end-1,2:end-1) = Uint;
  % plot numerical solution:
  figure;
  plot3(X,Y,U);
  view(27.5,20);
  xlabel('x');
  ylabel('y');
  zlabel('u');
  % compute and plot numerical error:
  Utrue = (sin(pi*X)).^2 .* (sin(pi*Y)).^2;
  E = U - Utrue;
  figure;
  plot3(X,Y,E);
  view(8.5,2);
  xlabel('x');
  ylabel('y');
  zlabel('u-u_h');
  % compute L^inf norm of error and print:
  enorminf = max(abs(E(:)));
  fprintf(fid,'N = %5d\n', N);
  fprintf(fid,'h                  = %24.16e\n', h);
  fprintf(fid,'h^2                = %24.16e\n', h^2);
  fprintf(fid,'enorminf           = %24.16e\n', enorminf);
  fprintf(fid,'C = enorminf / h^2 = %24.16e\n', (enorminf/h^2));
  fprintf(fid,'wall clock time    = %10.2f seconds\n', timesec);
  function A = setupA(N)
    I = speye(N);
    s = [-1*ones(1,N-1) 2*ones(1,N) -1*ones(1,N-1)]';
    i = [2:N    1:N  1:N-1]';
    j = [1:N-1  1:N  2:N  ]';
    T = sparse(i,j,s);
    A = kron(I,T) + kron(T,I);
% test_driver_ge.m  Gobberts driver_ge.m
function test_driver_ge
  fid=fopen('test_driver_ge_m.out','w');  
  N=4;
  fprintf(fid,'test_driver_ge running, N=%d \n', N);
  driver_ge(N,fid);
  fprintf(fid,'driver_ge ran, N=%d \n\n', N);
  N=8;
  fprintf(fid,'test_driver_ge running, N=%d \n', N);
  driver_ge(N,fid);
  fprintf(fid,'driver_ge ran, N=%d \n\n', N);
  N=16;
  fprintf(fid,'test_driver_ge running, N=%d \n', N);
  driver_ge(N,fid);
  fprintf(fid,'driver_ge ran, N=%d \n\n', N);
  N=32;
  fprintf(fid,'test_driver_ge running, N=%d \n', N);
  driver_ge(N,fid);
  fprintf(fid,'driver_ge ran, N=%d \n\n', N);
  N=64;
  fprintf(fid,'test_driver_ge running, N=%d \n', N);
  driver_ge(N,fid);
  fprintf(fid,'driver_ge ran, N=%d \n\n', N);
  N=128;
  fprintf(fid,'test_driver_ge running, N=%d \n', N);
  driver_ge(N,fid);
  fprintf(fid,'driver_ge ran, N=%d \n\n', N);
  N=256;
  fprintf(fid,'test_driver_ge running, N=%d \n', N);
  driver_ge(N,fid);
  fprintf(fid,'driver_ge ran, N=%d \n\n', N);
  N=512;
  fprintf(fid,'test_driver_ge running, N=%d \n', N);
  driver_ge(N,fid);
  fprintf(fid,'driver_ge ran, N=%d \n\n', N);
  N=1024;
  fprintf(fid,'test_driver_ge running, N=%d \n', N);
  driver_ge(N,fid);
  fprintf(fid,'driver_ge ran, N=%d \n\n', N);
  fprintf(fid,'test_driver_ge finished \n');
end % test_driver_ge
test_driver_ge running, N=4 
N =     4
h                  =   2.0000000000000001e-01
h^2                =   4.0000000000000008e-02
enorminf           =   1.1672672560746400e-01
C = enorminf / h^2 =   2.9181681401865993e+00
wall clock time    =       0.69 seconds
driver_ge ran, N=4 
test_driver_ge running, N=8 
N =     8
h                  =   1.1111111111111110e-01
h^2                =   1.2345679012345678e-02
enorminf           =   3.9152467804693947e-02
C = enorminf / h^2 =   3.1713498921802099e+00
wall clock time    =       0.02 seconds
driver_ge ran, N=8 
test_driver_ge running, N=16 
N =    16
h                  =   5.8823529411764705e-02
h^2                =   3.4602076124567475e-03
enorminf           =   1.1267474206801520e-02
C = enorminf / h^2 =   3.2563000457656393e+00
wall clock time    =       0.02 seconds
driver_ge ran, N=16 
test_driver_ge running, N=32 
N =    32
h                  =   3.0303030303030304e-02
h^2                =   9.1827364554637292e-04
enorminf           =   3.0127943178556160e-03
C = enorminf / h^2 =   3.2809330121447653e+00
wall clock time    =       0.01 seconds
driver_ge ran, N=32 
test_driver_ge running, N=64 
N =    64
h                  =   1.5384615384615385e-02
h^2                =   2.3668639053254440e-04
enorminf           =   7.7812147640843321e-04
C = enorminf / h^2 =   3.2875632378256299e+00
wall clock time    =       0.03 seconds
driver_ge ran, N=64 
test_driver_ge running, N=128 
N =   128
h                  =   7.7519379844961239e-03
h^2                =   6.0092542515473829e-05
enorminf           =   1.9766136774113097e-04
C = enorminf / h^2 =   3.2892828205801603e+00
wall clock time    =       0.33 seconds
driver_ge ran, N=128 
test_driver_ge running, N=256 
N =   256
h                  =   3.8910505836575876e-03
h^2                =   1.5140274644582053e-05
enorminf           =   4.9807274579038996e-05
C = enorminf / h^2 =   3.2897206786709465e+00
wall clock time    =       0.80 seconds
driver_ge ran, N=256 
test_driver_ge running, N=512 
N =   512
h                  =   1.9493177387914229e-03
h^2                =   3.7998396467669058e-06
enorminf           =   1.2500832120454497e-05
C = enorminf / h^2 =   3.2898314883078901e+00
wall clock time    =       3.54 seconds
driver_ge ran, N=512 
test_driver_ge running, N=1024 
N =  1024
h                  =   9.7560975609756097e-04
h^2                =   9.5181439619274241e-07
enorminf           =   3.1313407333755094e-06
C = enorminf / h^2 =   3.2898648580026446e+00
wall clock time    =      15.39 seconds
driver_ge ran, N=1024 
test_driver_ge finished 
 
 
A simple test of conjugate gradient
Links to .m source file and .png output, shown below
(one of several versions of conjugate gradient)
conjgrad.m  source file to be tested
test_conjgrad.m  test source
test_conjgrad_m.out  test output
% conjgrad.m  solve Ax=b for x by conjugate gradient method (initial x 0 OK)
%                   A must be symmetric positive definite for convergence
% added file output of debug
function [x] = conjgrad(A, b, x, tol, maxit)
  debug = 2;
  r = b - A * x;
  p = r;
  rsold = r' * r;
  for i = 1:maxit
    Ap = A * p;
    alpha = rsold / (p' * Ap);
    x = x + alpha * p;
    r = r - alpha * Ap;
    rsnew = r' * r;
    if(debug > 1)
      disp('conjgrad.m iter, rsnew =')
      disp(i)
      disp(rsnew)
    end % if
    if sqrt(rsnew) < tol
      break;
    end % if
    p = r + (rsnew / rsold) * p;
    rsold = rsnew;
  end % end for
  if(debug > 0)
      disp('conjgrad final iter, rsnew =')
      disp(i)
      disp(rsnew)
  end % if
end % conjgrad
% test_conjgrad.m  simple case 4 by 4  matrix
%                  x computed  using  b = 1,2,3,4
function test_conjgrad()
  diary('test_conjgrad_m.out');
  disp('test_conjgrad_m running with simeq and conjgrad')
  disp('solve Ax=b for x given A and b')
  A = [ 1 2 5 9 ; 2 6 9 10 ; 5 9 11 13 ; 9 10 13 19 ]
  b = [1 ; 2 ; 3 ; 4 ] % must be column
  x = A \ b;  % solve A x = b
  disp('simeq solution x=')
  disp(x)
  disp('initial guess for conjgrad')
  x0 = [0 ; 0 ; 0 ; 0 ]
  xc = conjgrad(A, b, x0, 1.0e-10, 9);
  disp('conjgrad solution xc=')
  disp(xc)
  disp('check A det, eig')
  Ad = det(A)
  [v e] = eig(A);
  disp(e)
  disp('l u lu(A)')
  [l u] = lu(A)
  disp('ichol(A)')
  C = ichol(A) % fails because A is not sparse
  disp('test_conjgrad.m finished')
end % test_conjgrad
test_conjgrad_m running with simeq and conjgrad
solve Ax=b for x given A and b
A =
     1     2     5     9
     2     6     9    10
     5     9    11    13
     9    10    13    19
b =
     1
     2
     3
     4
simeq solution x=
    0.1567
    0.0896
    0.1194
    0.0075
initial guess for conjgrad
x0 =
     0
     0
     0
     0
conjgrad.m iter, rsnew =
     1
    0.3117
conjgrad.m iter, rsnew =
     2
    0.0467
conjgrad.m iter, rsnew =
     3
   5.0755e-04
conjgrad.m iter, rsnew =
     4
   7.2548e-24
conjgrad final iter, rsnew =
     4
   7.2548e-24
conjgrad solution xc=
    0.1567
    0.0896
    0.1194
    0.0075
check A det, eig
Ad =
  134.0000
   -3.5791         0         0         0
         0   -0.3051         0         0
         0         0    3.2617         0
         0         0         0   37.6226
l u lu(A)
l =
    0.1111    0.2353    1.0000         0
    0.2222    1.0000         0         0
    0.5556    0.9118   -0.8472    1.0000
    1.0000         0         0         0
u =
    9.0000   10.0000   13.0000   19.0000
         0    3.7778    6.1111    5.7778
         0         0    2.1176    5.5294
         0         0         0    1.8611
ichol(A)
First argument must be sparse.
  C = ichol(A)
Last updated 2/20/2017