Automatic Control Knowledge Repository

You currently have javascript disabled. Some features will be unavailable. Please consider enabling javascript.

Details for: "Plate Experiment for the active vibration damping of large flexible space structures, example of order 10"

Name: Plate Experiment for the active vibration damping of large flexible space structures, example of order 10 (Key: CO152)
Path: ackrep_data/system_models/compleib_models/DLR1 View on GitHub
Type: system_model
Short Description: DLR1 Plate Experiment for the active vibration damping of large flexible space structures, example of order 10 J. Bals, "Aktive Schwingungsdaempfung flexibler Strukturen", Universitaet Karlsruhe, Fakultaet fuer Elektrotechnik, Germany, 1989 reduced system
Created: 2022-10-10 15:57:36
Compatible Environment: default_conda_environment (Key: CDAMA)
Source Code [ / ] simulation.py
# This file was autogenerated from the template: simulation.py.template (2022-10-10 15:57:36).

import numpy as np
import system_model
from scipy.integrate import solve_ivp, odeint

from ackrep_core import ResultContainer
from ackrep_core.system_model_management import save_plot_in_dir
import matplotlib.pyplot as plt
import os
from ipydex import Container

# link to documentation with examples: https://ackrep-doc.readthedocs.io/en/latest/devdoc/contributing_data.html


def simulate():
    """
    simulate the system model with scipy.integrate.solve_ivp

    :return: result of solve_ivp, might contains input function
    """

    model = system_model.Model()

    rhs_xx_pp_symb = model.get_rhs_symbolic()
    rhs = model.get_rhs_func()

    # initial state values
    xx0 = np.ones(model.sys_dim)

    t_end = 10
    tt = np.linspace(0, t_end, 1000)

    simulation_data = solve_ivp(rhs, (0, t_end), xx0, t_eval=tt)

    # using odeint for models with large state vectors
    # res = odeint(rhs, y0=xx0, t=tt, tfirst=True)
    # simulation_data = Container()
    # simulation_data.y = res.transpose()
    # simulation_data.t = tt

    # postprocessing: calc output
    ny = 2
    C = model.get_parameter_value("C")
    D21 = model.get_parameter_value("D21")
    output = np.zeros((ny, len(tt)))
    for i in range(len(tt)):
        output[:,i] = np.matmul(C, simulation_data.y[:,i]) # + np.matmul(D21, w)
    simulation_data.output = output

    save_plot(simulation_data)

    return simulation_data


def save_plot(simulation_data):
    """
    plot your data and save the plot
    access to data via: simulation_data.t   array of time values
                        simulation_data.y   array of data components
                        simulation_data.uu  array of input values

    :param simulation_data: simulation_data of system_model
    :return: None
    """

    for i in range(simulation_data.output.shape[0]):
        plt.plot(simulation_data.t, simulation_data.output[i], label=f"$y_{i}$")

    plt.legend()
    plt.tight_layout()

    save_plot_in_dir()


def evaluate_simulation(simulation_data):
    """
    assert that the simulation results are as expected

    :param simulation_data: simulation_data of system_model
    :return:
    """
    expected_final_state = np.array([-0.02819038, -1.31048949, -0.30388007, -1.2716792 , -0.60003846,
       -0.30082901, -0.37207171, -3.49977691, -0.16657734, -1.51459235])

    rc = ResultContainer(score=1.0)
    simulated_final_state = simulation_data.y[:, -1]
    rc.final_state_errors = [
        simulated_final_state[i] - expected_final_state[i] for i in np.arange(0, len(simulated_final_state))
    ]
    rc.success = np.allclose(expected_final_state, simulated_final_state, rtol=0, atol=1e-2)

    return rc
system_model.py
# This file was autogenerated from the template: system_model.py.template (2022-10-10 15:57:36).

import sympy as sp
import numpy as np
import symbtools as st
import importlib
import sys, os
#from ipydex import IPS, activate_ips_on_exception  

from ackrep_core.system_model_management import GenericModel, import_parameters

# Import parameter_file
params = import_parameters()


#link to documentation with examples: https://ackrep-doc.readthedocs.io/en/latest/devdoc/contributing_data.html


class Model(GenericModel): 

    def initialize(self):
        """
        this function is called by the constructor of GenericModel

        :return: None
        """

        # Define number of inputs -- MODEL DEPENDENT
        self.u_dim = 2

        # Set "sys_dim" to constant value, if system dimension is constant 
        self.sys_dim = 10

        # check existence of params file
        self.has_params = True
        self.params = params
        

    # ----------- SET DEFAULT INPUT FUNCTION ---------- # 
    def uu_default_func(self):
        """
        define input function
    
        :return:(function with 2 args - t, xx_nv) default input function 
        """ 
        
        def uu_rhs(t, xx_nv):
            """
            sequence of numerical input values

            :param t:(scalar or vector) time
            :param xx_nv:(vector or array of vectors) numeric state vector
            :return:(list) numeric inputs 
            """ 
            u = np.zeros(self.u_dim)
            return u

        return uu_rhs


    # ----------- SYMBOLIC RHS FUNCTION ---------- # 

    def get_rhs_symbolic(self):
        """
        define symbolic rhs function

        :return: matrix of symbolic rhs-functions
        """
        if self.dxx_dt_symb is not None:
            return self.dxx_dt_symb

        x = self.xx_symb  
        A, B, B1, C1, C, D11, D12, D21 = self.pp_symb   # parameters
        w = np.zeros(2) # noise
        u = self.uu_symb   # inputs

        # define symbolic rhs functions
        self.dxx_dt_symb = np.matmul(A,x) + np.matmul(B1,w) + np.matmul(B,u)
        



        return self.dxx_dt_symb
    
parameters.py
# This file was autogenerated from the template: parameters.py.template (2022-10-10 15:57:36).

import sys
import os
import numpy as np
import sympy as sp

import tabulate as tab


#link to documentation with examples: https://ackrep-doc.readthedocs.io/en/latest/devdoc/contributing_data.html


# set model name
model_name = 'Plate Experiment for the active vibration damping of large flexible space structures, example of order 10'


# ---------- create symbolic parameters
A = sp.MatrixSymbol('A', 10, 10)
B = sp.MatrixSymbol('B', 10, 2)
B1 = sp.MatrixSymbol('B1', 10, 2)
C1 = sp.MatrixSymbol('C1', 2, 10)
C = sp.MatrixSymbol('C', 2, 10)
D11 = sp.MatrixSymbol('D11', 2, 2)
D12 = sp.MatrixSymbol('D12', 2, 2)
D21 = sp.MatrixSymbol('D21', 2, 2)

pp_symb = [A, B, B1, C1, C, D11, D12, D21]


# ---------- create auxiliary symbolic parameters 

# set numerical values of auxiliary parameters
# trailing "_nv" stands for "numerical value"
A_nv = sp.Matrix(np.array([[ 0.000000e+00,  0.000000e+00,  0.000000e+00,  0.000000e+00,
         0.000000e+00,  1.000000e+00,  0.000000e+00,  0.000000e+00,
         0.000000e+00,  0.000000e+00],
       [ 0.000000e+00,  0.000000e+00,  0.000000e+00,  0.000000e+00,
         0.000000e+00,  0.000000e+00,  1.000000e+00,  0.000000e+00,
         0.000000e+00,  0.000000e+00],
       [ 0.000000e+00,  0.000000e+00,  0.000000e+00,  0.000000e+00,
         0.000000e+00,  0.000000e+00,  0.000000e+00,  1.000000e+00,
         0.000000e+00,  0.000000e+00],
       [ 0.000000e+00,  0.000000e+00,  0.000000e+00,  0.000000e+00,
         0.000000e+00,  0.000000e+00,  0.000000e+00,  0.000000e+00,
         1.000000e+00,  0.000000e+00],
       [ 0.000000e+00,  0.000000e+00,  0.000000e+00,  0.000000e+00,
         0.000000e+00,  0.000000e+00,  0.000000e+00,  0.000000e+00,
         0.000000e+00,  1.000000e+00],
       [-8.426800e+00,  0.000000e+00,  9.655700e+00,  0.000000e+00,
        -5.083000e+00, -2.530000e-02,  0.000000e+00,  1.550000e-02,
         0.000000e+00, -1.120000e-02],
       [ 0.000000e+00, -2.020220e+01,  0.000000e+00,  2.007360e+01,
         0.000000e+00,  0.000000e+00, -2.440000e-02,  0.000000e+00,
         1.510000e-02,  0.000000e+00],
       [-2.394250e+01,  0.000000e+00, -1.073540e+01,  0.000000e+00,
        -1.470685e+02, -4.900000e-03,  0.000000e+00, -3.590000e-02,
         0.000000e+00, -8.490000e-02],
       [ 0.000000e+00,  1.261547e+02,  0.000000e+00, -1.328028e+02,
         0.000000e+00,  0.000000e+00,  9.470000e-02,  0.000000e+00,
        -1.089000e-01,  0.000000e+00],
       [-3.990500e+01,  0.000000e+00,  6.607000e+00,  0.000000e+00,
        -1.884411e+02, -2.470000e-02,  0.000000e+00,  1.600000e-03,
         0.000000e+00, -1.368000e-01]]))
B_nv = sp.Matrix(np.array([[ 0.    ,  0.    ],
       [ 0.    ,  0.    ],
       [ 0.    ,  0.    ],
       [ 0.    ,  0.    ],
       [ 0.    ,  0.    ],
       [-0.001 , -0.001 ],
       [-0.0133,  0.0133],
       [ 0.048 ,  0.048 ],
       [-0.0516,  0.0516],
       [ 0.0213,  0.0213]]))
B1_nv = sp.Matrix(np.array([[ 0.    ,  0.    ],
       [ 0.    ,  0.    ],
       [ 0.    ,  0.    ],
       [ 0.    ,  0.    ],
       [ 0.    ,  0.    ],
       [-0.001 , -0.001 ],
       [-0.0133,  0.0133],
       [ 0.048 ,  0.048 ],
       [-0.0516,  0.0516],
       [ 0.0213,  0.0213]]))
C1_nv = sp.Matrix(np.array([[ 0.    ,  1.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,
         0.    ,  0.    ,  0.    ],
       [-0.8084,  0.    ,  0.7509,  0.    , -0.9501,  0.    ,  0.    ,
         0.    ,  0.    ,  0.    ]]))
C_nv = sp.Matrix(np.array([[ 0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.0115, -0.0536,
         0.9713, -0.2009, -0.5746],
       [ 0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.0115,  0.0536,
         0.9713,  0.2009, -0.5746]]))
D11_nv = sp.Matrix(np.array([[0., 0.],
       [0., 0.]]))
D12_nv = sp.Matrix(np.array([[1., 0.],
       [0., 1.]]))
D21_nv = sp.Matrix(np.array([[0.    , 0.    ],
       [0.0972, 0.7509]]))


# ---------- create symbolic parameter functions
# parameter values can be constant/fixed values OR set in relation to other parameters (for example: a = 2*b)  


# list of symbolic parameter functions
# tailing "_sf" stands for "symbolic parameter function"
pp_sf = [A_nv, B_nv, B1_nv, C1_nv, C_nv, D11_nv, D12_nv, D21_nv]


#  ---------- list for substitution
# -- entries are tuples like: (independent symbolic parameter, numerical value)
pp_subs_list = []


# OPTONAL: Dictionary which defines how certain variables shall be written
# in the table - key: Symbolic Variable, Value: LaTeX Representation/Code
# useful for example for complex variables: {Z: r"\underline{Z}"}
latex_names = {}


# ---------- Define LaTeX table

# Define table header 
# DON'T CHANGE FOLLOWING ENTRIES: "Symbol", "Value"
tabular_header = ["Symbol", "Value"]

# Define column text alignments
col_alignment = ["center", "left"]


# Define Entries of all columns before the Symbol-Column
# --- Entries need to be latex code
col_1 = [] 

# contains all lists of the columns before the "Symbol" Column
# --- Empty list, if there are no columns before the "Symbol" Column
start_columns_list = []


# Define Entries of the columns after the Value-Column
# --- Entries need to be latex code
col_4 = []

# contains all lists of columns after the FIX ENTRIES
# --- Empty list, if there are no columns after the "Value" column
end_columns_list = []

Related Problems:
Extensive Material:
Download pdf
Result: Success.
Last Build: Checkout CI Build
Runtime: 3.6 (estimated: 10s)