function [ max_adif, max_adif_i, max_adif_j, max_rdif, max_rdif_i, max_rdif_j ] = ...
  p00_jac_check ( problem, option, nvar, x )

%*****************************************************************************80
%
%% p00_jac_check() compares the jacobian with a finite difference estimate.
%
%  Licensing:
%
%    This code is distributed under the MIT license.
%
%  Modified:
%
%    06 September 2008
%
%  Author:
%
%    John Burkardt
%
%  Input:
%
%    integer PROBLEM, the problem index.
%
%    integer OPTION, the option index.
%
%    integer NVAR, the number of variables.
%
%    real X(NVAR), the argument of the jacobian.
%
%  Output:
%
%    real MAX_ADIF, the maximum absolute difference.
%
%    integer MAX_ADIF_I, MAX_ADIF_J, the indices where
%    the maximmum absolute difference was found.
%
%    real MAX_RDIF, the maximum relative difference.
%
%    integer MAX_RDIF_I, MAX_RDIF_J, the indices where
%    the maximmum relative difference was found.
%
  rel = 0.0001;
%
%  Compute the jacobian.
%
  jac = p00_jac ( problem, option, nvar, x );
  jac_norm = max ( max ( abs ( jac ) ) );
%
%  Estimate the jacobian via finite differences.
%
  jac_dif = p00_jac_dif ( problem, option, nvar, x );
%
%  Compare the jacobians.
%
  max_rdif = 0.0;
  max_rdif_i = 0;
  max_rdif_j = 0;

  max_adif = 0.0;
  max_adif_i = 0;
  max_adif_j = 0;

  for i = 1 : nvar - 1
    for j = 1 : nvar

      dif = abs ( jac(i,j) - jac_dif(i,j) );

      if ( max_adif < dif )
        max_adif = dif;
        max_adif_i = i;
        max_adif_j = j;
      end

      if ( rel < abs ( jac(i,j) ) )
        if ( max_rdif * abs ( jac(i,j) ) < dif )
          max_rdif = dif / abs ( jac(i,j) );
          max_rdif_i = i;
          max_rdif_j = j;
        end
      end

    end
  end

  return
end
