Пример #1
0
    def __init__(self, dae, N=None, ts=None, yxNames=None, yuNames=None):
        Ocp.__init__(self, dae, N=N, ts=ts)
        self.hashPrefix = 'mhe'

        if yxNames is None:
            yxNames = dae.xNames()
        if yuNames is None:
            yuNames = dae.uNames()
        if not isinstance(yxNames, list):
            raise Exception("If you decide to provide measurements, "+\
                            "you have to provide them as a list of strings")
        if not isinstance(yuNames, list):
            raise Exception("If you decide to provide end measurements, "+\
                            "you have to provide them as a list of strings")
        self._yxNames = yxNames
        self._yuNames = yuNames

        self._yx = C.veccat([self[n] for n in self.yxNames])
        self._yu = C.veccat([self[n] for n in self.yuNames])

        assert not C.dependsOn(
            self.yx, self.dae.uVec()), "error: x measurement depends on u"
        assert not C.dependsOn(
            self.yu, self.dae.xVec()), "error: u measurement depends on x"

        Ocp.minimizeLsq(self, C.veccat([self.yx, self.yu]))
        Ocp.minimizeLsqEndTerm(self, self.yx)
Пример #2
0
    def __init__(self, dae, N=None, ts=None, yxNames=None, yuNames=None):
        Ocp.__init__(self, dae, N=N, ts=ts)
        self.hashPrefix = "mhe"

        if yxNames is None:
            yxNames = dae.xNames()
        if yuNames is None:
            yuNames = dae.uNames()
        if not isinstance(yxNames, list):
            raise Exception("If you decide to provide measurements, " + "you have to provide them as a list of strings")
        if not isinstance(yuNames, list):
            raise Exception(
                "If you decide to provide end measurements, " + "you have to provide them as a list of strings"
            )
        self._yxNames = yxNames
        self._yuNames = yuNames

        self._yx = C.veccat([self[n] for n in self.yxNames])
        self._yu = C.veccat([self[n] for n in self.yuNames])

        assert not C.dependsOn(self.yx, self.dae.uVec()), "error: x measurement depends on u"
        assert not C.dependsOn(self.yu, self.dae.xVec()), "error: u measurement depends on x"

        Ocp.minimizeLsq(self, C.veccat([self.yx, self.yu]))
        Ocp.minimizeLsqEndTerm(self, self.yx)
Пример #3
0
 def __init__(self, dae):
     self._program = dae.program
     self.residuals = dae.program.getDaeResidual()
     self.f = [eq for eq in casadi.vertsplit(self.residuals)
               if casadi.dependsOn(eq, dae.dx_dt)]
     self.gx = [eq for eq in casadi.vertsplit(self.residuals)
                if (not casadi.dependsOn(eq, dae.y)
                    and not casadi.dependsOn(eq, dae.dx_dt))]
     self.gy = [eq for eq in casadi.vertsplit(self.residuals)
                if casadi.dependsOn(eq, dae.y)]
Пример #4
0
        def blt(self):
            f = casadi.vertsplit(self.residuals)
            diff_and_algebraic = [x.getVar()
                                  for x in self._program.getVariables(self._program.DIFFERENTIATED)]
            diff_and_algebraic += [x.getVar()
                                   for x in self._program.getVariables(self._program.REAL_ALGEBRAIC)]
            blt = np.zeros((len(f), len(diff_and_algebraic)), dtype=np.int8)
            for i, fi in enumerate(f):
                for j, xj in enumerate(diff_and_algebraic):
                    if casadi.dependsOn(fi, [xj]):
                        blt[i, j] = 1
            keep = np.nonzero(blt.sum(0))[0]
            diff_and_algebraic = [diff_and_algebraic[i]
                                  for i in keep]
            blt = blt[:, keep]

            # sorted = np.argsort(blt.sum(0))
            # diff_and_algebraic = [diff_and_algebraic[i]
            #                       for i in sorted]
            # blt = blt[:, sorted]

            return blt, diff_and_algebraic
Пример #5
0
    def __init__(self, \
                 t = ca.MX.sym("t", 1),
                 u = ca.MX.sym("u", 0), \
                 x = None, \
                 p = None, \
                 eps_e = ca.MX.sym("eps_e", 0), \
                 eps_u = ca.MX.sym("eps_u", 0), \
                 phi = None, \
                 f = None):

        intro.pecas_intro()
        print('\n' + 26 * '-' + \
            ' PECas system definition ' + 27 * '-')
        print('\nStarting definition of ExplODE system ...')

        if not all(isinstance(arg, ca.casadi.MX) for \
            arg in [t, u, x, p, eps_e, eps_u, phi, f]):

            raise TypeError('''
Missing input argument for system definition or wrong variable type for an
input argument. Input arguments must be CasADi symbolic types.''')

        if ca.dependsOn(f, t):

            raise NotImplementedError('''
Explicit time dependecies of the ODE right hand side are not yet supported in
PECas, but probably will be in future versions.''')

        self.t = t
        self.u = u
        self.x = x
        self.eps_e = eps_e
        self.eps_u = eps_u
        self.p = p

        self.phi = phi
        self.f = f

        print('Definition of ExplODE system sucessful.')
Пример #6
0
    def __init__(self, \
                 t = ca.MX.sym("t", 1),
                 u = ca.MX.sym("u", 0), \
                 x = None, \
                 p = None, \
                 eps_e = ca.MX.sym("eps_e", 0), \
                 eps_u = ca.MX.sym("eps_u", 0), \
                 phi = None, \
                 f = None):

        intro.pecas_intro()
        print('\n' + 26 * '-' + \
            ' PECas system definition ' + 27 * '-')
        print('\nStarting definition of ExplODE system ...')

        if not all(isinstance(arg, ca.casadi.MX) for \
            arg in [t, u, x, p, eps_e, eps_u, phi, f]):

            raise TypeError('''
Missing input argument for system definition or wrong variable type for an
input argument. Input arguments must be CasADi symbolic types.''')

        if ca.dependsOn(f, t):

            raise NotImplementedError('''
Explicit time dependecies of the ODE right hand side are not yet supported in
PECas, but probably will be in future versions.''')

        self.t = t
        self.u = u
        self.x = x
        self.eps_e = eps_e
        self.eps_u = eps_u
        self.p = p

        self.phi = phi
        self.f = f

        print('Definition of ExplODE system sucessful.')
Пример #7
0
def depends_on(b, a):

    return ca.dependsOn(b, a)
Пример #8
0
    def __init__(self, dae, N = None, ts = None, yxNames = None, yuNames = None, useLinearObjTerms = False, hashPrefix = 'ocp'):
        dae.assertNoFreeParams()
        self.hashPrefix = hashPrefix
        self._dae = dae
        if N is None or ts is None:
            raise Exception('please initialize Ocp with Ocp(dae, N=.., ts=..)')
        assert type(N) is int, "N must be an int, got type: "+str(type(N))
        assert type(ts) in [int,float], "ts must be an int or float, got type: "+str(type(ts))
        self._N = N
        self._ts = float(ts)

        self._ebndmap = {}
        self._ebndmapStart = {}
        self._ebndmapEnd = {}

        self._lbndmap = {}
        self._lbndmapStart = {}
        self._lbndmapEnd = {}

        self._ubndmap = {}
        self._ubndmapStart = {}
        self._ubndmapEnd = {}

        self._constraints = []
        self._constraintsStart = []
        self._constraintsEnd = []

        self._dbgMessages = []
        
        if yxNames is None:
            yxNames = dae.xNames()
        else:
            assert isinstance(yxNames, list), "yxNames must be a list of strings"
        self._yxNames = yxNames
        
        if yuNames is None:
            yuNames = dae.uNames()
        else:
            assert isinstance(yuNames, list), "yuNames must be a list of strings"
        self._yuNames = yuNames

        self._yx = C.veccat([self[n] for n in self._yxNames])
        self._yu = C.veccat([self[n] for n in self._yuNames])

        assert not C.dependsOn(self._yx, self.dae.uVec()), "error: x measurement depends on u"
        assert not C.dependsOn(self._yu, self.dae.xVec()), "error: u measurement depends on x"

        self.__minimizeLsq( C.veccat([self._yx, self._yu]) )
        self.__minimizeLsqEndTerm( self._yx )
        
        # Calculate offsets of measurements
        self._yOffsets = {}
        _offset = 0
        for name in self._yxNames:
            self._yOffsets.update({name: _offset})
            _offset += self.dae[ name ].shape[ 0 ]
        for name in self._yuNames:
            self._yOffsets.update({name: _offset})
            _offset += self.dae[ name ].shape[ 0 ]
            
        # Usage of linear terms
        self._useLinearObjTerms = useLinearObjTerms