#!/usr/bin/python3 # This file was automatically generated from drawio2cbd with the command: # ../../drawio2cbd.py ImpExp.xml ImpExp.py -e Experiment from CBD.src.CBD import * import matplotlib.pyplot as plt def plot_signals(block, signals, title): times = [] outputs = [] for signal in signals: tvpl = block.getSignal(signal) times = [t for t, _ in tvpl] outputs.append([v for _, v in tvpl]) # Plot plt.figure() plt.title(title) plt.xlabel('time') plt.ylabel('N') for i in range(len(signals)): plt.plot(times, outputs[i], label=signals[i]) plt.legend() plt.show() class Explicit(CBD): def __init__(self, block_name, D=(0.1)): CBD.__init__(self, block_name, input_ports=[], output_ports=['OUT1', 'OUT2']) # Create the blocks self.addBlock(DelayBlock(block_name='prev_x')) self.addBlock(AdderBlock(block_name='sum_x')) self.addBlock(ConstantBlock(block_name='D', value=(D))) self.addBlock(ProductBlock(block_name='mul_x')) self.addBlock(DelayBlock(block_name='prev_y')) self.addBlock(AdderBlock(block_name='sum_y')) self.addBlock(NegatorBlock(block_name='neg')) self.addBlock(ProductBlock(block_name='mul_y')) self.addBlock(ConstantBlock(block_name='zero', value=(0))) self.addBlock(ConstantBlock(block_name='one', value=(1))) # Connect the blocks self.addConnection('prev_x', 'sum_x') self.addConnection('D', 'mul_x') self.addConnection('mul_x', 'sum_x') self.addConnection('D', 'neg') self.addConnection('neg', 'mul_y') self.addConnection('prev_y', 'sum_y') self.addConnection('mul_y', 'sum_y') self.addConnection('sum_x', 'prev_x') self.addConnection('prev_x', 'mul_y') self.addConnection('sum_y', 'prev_y') self.addConnection('zero', 'prev_x', input_port_name='IC') self.addConnection('one', 'prev_y', input_port_name='IC') self.addConnection('prev_y', 'mul_x') self.addConnection('sum_x', 'OUT1') self.addConnection('sum_y', 'OUT2') class Implicit(CBD): def __init__(self, block_name, D=(0.1)): CBD.__init__(self, block_name, input_ports=[], output_ports=['OUT1', 'OUT2']) # Create the blocks self.addBlock(DelayBlock(block_name='prev_x')) self.addBlock(AdderBlock(block_name='sum_x')) self.addBlock(ConstantBlock(block_name='D', value=(D))) self.addBlock(ProductBlock(block_name='mul_x')) self.addBlock(DelayBlock(block_name='prev_y')) self.addBlock(AdderBlock(block_name='sum_y')) self.addBlock(NegatorBlock(block_name='neg')) self.addBlock(ProductBlock(block_name='mul_y')) self.addBlock(ConstantBlock(block_name='zero', value=(0))) self.addBlock(ConstantBlock(block_name='one', value=(1))) # Connect the blocks self.addConnection('prev_x', 'sum_x') self.addConnection('D', 'mul_x') self.addConnection('mul_x', 'sum_x') self.addConnection('D', 'neg') self.addConnection('neg', 'mul_y') self.addConnection('prev_y', 'sum_y') self.addConnection('mul_y', 'sum_y') self.addConnection('sum_x', 'prev_x') self.addConnection('sum_y', 'prev_y') self.addConnection('zero', 'prev_x', input_port_name='IC') self.addConnection('one', 'prev_y', input_port_name='IC') self.addConnection('sum_x', 'OUT1') self.addConnection('sum_y', 'OUT2') self.addConnection('sum_x', 'mul_y') self.addConnection('sum_y', 'mul_x') class Experiment(CBD): def __init__(self, block_name, D=(0.1)): CBD.__init__(self, block_name, input_ports=[], output_ports=['implicit', 'explicit', 'sin(iD)']) # Create the blocks self.addBlock(Explicit(block_name='explicitBlock', D=(D))) self.addBlock(Implicit(block_name='implicitBlock', D=(D))) self.addBlock(GenericBlock(block_name='sin', block_operator=("sin"))) self.addBlock(ConstantBlock(block_name='D', value=(D))) self.addBlock(ProductBlock(block_name='prod')) self.addBlock(TimeBlock(block_name='time')) # Connect the blocks self.addConnection('implicitBlock', 'implicit') self.addConnection('explicitBlock', 'explicit') self.addConnection('D', 'prod') self.addConnection('time', 'prod') self.addConnection('prod', 'sin') self.addConnection('sin', 'sin(iD)') if __name__ == '__main__': import math for D in [0.1, 0.001]: cbd = Experiment("experiment", D) # Run the simulation cbd.run(int(math.ceil(2 * math.pi / D))) # cbd.run(500) # process simulation results plot_signals(cbd, ['implicit', 'explicit', 'sin(iD)'], f'Explicit vs Implicit (D={D})') exp = cbd.getSignal('explicit') imp = cbd.getSignal('implicit') times = [e[0] for e in exp] err = [exp[x][1] - imp[x][1] for x in range(len(exp))] plt.figure() plt.title(f"ERROR (D = {D})") plt.xlabel('time') plt.ylabel('N') plt.plot(times, err) plt.show()