Exemplo n.º 1
0
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)
Exemplo n.º 2
0
    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))
Exemplo n.º 3
0
    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))