

#
# y'' + 3y' + 4y = 2u
#
# x1 = y
# x2 = y'
#
# x1' = x2
# x2' + 3 x2 + 4 x1 = 2 u
#
#
# x1' = |  0    1 | |x1|   |0|
# x2' = | -4   -3 | |x2| + |2| u
#
class G1:
    def __init__(self):
        self.x1 = 0
        self.x2 = 0

    def evaluate(self, u, delta_t):
        temp_x1 = self.x1 + self.x2 * delta_t
        temp_x2 = self.x2 - 4 * delta_t * self.x1 - 3 * delta_t * self.x2 + 2 * delta_t * u
        output = self.x1
        self.x1 = temp_x1
        self.x2 = temp_x2
        return output


class G2:
    def __init__(self):
        self.y = 0

    def evaluate(self, u, delta_t):
        output = self.y
        self.y = self.y - 0.5 * self.y * delta_t + 4 * u * delta_t
        return output


class BigSystem:
    def __init__(self):
        self.g1 = G1()
        self.g2 = G2()

    def evaluate(self, u, delta_t):
        return self.g2.evaluate(self.g1.evaluate(u, delta_t), delta_t)

