function bern = bernstein_poly_ab ( n, a, b, x )

%*****************************************************************************80
%
%% BERNSTEIN_POLY_AB evaluates at X the Bernstein polynomials based in [A,B].
%
%  Formula:
%
%    BERN(N,I)(X) = [N!/(I!*(N-I)!)] * (B-X)**(N-I) * (X-A)**I / (B-A)**N
%
%  First values:
%
%    B(0,0)(X) =   1
%
%    B(1,0)(X) = (      B-X                ) / (B-A)
%    B(1,1)(X) = (                 X-A     ) / (B-A)
%
%    B(2,0)(X) = (     (B-X)^2             ) / (B-A)^2
%    B(2,1)(X) = ( 2 * (B-X)    * (X-A)    ) / (B-A)^2
%    B(2,2)(X) = (                (X-A)^2  ) / (B-A)^2
%
%    B(3,0)(X) = (     (B-X)^3             ) / (B-A)^3
%    B(3,1)(X) = ( 3 * (B-X)^2  * (X-A)    ) / (B-A)^3
%    B(3,2)(X) = ( 3 * (B-X)    * (X-A)^2  ) / (B-A)^3
%    B(3,3)(X) = (                (X-A)^3  ) / (B-A)^3
%
%    B(4,0)(X) = (     (B-X)^4             ) / (B-A)^4
%    B(4,1)(X) = ( 4 * (B-X)^3  * (X-A)    ) / (B-A)^4
%    B(4,2)(X) = ( 6 * (B-X)^2  * (X-A)^2  ) / (B-A)^4 
%    B(4,3)(X) = ( 4 * (B-X)    * (X-A)^3  ) / (B-A)^4 
%    B(4,4)(X) = (                (X-A)^4  ) / (B-A)^4 
%
%  Licensing:
%
%    This code is distributed under the GNU LGPL license.
%
%  Modified:
%
%    11 July 2011
%
%  Author:
%
%    John Burkardt
%
%  Parameters:
%
%    Input, integer N, the degree of the Bernstein polynomials to be used.
%    For any N, there is a set of N+1 Bernstein polynomials, each of
%    degree N, which form a basis for polynomials on [A,B].
%
%    Input, real A, B, the endpoints of the interval on which the
%    polynomials are to be based.  A and B should not be equal.
%
%    Input, real X, the point at which the polynomials are to be evaluated.
%
%    Output, real BERN(N+1,1), the values of the N+1 Bernstein polynomials at X.
%
  if ( b == a )
    fprintf ( 1, '\n' );
    fprintf ( 1, 'BERNSTEIN_POLY_AB - Fatal error!\n' );
    fprintf ( 1, '  A = B = %f\n', a );
    error ( 'BERNSTEIN_POLY_AB - Fatal error!' );
  end

  bern = zeros ( n + 1, 1 );

  if ( n == 0 )
 
    bern(1) = 1.0;
 
  elseif ( 0 < n )
 
    bern(1) = ( b - x ) / ( b - a );
    bern(2) = ( x - a ) / ( b - a );
 
    for i = 2 : n
      bern(i+1) = ( x - a ) * bern(i) / ( b - a );
      for j = i-1 : -1 : 1
        bern(j+1) = ( ( b - x ) * bern(j+1) + ( x - a ) * bern(j) ) / ( b - a );
      end
      bern(1) = ( b - x ) * bern(1) / ( b - a );
    end
 
  end
 
  return
end
