def parallel(self, sys_append): """ A system is generated which is the result of a parallel connection of two systems. The inputs of this object are connected to the system that is placed in parallel and a new system is achieved with the output the sum of the outputs of both systems in parallel. Notice that the dimensions of the inputs and the outputs of both systems should be equal. Parameters ----------- sys_append : SystemBase object the system that is added in parallel. Returns -------- A SystemBase object with the parallel system's equations. Examples --------- * Place 'sys2' in parallel with 'sys1' and show the inputs, states, state equations and output equations: >>> parallel_sys = sys1.parallel(sys2) >>> print('inputs: ', parallel_sys.system.input_) >>> print('States: ', parallel_sys.system.state) >>> print('State eqs: ', parallel_sys.system.state_equation) >>> print('Output eqs: ', parallel_sys.system.output_equation) """ if (self.sys.dim_input != sys_append.sys.dim_input): error_text = '[SystemBase.parallel] Dimension of the input of the first system is not equal to the dimension of the input of the second system.' raise ValueError(error_text) elif (self.sys.dim_output != sys_append.sys.dim_output): error_text = '[SystemBase.parallel] Dimension of the output of the first system is not equal to the dimension of the output of the second system.' raise ValueError(error_text) else: inputs = self.inputs substitutions = dict(zip(sys_append.sys.input, self.sys.input)) output_equations = Array([value[0] + value[1] for value in zip(self.sys.output_equation, [msubs(expr, substitutions) for expr in sys_append.sys.output_equation])]) if (self.states is None): if (sys_append.states is None): return SystemBase(None, inputs, MemorylessSystem(input_=inputs, output_equation=output_equations)) else: states = sys_append.states state_equations = Array([msubs(expr, substitutions) for expr in sys_append.sys.state_equation]) return SystemBase(states, inputs, DynamicalSystem(state_equation=state_equations, state=states, input_=inputs, output_equation=output_equations)) else: if (sys_append.states is None): states = self.states state_equations = self.sys.state_equation else: states = Array(self.states.tolist() + sys_append.states.tolist()) state_equations2 = Array(msubs(expr, substitutions) for expr in sys_append.sys.state_equation) state_equations = Array(self.sys.state_equation.tolist() + state_equations2.tolist()) return SystemBase(states, inputs, DynamicalSystem(state_equation=state_equations, state=states, input_=inputs, output_equation=output_equations))
def series(self, sys_append): """ A system is generated which is the result of a serial connection of two systems. The outputs of this object are connected to the inputs of the appended system and a new system is achieved which has the inputs of the current system and the outputs of the appended system. Notice that the dimensions of the output of the current system should be equal to the dimension of the input of the appended system. Parameters ----------- sys_append : SystemBase object the system that is placed in a serial configuration. 'sys_append' follows the current system. Returns -------- A SystemBase object with the serial system's equations. Examples --------- * Place 'sys1' behind 'sys2' in a serial configuration and show the inputs, states, state equations and output equations: >>> series_sys = sys1.series(sys2) >>> print('inputs: ', series_sys.system.input_) >>> print('States: ', series_sys.system.state) >>> print('State eqs: ', series_sys.system.state_equation) >>> print('Output eqs: ', series_sys.system.output_equation) """ if (self.sys.dim_output != sys_append.sys.dim_input): error_text = '[SystemBase.series] Dimension of output of the first system is not equal to dimension of input of the second system.' raise ValueError(error_text) # raise SystemExit(error_text), None, sys.exc_info()[2] else: inputs = self.inputs substitutions = dict(zip(sys_append.sys.input, self.sys.output_equation)) output_equations = Array([msubs(expr, substitutions) for expr in sys_append.sys.output_equation]) if (self.states is None): if (sys_append.states is None): return SystemBase(None, inputs, MemorylessSystem(input_=inputs, output_equation=output_equations)) else: states = sys_append.states state_equations = Array([msubs(expr, substitutions) for expr in sys_append.sys.state_equation]) return SystemBase(states, inputs, DynamicalSystem(state_equation=state_equations, state=states, input_=inputs, output_equation=output_equations)) else: if (sys_append.states is None): states = self.states state_equations = self.sys.state_equation else: states = Array(self.states.tolist() + sys_append.states.tolist()) state_equations2 = Array(msubs(expr, substitutions) for expr in sys_append.sys.state_equation) state_equations = Array(self.sys.state_equation.tolist() + state_equations2.tolist()) return SystemBase(states, inputs, DynamicalSystem(state_equation=state_equations, state=states, input_=inputs, output_equation=output_equations))