# Try out NAG Library functions

Explore NAG maths and stats routines with interactive demos
Function ID
G02ABF
Name
nagf_correg_corrmat_nearest_bounded
Description
Computes the nearest correlation matrix to a real square matrix, augmented to incorporate weights and bounds
Keywords
Qi and Sun algorithm | correlation matrix | nearest correlation matrix
This example finds the nearest correlation matrix to:
 $G=2-100-12-100-12-100-12$
weighted by ${W}^{\frac{1}{2}}=\mathrm{diag}\left(100,20,20,20\right)$ with minimum eigenvalue $0.02$.
    Program g02abfe

!     G02ABF Example Program Text

!     Mark 26.1 Release. NAG Copyright 2016.

!     .. Use Statements ..
Use nag_library, Only: dsyev, g02abf, nag_wp, x04caf
!     .. Implicit None Statement ..
Implicit None
!     .. Parameters ..
Integer, Parameter               :: nin = 5, nout = 6
!     .. Local Scalars ..
Real (Kind=nag_wp)               :: alpha, errtol, nrmgrd
Integer                          :: feval, i, ifail, iter, ldg, ldx,     &
lwork, maxit, maxits, n
Character (1)                    :: opt
!     .. Local Arrays ..
Real (Kind=nag_wp), Allocatable  :: eig(:), g(:,:), w(:), work(:),       &
x(:,:)
!     .. Executable Statements ..
Write (nout,*) 'G02ABF Example Program Results'
Write (nout,*)
Flush (nout)

!     Skip heading in data file

!     Read in the problem size, opt and alpha

ldg = n
ldx = n
lwork = 66*n
Allocate (g(ldg,n),w(n),x(ldx,n),eig(n),work(lwork))

!     Read in the matrix G

!     Read in the vector W

!     Use the defaults for ERRTOL, MAXITS and MAXIT
errtol = 0.0E0_nag_wp
maxits = 0
maxit = 0

!     Calculate nearest correlation matrix
ifail = 0

Call g02abf(g,ldg,n,opt,alpha,w,errtol,maxits,maxit,x,ldx,iter,feval,    &
nrmgrd,ifail)

!     Display results
ifail = 0
Call x04caf('General',' ',n,n,x,ldx,'Nearest Correlation Matrix X',      &
ifail)
Write (nout,*)
Write (nout,99999) 'Number of Newton steps taken:', iter
Write (nout,99998) 'Number of function evaluations:', feval

Write (nout,*)
Write (nout,99997) 'ALPHA: ', alpha

ifail = 0
!     The NAG name equivalent of dsyev is f08faf
Call dsyev('N','U',n,x,ldx,eig,work,lwork,ifail)
Write (nout,*)
Flush (nout)
Call x04caf('General',' ',1,n,eig,1,'Eigenvalues of X',ifail)

99999 Format (1X,A,I11)
99998 Format (1X,A,I9)
99997 Format (1X,A,F37.3)

End Program g02abfe

The NAG Library
The world’s largest collection of robust, documented, tested and maintained numerical algorithms.