code: def Q_srk(self, k):
          
          ind = self.index[self.Q_time_var_index, k]
          Q = self.Q[:, :, ind]
  
          if (Q.shape[0] == 1):  # 1-D case handle simplier. No storage
              # of the result, just compute it each time.
              square_root = np.sqrt(Q)
          else:
              if self.svd_each_time:
  
                  (U, S, Vh) = sp.linalg.svd(Q, full_matrices=False,
                                             compute_uv=True,
                                             overwrite_a=False,
                                             check_finite=True)
  
                  square_root = U * np.sqrt(S)
              else:
  
                  if ind in self.Q_square_root:
                      square_root = self.Q_square_root[ind]
                  else:
                      (U, S, Vh) = sp.linalg.svd(Q, full_matrices=False,
                                                 compute_uv=True,
                                                 overwrite_a=False,
                                                 check_finite=True)
  
                      square_root = U * np.sqrt(S)
  
                      self.Q_square_root[ind] = square_root
  
          return square_root
docs: function (k). Returns the square root of noise matrix of dynamic model
                        on iteration k.
              k (iteration number). starts at 0
  
          This function is implemented to use SVD prediction step.