| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- #!/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()
|