function [A,b,x] = deriv2(n,case)
%DERIV2 Test problem: computation of the second derivative.
%
% [A,b,x] = deriv2(n,case)
%
% This is a mildly ill-posed problem.  It is a discretization of a
% first kind Fredholm integral equation whose kernel K is the
% Green's function for the second derivative:
%    K(s,t) = | s(t-1)  ,  s <  t .
%             | t(s-1)  ,  s >= t
% Both integration intervals are [0,1], and as right-hand side g
% and correspond solution f one can choose between the following:
%    case = 1 : g(s) = (s^3 - s)/6          ,  f(t) = t
%    case = 2 : g(s) = exp(s) + (1-e)s - 1  ,  f(t) = exp(t)
%    case = 3 : g(s) = | (4s^3 - 3s)/24               ,  s <  0.5
%                      | (-4s^3 + 12s^2 - 9s + 1)/24  ,  s >= 0.5
%               f(t) = | t    ,  t <  0.5
%                      | 1-t  ,  t >= 0.5

% References.  The first two examples are from L. M. Delves & J. L.
% Mohamed, "Computational Methods for Integral Equations", Cambridge
% University Press, 1985; p. 310.  The third example is from A. K.
% Louis & P. Maass, "A mollifier method for linear operator equations
% of the first kind", Inverse Problems 6 (1990), 427-440.

% Discretized by Galerkin method with orthonormal box functions.

% Per Christian Hansen, UNI-C, 05/28/93.

% Initialization.
if (nargin==1), case = 1; end
h = 1/n; sqh = sqrt(h); h32 = h*sqh; h2 = h^2; sqhi = 1/sqh;
t = 2/3; A = zeros(n,n);

% Compute the matrix A.
for i=1:n
  A(i,i) = h2*((i^2 - i + 0.25)*h - (i - t));
  for j=1:i-1
    A(i,j) = h2*(j-0.5)*((i-0.5)*h-1);
  end
end
A = A + tril(A,-1)';

% Compute the right-hand side vector b.
if (nargout>1)
  b = zeros(n,1);
  if (case==1)
    for i=1:n
      b(i) = h32*(i-0.5)*((i^2 + (i-1)^2)*h2/2 - 1)/6;
    end
  elseif (case==2)
    ee = 1 - exp(1);
    for i=1:n
      b(i) = sqhi*(exp(i*h) - exp((i-1)*h) + ee*(i-0.5)*h2 - h);
    end
  elseif (case==3)
    if (rem(n,2)~=0), error('Order n must be even'), else
      for i=1:n/2
        s12 = (i*h)^2; s22 = ((i-1)*h)^2;
        b(i) = sqhi*(s12 + s22 - 1.5)*(s12 - s22)/24;
      end
      for i=n/2+1:n
        s1 = i*h; s12 = s1^2; s2 = (i-1)*h; s22 = s2^2;
        b(i) = sqhi*(-(s12+s22)*(s12-s22) + 4*(s1^3 - s2^3) - ...
                    4.5*(s12 - s22) + h)/24;
      end
    end
  else
    error('Illegal value of case')
  end
end

% Compute the solution vector x.
if (nargout==3)
  x = zeros(n,1);
  if (case==1)
    for i=1:n, x(i) = h32*(i-0.5); end
  elseif(case==2)
    for i=1:n, x(i) = sqhi*(exp(i*h) - exp((i-1)*h)); end
  else
    for i=1:n/2,   x(i) = sqhi*((i*h)^2 - ((i-1)*h)^2)/2; end
    for i=n/2+1:n, x(i) = sqhi*(h - ((i*h)^2 - ((i-1)*h)^2)/2); end
  end
end
