コード例 #1
0
ファイル: doe.py プロジェクト: adbuerger/casiopeia
    def _apply_parameters_to_objective(self):

        objective_free_variables = []
        objective_free_variables_parameters_applied = []

        for doe_setup in self._doe_setups:

            objective_free_variables.append( \
                doe_setup._discretization.optimization_variables["P"])
            objective_free_variables_parameters_applied.append( \
                doe_setup._pdata)

            for key in ["U", "Q", "X"]:

                objective_free_variables.append( \
                    doe_setup._discretization.optimization_variables[key])
                objective_free_variables_parameters_applied.append( \
                    doe_setup._discretization.optimization_variables[key])
                
        objective_free_variables = ci.veccat(objective_free_variables)
        objective_free_variables_parameters_applied = \
            ci.veccat(objective_free_variables_parameters_applied)

        objective_fcn = ci.mx_function("objective_fcn", \
            [objective_free_variables], [self._objective_parameters_free])

        [self._objective] = objective_fcn( \
            [objective_free_variables_parameters_applied])
コード例 #2
0
ファイル: doe.py プロジェクト: adbuerger/casiopeia
    def _apply_parameters_to_equality_constraints(self):

        optimization_variables_for_equality_constraints = ci.veccat([ \

                self._discretization.optimization_variables["U"],
                self._discretization.optimization_variables["Q"],
                self._discretization.optimization_variables["X"], 
                self._discretization.optimization_variables["EPS_U"], 
                self._discretization.optimization_variables["P"], 

            ])

        optimization_variables_parameters_applied = ci.veccat([ \

                self._discretization.optimization_variables["U"], 
                self._discretization.optimization_variables["Q"], 
                self._discretization.optimization_variables["X"], 
                ci.mx(*self._discretization.optimization_variables["EPS_U"].shape), 
                self._pdata, 

            ])

        equality_constraints_fcn = ci.mx_function( \
            "equality_constraints_fcn", \
            [optimization_variables_for_equality_constraints], \
            [self._discretization.equality_constraints])

        [self._equality_constraints_parameters_applied] = \
            equality_constraints_fcn([optimization_variables_parameters_applied])
コード例 #3
0
ファイル: pe.py プロジェクト: adbuerger/casiopeia
    def _apply_controls_to_measurements(self, udata, qdata):

        udata = inputchecks.check_controls_data(udata, \
            self._discretization.system.nu, \
            self._discretization.number_of_controls)
        qdata = inputchecks.check_constant_controls_data(qdata, \
            self._discretization.system.nq)

        optimization_variables_for_measurements = ci.veccat([ \

                self._discretization.optimization_variables["U"], 
                self._discretization.optimization_variables["Q"], 
                self._discretization.optimization_variables["X"], 
                self._discretization.optimization_variables["EPS_U"], 
                self._discretization.optimization_variables["P"], 

            ])

        optimization_variables_controls_applied = ci.veccat([ \

                udata, 
                qdata, 
                self._discretization.optimization_variables["X"], 
                self._discretization.optimization_variables["EPS_U"], 
                self._discretization.optimization_variables["P"], 

            ])

        measurements_fcn = ci.mx_function( \
            "measurements_fcn", \
            [optimization_variables_for_measurements], \
            [self._discretization.measurements])

        [self._measurements_controls_applied] = \
            measurements_fcn([optimization_variables_controls_applied])
コード例 #4
0
ファイル: doe.py プロジェクト: MannyKayy/casiopeia
    def _apply_parameters_to_objective(self):

        # As mentioned above, the objective does not depend on the actual
        # values of V, but on the values of P and EPS_U, while
        # P is fed from pdata, and EPS_U is supposed to be 0

        objective_free_variables = ci.veccat([ \

                self._discretization.optimization_variables["P"],
                self._discretization.optimization_variables["U"],
                self._discretization.optimization_variables["Q"],
                self._discretization.optimization_variables["X"],
                self._discretization.optimization_variables["EPS_U"],

            ])

        objective_free_variables_parameters_applied = ci.veccat([ \

                self._pdata,
                self._discretization.optimization_variables["U"],
                self._discretization.optimization_variables["Q"],
                self._discretization.optimization_variables["X"],
                ci.mx(*self._discretization.optimization_variables["EPS_U"].shape),

            ])

        objective_fcn = ci.mx_function("objective_fcn", \
            [objective_free_variables], [self._objective_parameters_free])

        self._objective = objective_fcn( \
            objective_free_variables_parameters_applied)
コード例 #5
0
ファイル: doe.py プロジェクト: adbuerger/casiopeia
    def _apply_parameters_to_objective(self):

        # As mentioned above, the objective does not depend on the actual
        # values of V, but on the values of P and EPS_E and EPS_U, while
        # P is fed from pdata, and EPS_E, EPS_u are supposed to be 0

        objective_free_variables = ci.veccat([ \

                self._discretization.optimization_variables["P"],
                self._discretization.optimization_variables["U"],
                self._discretization.optimization_variables["Q"],
                self._discretization.optimization_variables["X"],
                self._discretization.optimization_variables["EPS_U"],

            ])

        objective_free_variables_parameters_applied = ci.veccat([ \

                self._pdata,
                self._discretization.optimization_variables["U"],
                self._discretization.optimization_variables["Q"],
                self._discretization.optimization_variables["X"],
                ci.mx(*self._discretization.optimization_variables["EPS_U"].shape),

            ])

        objective_fcn = ci.mx_function("objective_fcn", \
            [objective_free_variables], [self._objective_parameters_free])

        [self._objective] = objective_fcn( \
            [objective_free_variables_parameters_applied])
コード例 #6
0
ファイル: doe.py プロジェクト: MannyKayy/casiopeia
    def _apply_parameters_to_equality_constraints(self):

        optimization_variables_for_equality_constraints = ci.veccat([ \

                self._discretization.optimization_variables["U"],
                self._discretization.optimization_variables["Q"],
                self._discretization.optimization_variables["X"], 
                self._discretization.optimization_variables["EPS_U"], 
                self._discretization.optimization_variables["P"], 

            ])

        optimization_variables_parameters_applied = ci.veccat([ \

                self._discretization.optimization_variables["U"], 
                self._discretization.optimization_variables["Q"], 
                self._discretization.optimization_variables["X"], 
                ci.mx(*self._discretization.optimization_variables["EPS_U"].shape), 
                self._pdata, 

            ])

        equality_constraints_fcn = ci.mx_function( \
            "equality_constraints_fcn", \
            [optimization_variables_for_equality_constraints], \
            [self._discretization.equality_constraints])

        self._equality_constraints_parameters_applied = \
            equality_constraints_fcn(optimization_variables_parameters_applied)
コード例 #7
0
ファイル: doe.py プロジェクト: MannyKayy/casiopeia
    def _apply_parameters_to_objective(self):

        objective_free_variables = []
        objective_free_variables_parameters_applied = []

        for doe_setup in self._doe_setups:

            objective_free_variables.append( \
                doe_setup._discretization.optimization_variables["P"])
            objective_free_variables_parameters_applied.append( \
                doe_setup._pdata)

            for key in ["U", "Q", "X"]:

                objective_free_variables.append( \
                    doe_setup._discretization.optimization_variables[key])
                objective_free_variables_parameters_applied.append( \
                    doe_setup._discretization.optimization_variables[key])
                
        objective_free_variables = ci.veccat(objective_free_variables)
        objective_free_variables_parameters_applied = \
            ci.veccat(objective_free_variables_parameters_applied)

        objective_fcn = ci.mx_function("objective_fcn", \
            [objective_free_variables], [self._objective_parameters_free])

        self._objective = objective_fcn( \
            objective_free_variables_parameters_applied)
コード例 #8
0
ファイル: pe.py プロジェクト: MannyKayy/casiopeia
    def _apply_controls_to_measurements(self, udata, qdata):

        udata = inputchecks.check_controls_data(udata, \
            self._discretization.system.nu, \
            self._discretization.number_of_controls)
        qdata = inputchecks.check_constant_controls_data(qdata, \
            self._discretization.system.nq)

        optimization_variables_for_measurements = ci.veccat([ \

                self._discretization.optimization_variables["U"],
                self._discretization.optimization_variables["Q"],
                self._discretization.optimization_variables["X"],
                self._discretization.optimization_variables["EPS_U"],
                self._discretization.optimization_variables["P"],

            ])

        optimization_variables_controls_applied = ci.veccat([ \

                udata,
                qdata,
                self._discretization.optimization_variables["X"],
                self._discretization.optimization_variables["EPS_U"],
                self._discretization.optimization_variables["P"],

            ])

        measurements_fcn = ci.mx_function( \
            "measurements_fcn", \
            [optimization_variables_for_measurements], \
            [self._discretization.measurements])

        self._measurements_controls_applied = \
            measurements_fcn(optimization_variables_controls_applied)
コード例 #9
0
ファイル: sim.py プロジェクト: adbuerger/casiopeia
    def __generate_scaled_dae(self):

        # ODE time scaling according to:
        # https://groups.google.com/forum/#!topic/casadi-users/AeXzJmBH0-Y

        t_scale = ci.mx_sym("t_scale", 1)

        dae_scaled = ci.mx_function(
            "dae_scaled",
            ci.daeIn(x=self.__system.x, p=ci.vertcat([t_scale, self.__system.u])),
            ci.daeOut(ode=t_scale * self.__ode_parameters_applied),
        )

        self.__dae_scaled = dae_scaled.expand()
コード例 #10
0
ファイル: doe.py プロジェクト: MannyKayy/casiopeia
    def _setup_covariance_matrix_for_evaluation(self):

        covariance_matrix_free_variables = ci.veccat([ \

                self._discretization.optimization_variables["P"],
                self._discretization.optimization_variables["U"],
                self._discretization.optimization_variables["Q"],
                self._discretization.optimization_variables["X"],
                self._discretization.optimization_variables["EPS_U"],

            ])

        self._covariance_matrix_fcn = ci.mx_function("covariance_matrix_fcn", \
            [covariance_matrix_free_variables], \
            [self._covariance_matrix.covariance_matrix])
コード例 #11
0
    def __generate_simulation_ode(self, pdata, qdata):

        p = inputchecks.check_parameter_data(pdata, self.__system.np)
        q = inputchecks.check_constant_controls_data(qdata, self.__system.nq)

        ode_fcn = ci.mx_function("ode_fcn", \
            [self.__system.u, self.__system.q, self.__system.x, \
            self.__system.eps_u, self.__system.p], \
            [self.__system.f])

        # Needs to be changes for allowance of explicit time dependecy!

        self.__ode_parameters_applied = ode_fcn.call([ \
            self.__system.u, q, self.__system.x, \
            np.zeros(self.__system.neps_u), p])[0]
コード例 #12
0
ファイル: doe.py プロジェクト: adbuerger/casiopeia
    def _setup_covariance_matrix_for_evaluation(self):

        covariance_matrix_free_variables = ci.veccat([ \

                self._discretization.optimization_variables["P"],
                self._discretization.optimization_variables["U"],
                self._discretization.optimization_variables["Q"],
                self._discretization.optimization_variables["X"],
                self._discretization.optimization_variables["EPS_U"],

            ])

        self._covariance_matrix_fcn = ci.mx_function("covariance_matrix_fcn", \
            [covariance_matrix_free_variables], \
            [self._covariance_matrix.covariance_matrix])
コード例 #13
0
ファイル: sim.py プロジェクト: adbuerger/casiopeia
    def __generate_simulation_ode(self, pdata, qdata):

        p = inputchecks.check_parameter_data(pdata, self.__system.np)
        q = inputchecks.check_constant_controls_data(qdata, self.__system.nq)

        ode_fcn = ci.mx_function(
            "ode_fcn",
            [self.__system.u, self.__system.q, self.__system.x, self.__system.eps_u, self.__system.p],
            [self.__system.f],
        )

        # Needs to be changes for allowance of explicit time dependency!

        self.__ode_parameters_applied = ode_fcn(
            [self.__system.u, q, self.__system.x, np.zeros(self.__system.neps_u), p]
        )[0]
コード例 #14
0
ファイル: doe.py プロジェクト: MannyKayy/casiopeia
    def _setup_covariance_matrix_for_evaluation(self):

        covariance_matrix_free_variables = []

        for doe_setup in self._doe_setups:

            for key in ["P", "U", "Q", "X"]:

                covariance_matrix_free_variables.append( \
                    doe_setup._discretization.optimization_variables[key])

        covariance_matrix_free_variables = ci.veccat( \
            covariance_matrix_free_variables)

        self._covariance_matrix_fcn = ci.mx_function("covariance_matrix_fcn", \
            [covariance_matrix_free_variables], \
            [self._covariance_matrix.covariance_matrix])
コード例 #15
0
ファイル: doe.py プロジェクト: adbuerger/casiopeia
    def _setup_covariance_matrix_for_evaluation(self):

        covariance_matrix_free_variables = []

        for doe_setup in self._doe_setups:

            for key in ["P", "U", "Q", "X"]:

                covariance_matrix_free_variables.append( \
                    doe_setup._discretization.optimization_variables[key])

        covariance_matrix_free_variables = ci.veccat( \
            covariance_matrix_free_variables)

        self._covariance_matrix_fcn = ci.mx_function("covariance_matrix_fcn", \
            [covariance_matrix_free_variables], \
            [self._covariance_matrix.covariance_matrix])
コード例 #16
0
ファイル: pe.py プロジェクト: MannyKayy/casiopeia
    def compute_covariance_matrix(self):
        r'''
        This function computes the covariance matrix for the estimated
        parameters from the inverse of the KKT matrix for the parameter
        estimation problem, which allows for statements on the quality of
        the values of the estimated parameters [#f1]_ [#f2]_.

        For efficiency, only the inverse of the relevant part of the matrix
        is computed [#f3]_.

        The values of the covariance matrix :math:`\Sigma_{\hat{\text{p}}}` can afterwards
        be accessed via the class attribute ``LSq.covariance_matrix``, and the
        contained standard deviations :math:`\sigma_{\hat{\text{p}}}` for the
        estimated parameters directly via 
        ``LSq.standard_deviations``.

        .. rubric:: References

        .. [#f1] |linkf1|_

        .. _linkf1:  https://www.researchgate.net/publication/228407918_Computing_Covariance_Matrices_for_Constrained_Nonlinear_Large_Scale_Parameter_Estimation_Problems_Using_Krylov_Subspace_Methods

        .. |linkf1| replace:: *Kostina, Ekaterina and Kostyukova, Olga: Computing Covariance Matrices for Constrained Nonlinear Large Scale Parameter Estimation Problems Using Krylov Subspace Methods, 2012.*

        .. [#f2] |linkf2|_

        .. _linkf2: http://www.am.uni-erlangen.de/home/spp1253/wiki/images/b/b3/Freising10_19_-_Kostina_-_Towards_Optimum.pdf

        .. |linkf2| replace:: *Kostina, Ekaterina and Kriwet, Gregor: Towards Optimum Experimental Design for Partial Differential Equations, SPP 1253 annual conference 2010, slides 12/13.*

        .. [#f3] *Walter, Eric and Prozanto, Luc: Identification of Parametric Models from Experimental Data, Springer, 1997, pages 288/289.*

        '''

        print('\n' + '# ' + 17 * '-' + \
            ' casiopeia covariance matrix computation ' + 16 * '-' + ' #')

        print('''
Computing the covariance matrix for the estimated parameters,
this might take some time ...''')

        self._tstart_covariance_computation = time.time()

        kkt_matrix = KKTMatrix(self.gauss_newton_lagrangian_hessian, \
            self._constraints, self._optimization_variables)

        fisher_matrix = FisherMatrix(kkt_matrix.kkt_matrix, \
            self._discretization.system.np)

        self._covariance_matrix = CovarianceMatrix(fisher_matrix.fisher_matrix)

        # self._covariance_matrix = DirectFactorizationCovarianceMatrix( \
        #     kkt_matrix.kkt_matrix, self._discretization.system.np)

        beta = setup_covariance_matrix_scaling_factor_beta( \
            self._constraints, self._optimization_variables, self._residuals)

        beta_fcn = ci.mx_function("beta_fcn", \
            [self._optimization_variables], [beta])

        self._beta = beta_fcn(self.estimation_results["x"])

        self._covariance_matrix_scaled = self._beta * \
            self._covariance_matrix.covariance_matrix

        covariance_matrix_fcn = ci.mx_function("covariance_matrix_fcn", \
            [self._optimization_variables], \
            [self._covariance_matrix_scaled])

        self._covariance_matrix = \
            covariance_matrix_fcn(self.estimation_results["x"])

        self._tend_covariance_computation = time.time()
        self._duration_covariance_computation = \
            self._tend_covariance_computation - \
            self._tstart_covariance_computation

        print("Covariance matrix computation finished.")
コード例 #17
0
ファイル: pe.py プロジェクト: adbuerger/casiopeia
    def _setup_nlp(self):

        self._nlp = ci.mx_function("nlp", \
            ci.nlpIn(x = self._optimization_variables), \
            ci.nlpOut(f = self._objective, g = self._constraints))
コード例 #18
0
ファイル: pe.py プロジェクト: adbuerger/casiopeia
    def compute_covariance_matrix(self):

        r'''
        This function computes the covariance matrix for the estimated
        parameters from the inverse of the KKT matrix for the parameter
        estimation problem, which allows for statements on the quality of
        the values of the estimated parameters [#f1]_ [#f2]_.

        For efficiency, only the inverse of the relevant part of the matrix
        is computed [#f3]_.

        The values of the covariance matrix :math:`\Sigma_{\hat{\text{p}}}` can afterwards
        be accessed via the class attribute ``LSq.covariance_matrix``, and the
        contained standard deviations :math:`\sigma_{\hat{\text{p}}}` for the
        estimated parameters directly via 
        ``LSq.standard_deviations``.

        .. rubric:: References

        .. [#f1] |linkf1|_

        .. _linkf1:  https://www.researchgate.net/publication/228407918_Computing_Covariance_Matrices_for_Constrained_Nonlinear_Large_Scale_Parameter_Estimation_Problems_Using_Krylov_Subspace_Methods

        .. |linkf1| replace:: *Kostina, Ekaterina and Kostyukova, Olga: Computing Covariance Matrices for Constrained Nonlinear Large Scale Parameter Estimation Problems Using Krylov Subspace Methods, 2012.*

        .. [#f2] |linkf2|_

        .. _linkf2: http://www.am.uni-erlangen.de/home/spp1253/wiki/images/b/b3/Freising10_19_-_Kostina_-_Towards_Optimum.pdf

        .. |linkf2| replace:: *Kostina, Ekaterina and Kriwet, Gregor: Towards Optimum Experimental Design for Partial Differential Equations, SPP 1253 annual conference 2010, slides 12/13.*

        .. [#f3] *Walter, Eric and Prozanto, Luc: Identification of Parametric Models from Experimental Data, Springer, 1997, pages 288/289.*

        '''

        print('\n' + '# ' + 17 * '-' + \
            ' casiopeia covariance matrix computation ' + 16 * '-' + ' #')

        print('''
Computing the covariance matrix for the estimated parameters,
this might take some time ...''')

        self._tstart_covariance_computation = time.time()

        kkt_matrix = KKTMatrix(self.gauss_newton_lagrangian_hessian, \
            self._constraints, self._optimization_variables)

        fisher_matrix = FisherMatrix(kkt_matrix.kkt_matrix, \
            self._discretization.system.np)

        self._covariance_matrix = CovarianceMatrix(fisher_matrix.fisher_matrix)

        # self._covariance_matrix = DirectFactorizationCovarianceMatrix( \
        #     kkt_matrix.kkt_matrix, self._discretization.system.np)

        beta = setup_covariance_matrix_scaling_factor_beta( \
            self._constraints, self._optimization_variables, self._residuals)

        beta_fcn = ci.mx_function("beta_fcn", \
            [self._optimization_variables], [beta])

        self._beta = beta_fcn([self.estimation_results["x"]])[0]

        self._covariance_matrix_scaled = self._beta * \
            self._covariance_matrix.covariance_matrix

        covariance_matrix_fcn = ci.mx_function("covariance_matrix_fcn", \
            [self._optimization_variables], \
            [self._covariance_matrix_scaled])

        self._covariance_matrix = \
            covariance_matrix_fcn([self.estimation_results["x"]])[0]

        self._tend_covariance_computation = time.time()
        self._duration_covariance_computation = \
            self._tend_covariance_computation - \
            self._tstart_covariance_computation

        print("Covariance matrix computation finished.")
コード例 #19
0
ファイル: doe.py プロジェクト: adbuerger/casiopeia
    def _setup_nlp(self):

        self._nlp = ci.mx_function("nlp", \
            ci.nlpIn(x = self._optimization_variables), \
            ci.nlpOut(f = self._objective, \
                g = self._equality_constraints_parameters_applied))