diff --git a/bode.py b/bode.py new file mode 100644 index 0000000..f8d8ecf --- /dev/null +++ b/bode.py @@ -0,0 +1,38 @@ +import numpy as np +import matplotlib.pyplot as plt + +# Define the frequency range for the Bode plot +omega = np.logspace(-2, 2, 1000) # Frequency range from 0.01 to 100 rad/s + +# Define the transfer function parameters +T_values = [0.2, 1, 5] + +# Create subplots +fig, (ax_mag, ax_phase) = plt.subplots(2, 1, figsize=(10, 8)) + +# Plot for each T value +for T in T_values: + G_mag = 20 * np.log10(1 / np.sqrt(1 + (omega * T)**2)) + G_phase = -np.degrees(np.arctan(omega * T)) + + ax_mag.plot(omega, G_mag, label=f'T = {T}') + ax_phase.plot(omega, G_phase, label=f'T = {T}') + +# Magnitude plot settings +ax_mag.set_xscale('log') +ax_mag.set_title('Bode Magnitude Plot') +ax_mag.set_ylabel('Magnitude (dB)') +ax_mag.grid(True) +ax_mag.legend() + +# Phase plot settings +ax_phase.set_xscale('log') +ax_phase.set_title('Bode Phase Plot') +ax_phase.set_ylabel('Phase (degrees)') +ax_phase.set_xlabel('Frequency (rad/s)') +ax_phase.grid(True) +ax_phase.legend() + +plt.tight_layout() +plt.show() + diff --git a/nyquist.py b/nyquist.py new file mode 100644 index 0000000..c7fb6f7 --- /dev/null +++ b/nyquist.py @@ -0,0 +1,32 @@ +# Requires 'control' package: +# pip install control +import numpy as np +import matplotlib.pyplot as plt +import control as ctrl + +def nyquist_diagram(T): + # Define the numerator and denominator of the transfer function + numerator = [1] # Numerator of the transfer function + den1 = [1, 1, 1] # First part of the denominator + den2 = [T, 1] # Second part of the denominator + + # Convolve the two denominator parts + denominator = np.convolve(den1, den2) + + # Create the transfer function + system = ctrl.TransferFunction(numerator, denominator) + + # Generate the Nyquist plot + ctrl.nyquist_plot(system) + + # Enhance plot appearance + plt.title('Nyquist Diagram') + plt.xlabel('Real') + plt.ylabel('Imaginary') + plt.grid(True) + plt.show() + +# Example usage +T = 1 # Time constant +nyquist_diagram(T) + diff --git a/step.py b/step.py new file mode 100644 index 0000000..aaec257 --- /dev/null +++ b/step.py @@ -0,0 +1,37 @@ +import numpy as np +import matplotlib.pyplot as plt +from scipy.signal import TransferFunction, step + +def step_rc(R, C, t_end, step_amplitude): + # Define the transfer function H(s) = 1 / (RCs + 1) + num = [1] + den = [R * C, 1] + system = TransferFunction(num, den) + + # Generate time points + t = np.linspace(0, t_end, 1000) + + # Calculate the step response + t, response = step(system, T=t) + + # Scale the response by the step amplitude + response *= step_amplitude + + # Plot the step response + plt.plot(t, response) + plt.title('Step Response of RC Circuit') + plt.xlabel('Time (s)') + plt.ylabel('Response (V)') + plt.grid(True) + plt.show() + + return t, response + +# Example usage +R = 1000 # Ohms +C = 1e-6 # Farads +t_end = 0.01 # seconds +step_amplitude = 5 # Volts + +t, response = step_rc(R, C, t_end, step_amplitude) + diff --git a/step2.py b/step2.py new file mode 100644 index 0000000..fe0066e --- /dev/null +++ b/step2.py @@ -0,0 +1,32 @@ +import numpy as np +import matplotlib.pyplot as plt +from scipy.signal import TransferFunction, step + +def step_response(T, t_end): + # Define the transfer function H(s) = (-Ts + 1) / (s^3 + 3s^2 + 2s + 1) + num = [-T, 1] + den = [1, 3, 2, 1] + system = TransferFunction(num, den) + + # Generate time points + t = np.linspace(0, t_end, 1000) + + # Calculate the step response + t, response = step(system, T=t) + + # Plot the step response + plt.plot(t, response) + plt.title('Step Response of the System') + plt.xlabel('Time (s)') + plt.ylabel('Response') + plt.grid(True) + plt.show() + + return t, response + +# Example usage +T = 1 # Time constant +t_end = 10 # seconds + +t, response = step_response(T, t_end) + diff --git a/step3.py b/step3.py new file mode 100644 index 0000000..60b9ec5 --- /dev/null +++ b/step3.py @@ -0,0 +1,41 @@ +import numpy as np +import matplotlib.pyplot as plt +from scipy.signal import TransferFunction, step, convolve + +def step_response(numerator, denominator, t_end, step_amplitude): + # Define the transfer function H(s) = numerator / denominator + system = TransferFunction(numerator, denominator) + + # Generate time points + t = np.linspace(0, t_end, 1000) + + # Calculate the step response + t, response = step(system, T=t) + + # Scale the response by the step amplitude + response *= step_amplitude + + # Plot the step response + plt.plot(t, response) + plt.title('Step Response of the System') + plt.xlabel('Time (s)') + plt.ylabel('Response') + plt.grid(True) + plt.show() + + return t, response + +# Example usage +T = 1 # Time constant +numerator = [1] # Numerator of the transfer function +den1 = [1, 1, 1] # First part of the denominator +den2 = [T, 1] # Second part of the denominator + +# Convolution of the two denominator parts +denominator = convolve(den1, den2) + +t_end = 20 # Duration of the simulation +step_amplitude = 0.1 # Step amplitude + +t, response = step_response(numerator, denominator, t_end, step_amplitude) +