code: def _matrix_grad(q, h, h_dx, t, t_prime):
      ''' Returns the gradient with respect to a single variable'''
  
      N = len(q)
      W = np.zeros([N, N])
      Wprime = np.zeros([N, N])
      for i in range(N):
          W[i, i] = 0.5*(h[min(i+1, N-1)] - h[max(i-1, 0)])
          Wprime[i, i] = \
              0.5*(h_dx[min(i+1, N-1)] - h_dx[max(i-1, 0)])
  
      tgrad = np.array([t_prime[i]*h_dx[i] for i in np.arange(N)])
  
      grad = 2.0*(q - t).T.dot(W).dot(-1.0*tgrad) \
              + (q - t).T.dot(Wprime).dot(q - t)
  
      return graf _matrix_grad(q, h, h_dx, t, t_prime):
      ''' Returns the gradient with respect to a single variable'''
  
      N = len(q)
      W = np.zeros([N, N])
      Wprime = np.zeros([N, N])
      for i in range(N):
          W[i, i] = 0.5*(h[min(i+1, N-1)] - h[max(i-1, 0)])
          Wprime[i, i] = \
              0.5*(h_dx[min(i+1, N-1)] - h_dx[max(i-1, 0)])
  
      tgrad = np.array([t_prime[i]*h_dx[i] for i in np.arange(N)])
  
      grad = 2.0*(q - t).T.dot(W).dot(-1.0*tgrad) \
              + (q - t).T.dot(Wprime).dot(q - t)
  
      return grad
docs: Returns the gradient with respect to a single variable