def comp_proj_lyap_res_norm(Z, amat=None, mmat=None, wmat=None, jmat=None, umat=None, vmat=None, Sinv=None): """compute the squared f norm of projected lyap residual res = Pt*[ Ft*ZZt*M + Mt*ZZt*M + W*Wt ]*P """ if Z.shape[1] >= Z.shape[0]: raise Warning('TODO: catch cases where Z has more cols than rows') if Sinv is None: Mlu = spsla.factorized(mmat) MinvJt = lau.app_luinv_to_spmat(Mlu, jmat.T) Sinv = np.linalg.inv(jmat * MinvJt) def _app_pt(Z, jmat, MinvJt, Sinv): return Z - jmat.T * np.dot(Sinv, np.dot(MinvJt.T, Z)) if umat is None and vmat is None: amattZ = amat.T * Z else: amattZ = amat.T*Z - lau.comp_uvz_spdns(vmat.T, umat.T, Z) PtFtZ = _app_pt(amattZ, jmat, MinvJt, Sinv) PtMtZ = _app_pt(mmat.T * Z, jmat, MinvJt, Sinv) PtW = _app_pt(wmat, jmat, MinvJt, Sinv) return lau.comp_sqfnrm_factrd_lyap_res(PtMtZ, PtFtZ, PtW)
def test_solve_proj_sadpnt_smw(self): """check the sadpnt as projection""" n = self.n # check whether it is a projection AuvInvZ = lau.solve_sadpnt_smw(amat=self.A, jmat=self.J, rhsv=self.Z, jmatT=self.Jt, umat=self.U, vmat=self.V) auvAUVinv = self.A * AuvInvZ[:n, :] - \ lau.comp_uvz_spdns(self.U, self.V, AuvInvZ[:n, :]) AuvInv2Z = lau.solve_sadpnt_smw(amat=self.A, jmat=self.J, rhsv=auvAUVinv, jmatT=self.Jt, umat=self.U, vmat=self.V) self.assertTrue(np.allclose(AuvInvZ[:n, :], AuvInv2Z[:n, :]), msg='likely to fail because of ill cond') prjz = lau.app_prj_via_sadpnt(amat=self.A, jmat=self.J, rhsv=self.Z, jmatT=self.Jt) prprjz = lau.app_prj_via_sadpnt(amat=self.A, jmat=self.J, rhsv=self.Z, jmatT=self.Jt) # check projector self.assertTrue(np.allclose(prprjz, prjz)) # onto kernel J self.assertTrue(np.linalg.norm(prjz) > 1e-8) self.assertTrue( np.linalg.norm(self.J * prjz) / np.linalg.norm(prjz) < 1e-6) # check transpose idmat = np.eye(n) prj = lau.app_prj_via_sadpnt(amat=self.A, jmat=self.J, rhsv=idmat, jmatT=self.Jt) prjT = lau.app_prj_via_sadpnt(amat=self.A, jmat=self.J, rhsv=idmat, jmatT=self.Jt, transposedprj=True) self.assertTrue(np.allclose(prj, prjT.T))
def test_solve_proj_sadpnt_smw(self): """check the sadpnt as projection""" n = self.n # check whether it is a projection AuvInvZ = lau.solve_sadpnt_smw(amat=self.A, jmat=self.J, rhsv=self.Z, jmatT=self.Jt, umat=self.U, vmat=self.V) auvAUVinv = self.A * AuvInvZ[:n, :] - \ lau.comp_uvz_spdns(self.U, self.V, AuvInvZ[:n, :]) AuvInv2Z = lau.solve_sadpnt_smw(amat=self.A, jmat=self.J, rhsv=auvAUVinv, jmatT=self.Jt, umat=self.U, vmat=self.V) self.assertTrue(np.allclose(AuvInvZ[:n, :], AuvInv2Z[:n, :]), msg='likely to fail because of ill cond') prjz = lau.app_prj_via_sadpnt(amat=self.A, jmat=self.J, rhsv=self.Z, jmatT=self.Jt) prprjz = lau.app_prj_via_sadpnt(amat=self.A, jmat=self.J, rhsv=self.Z, jmatT=self.Jt) # check projector self.assertTrue(np.allclose(prprjz, prjz)) # onto kernel J self.assertTrue(np.linalg.norm(prjz) > 1e-8) self.assertTrue(np.linalg.norm(self.J*prjz)/np.linalg.norm(prjz) < 1e-6) # check transpose idmat = np.eye(n) prj = lau.app_prj_via_sadpnt(amat=self.A, jmat=self.J, rhsv=idmat, jmatT=self.Jt) prjT = lau.app_prj_via_sadpnt(amat=self.A, jmat=self.J, rhsv=idmat, jmatT=self.Jt, transposedprj=True) self.assertTrue(np.allclose(prj, prjT.T))