import numpy as np
import matplotlib.pyplot as plt

# Параметры цепи
R1 = 10      # Ом
R2 = 40      # Ом
R3 = 10      # Ом
C = 200e-6   # Ф
U0 = 10       # В
omega = 1000 # рад/с
T = 2 * np.pi / omega
tau = C * (R1 * R2 + R1 * R3 + R2 * R3) / (R1 + R2)  # Постоянная времени

t0 = np.pi / omega  # Начинаем с k=1

n_periods = round((3 * tau)/(2 * np.pi / omega))

t_total = []
u_vyh_total = []
i_vh_total = []
u_C_total = []

u_C_prev = 7  # Напряжение на конденсаторе в момент t0
t_prev = t0

for n in range(n_periods * 2):
    t_start = t_prev
    t_end = t_prev + T/2
    t = np.linspace(t_start, t_end, 1000)
    
    if n % 2 == 0:
        U_vh = U0
    else:
        U_vh = -U0 

    u_C_ust = U_vh * R2 / (R1 + R2)

    R_eq = (R1 * R2) / (R1 + R2) +R3 
    tau = C * R_eq
    p = -1 / tau
    
    A = u_C_prev - u_C_ust
    
    u_C = u_C_ust + A * np.exp(p * (t - t_start))
    
    i_3 = C * A * p * np.exp(p * (t - t_start))
    
    u_vyh = u_C + R3 * i_3
    
    i_vh = i_3 + u_vyh / R2
    
    t_total.extend(t)
    u_vyh_total.extend(u_vyh)
    i_vh_total.extend(i_vh)
    u_C_total.extend(u_C)

    print(f"\nИнтервал {n + 1}:")
    print(f"  Время от {t_start:.6f} с до {t_end:.6f} с")
    print(f"  Входное напряжение U_vh = {U_vh} В")
    print(f"  Установившееся напряжение на конденсаторе u_C_ust = {u_C_ust:.4f} В")
    print(f"  Коэффициент A = {A:.4f} В")
    print(f"  Напряжение на конденсаторе в конце интервала u_C_end = {u_C[-1]:.4f} В")
    print(f"  Ток через конденсатор в начале интервала i_3_start = {i_3[0]:.6f} А")
    print(f"  Входной ток в начале интервала i_vh_start = {i_vh[0]:.6f} А")
    
    u_C_prev = u_C[-1]
    t_prev = t_end

t_total = np.array(t_total)
u_vyh_total = np.array(u_vyh_total)
i_vh_total = np.array(i_vh_total)

plt.figure(figsize=(14, 8))

plt.subplot(3, 1, 1)
plt.plot(t_total, u_C_total, label='Напряжение на $U_{c}(t)$')
plt.xlabel('Время, с')
plt.ylabel('$U_{c}(t)$, В')
plt.title('Изменение напряжения на конденсаторе за {} полупериодов'.format(n_periods))
plt.grid(True)
plt.legend()

plt.subplot(3, 1, 2)
plt.plot(t_total, i_vh_total, label='Входной ток $i_{вх}(t)$')
plt.xlabel('Время, с')
plt.ylabel('$i_{вх}(t)$, А')
plt.title('Изменение входного тока за {} полупериодов'.format(n_periods))
plt.grid(True)
plt.legend()

plt.subplot(3, 1, 3)
plt.plot(t_total, u_vyh_total, label='Выходное напряжение $u_{вых}(t)$', color='red')
plt.xlabel('Время, с')
plt.ylabel('$u_{вых}(t)$, В')
plt.title('Изменение выходного напряжения за {} полупериодов'.format(n_periods))
plt.grid(True)
plt.legend()

plt.tight_layout()
plt.savefig('images/4_2.png', dpi=300)