Skip to content

Docs Módulo modelo_mat_aeropendulo

labvirtual.simulador_aeropendulo.modelo_mat_aeropendulo.ModeloMatAeropendulo

Bases: object

Modelo Matemático do Aeropêndulo para simulação dinâmica

Parameters:

Name Type Description Default
x_0 List[float]

Condições iniciais para simulação.

[0.1, -0.5]
K_m float

float

0.0296
m float

Massa total do Aeroèndulo (braço + Motor + Hélices).

0.36
d float

Tamanho do Braço do Aeropêndulo.

0.03
J float

Momento de Inércia do Aeropêndulo.

0.0106
c float

coeficente de atrito do Aeropêndulo.

0.0076
Source code in labvirtual/simulador_aeropendulo/modelo_mat_aeropendulo.py
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
class ModeloMatAeropendulo(object):
    """
    Modelo Matemático do Aeropêndulo para simulação dinâmica

    Args:
        x_0: Condições iniciais para simulação.
        K_m: float
        m: Massa total do Aeroèndulo (braço + Motor + Hélices).
        d: Tamanho do Braço do Aeropêndulo.
        J: Momento de Inércia do Aeropêndulo.
        c: coeficente de atrito do Aeropêndulo.
    """

    def __init__(self, x_0: List[float] = [0.1, -0.5], K_m: float = 0.0296,
                 m: float = 0.36, d: float = 0.03, J: float = 0.0106,
                 c: float = 0.0076) -> None:
        # Parâmetros do Aeropêndulo.
        self.K_m = K_m
        self.m = m
        self.d = d
        self.J = J
        self.g = 9.8
        self.c = c

        # Configuração para simulação
        self.t: Array1XN
        self.x = x_0
        self.x1: List[List[float]] = [[], []]

        # Sinal de Entrada
        self.u = 0.0

        # Sinulação
        self.simu = False
        self.simu_dinamic = False

    def set_u(self, u):
        self.u = u

    def modelo_aeropendulo(self, x: List[float] | Array1XN,
                           t: float | Array1XN) -> Array1XN:
        """
        Método que implementa o modelo matemático do aeropêndulo.
        Args:
            x: Estados atuais do sistema.
            t: necessário caso use scipy.integrate.odeint
        Returns:
            Retorna um array numpy contendo a derivada dos estados.
        """
        # Variáveis de estado a partir do vetor de estados
        x1, x2 = x

        # Equação de estado dx2 = f(x, u)
        dx2 = x1

        # Equação de estado dx1 = f(x, u)
        dx1 = (- x1*self.c - self.m*self.g*self.d*np.sin(x2) +
               self.u*self.K_m) / (self.J)
        dx = np.array([dx1, dx2])      # Derivada do vetor de estados
        return dx                      # Retorna a derivada do vetor de estados

    def simular(self, t_simu: int = 100, ts: float = 0.1,
                x_0: List[float] = [0.1, -0.5]) -> None:
        """
        Método que implementa uma simulação com scipy.integrate.odeint,
        no final plota os gráficos dos estados do sistema para a dada
        simulação.
        Args:
            t_simu: tempo de simulação, Padrão: 100.
            ts: Período de amostragem, Padrão: 0.1
            x_0: Condições iniciais para simulação
        """
        self.simu = True
        self.t_simu = t_simu
        self.ts = ts
        self.t = ts*np.arange(0, t_simu+ts, ts)
        # Condições iniciais
        self.x_0 = x_0
        # Integração com método odeint() da biblioteca scipy.integrate
        self.x_ = odeint(self.modelo_aeropendulo, self.x_0, self.t)
        self.plotar_graficos()

    def simulacao_dinamica(self, t_simu: int = 100, ts: float = 0.1,
                           x_0: List[float] = [0.1, -0.5]) -> None:
        """
        Método que implementa uma simulação com integrtação usando o laço for,
        no final plota os gráficos dos estados do sistema para a dada
        simulação.
        Args:
            t_simu: tempo de simulação, Padrão: 100.
            ts: Período de amostragem, Padrão: 0.1
            x_0: Condições iniciais do sistema.
        """
        self.simu_dinamic = True
        self.t_simu = t_simu
        self.ts = ts
        self.t = ts*np.arange(0, t_simu+ts, ts)
        self.x = x_0
        for j, i in enumerate(self.t):
            dx = self.modelo_aeropendulo(self.x, self.t)
            try:
                dt = (self.t[j+1]-i)
            except Exception:
                pass
            self.x = self.x + dt * dx
            self.x1[0].append(self.x[0])
            self.x1[1].append(self.x[1])
        self.plotar_graficos()

    def plotar_graficos(self) -> None:
        """
        Método para plotagem dos gráficos de simulação interna, para os métodos
        simular() e simulacao_dinamica(), plota os gráficos dos estados do
        sistema, velocidade e posição.
        """
        plt.figure(figsize=(10, 7))
        plt.suptitle("Gráficos dos estados do Aeropêndulo")

        plt.subplot(211)
        if self.simu:
            plt.plot(self.t, self.x_[:, 0], lw=3.5)
        if self.simu_dinamic:
            plt.plot(self.t, self.x1[0])

        plt.subplot(212)
        if self.simu:
            plt.plot(self.t, self.x_[:, 1], lw=2)
        if self.simu_dinamic:
            plt.plot(self.t, self.x1[1])
        if self.simu or self.simu_dinamic:
            plt.show()

set_u(u)

Source code in labvirtual/simulador_aeropendulo/modelo_mat_aeropendulo.py
64
65
def set_u(self, u):
    self.u = u

modelo_aeropendulo(x, t)

Método que implementa o modelo matemático do aeropêndulo.

Parameters:

Name Type Description Default
x List[float] | Array1XN

Estados atuais do sistema.

required
t float | Array1XN

necessário caso use scipy.integrate.odeint

required

Returns:

Type Description
Array1XN

Retorna um array numpy contendo a derivada dos estados.

Source code in labvirtual/simulador_aeropendulo/modelo_mat_aeropendulo.py
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
def modelo_aeropendulo(self, x: List[float] | Array1XN,
                       t: float | Array1XN) -> Array1XN:
    """
    Método que implementa o modelo matemático do aeropêndulo.
    Args:
        x: Estados atuais do sistema.
        t: necessário caso use scipy.integrate.odeint
    Returns:
        Retorna um array numpy contendo a derivada dos estados.
    """
    # Variáveis de estado a partir do vetor de estados
    x1, x2 = x

    # Equação de estado dx2 = f(x, u)
    dx2 = x1

    # Equação de estado dx1 = f(x, u)
    dx1 = (- x1*self.c - self.m*self.g*self.d*np.sin(x2) +
           self.u*self.K_m) / (self.J)
    dx = np.array([dx1, dx2])      # Derivada do vetor de estados
    return dx                      # Retorna a derivada do vetor de estados

simular(t_simu=100, ts=0.1, x_0=[0.1, -0.5])

Método que implementa uma simulação com scipy.integrate.odeint, no final plota os gráficos dos estados do sistema para a dada simulação.

Parameters:

Name Type Description Default
t_simu int

tempo de simulação, Padrão: 100.

100
ts float

Período de amostragem, Padrão: 0.1

0.1
x_0 List[float]

Condições iniciais para simulação

[0.1, -0.5]
Source code in labvirtual/simulador_aeropendulo/modelo_mat_aeropendulo.py
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
def simular(self, t_simu: int = 100, ts: float = 0.1,
            x_0: List[float] = [0.1, -0.5]) -> None:
    """
    Método que implementa uma simulação com scipy.integrate.odeint,
    no final plota os gráficos dos estados do sistema para a dada
    simulação.
    Args:
        t_simu: tempo de simulação, Padrão: 100.
        ts: Período de amostragem, Padrão: 0.1
        x_0: Condições iniciais para simulação
    """
    self.simu = True
    self.t_simu = t_simu
    self.ts = ts
    self.t = ts*np.arange(0, t_simu+ts, ts)
    # Condições iniciais
    self.x_0 = x_0
    # Integração com método odeint() da biblioteca scipy.integrate
    self.x_ = odeint(self.modelo_aeropendulo, self.x_0, self.t)
    self.plotar_graficos()

simulacao_dinamica(t_simu=100, ts=0.1, x_0=[0.1, -0.5])

Método que implementa uma simulação com integrtação usando o laço for, no final plota os gráficos dos estados do sistema para a dada simulação.

Parameters:

Name Type Description Default
t_simu int

tempo de simulação, Padrão: 100.

100
ts float

Período de amostragem, Padrão: 0.1

0.1
x_0 List[float]

Condições iniciais do sistema.

[0.1, -0.5]
Source code in labvirtual/simulador_aeropendulo/modelo_mat_aeropendulo.py
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
def simulacao_dinamica(self, t_simu: int = 100, ts: float = 0.1,
                       x_0: List[float] = [0.1, -0.5]) -> None:
    """
    Método que implementa uma simulação com integrtação usando o laço for,
    no final plota os gráficos dos estados do sistema para a dada
    simulação.
    Args:
        t_simu: tempo de simulação, Padrão: 100.
        ts: Período de amostragem, Padrão: 0.1
        x_0: Condições iniciais do sistema.
    """
    self.simu_dinamic = True
    self.t_simu = t_simu
    self.ts = ts
    self.t = ts*np.arange(0, t_simu+ts, ts)
    self.x = x_0
    for j, i in enumerate(self.t):
        dx = self.modelo_aeropendulo(self.x, self.t)
        try:
            dt = (self.t[j+1]-i)
        except Exception:
            pass
        self.x = self.x + dt * dx
        self.x1[0].append(self.x[0])
        self.x1[1].append(self.x[1])
    self.plotar_graficos()

plotar_graficos()

Método para plotagem dos gráficos de simulação interna, para os métodos simular() e simulacao_dinamica(), plota os gráficos dos estados do sistema, velocidade e posição.

Source code in labvirtual/simulador_aeropendulo/modelo_mat_aeropendulo.py
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
def plotar_graficos(self) -> None:
    """
    Método para plotagem dos gráficos de simulação interna, para os métodos
    simular() e simulacao_dinamica(), plota os gráficos dos estados do
    sistema, velocidade e posição.
    """
    plt.figure(figsize=(10, 7))
    plt.suptitle("Gráficos dos estados do Aeropêndulo")

    plt.subplot(211)
    if self.simu:
        plt.plot(self.t, self.x_[:, 0], lw=3.5)
    if self.simu_dinamic:
        plt.plot(self.t, self.x1[0])

    plt.subplot(212)
    if self.simu:
        plt.plot(self.t, self.x_[:, 1], lw=2)
    if self.simu_dinamic:
        plt.plot(self.t, self.x1[1])
    if self.simu or self.simu_dinamic:
        plt.show()