Моделирование электрической цепи

  • Tutorial

В данной публикации представлена инструкция по моделированию электрической цепи методом переменных состояния.

Эта публикация для того, чтобы был на русском языке хотя бы один how2 по моделированию электрических схем этим методом. В своё время я очень много гуглил и ни разу мне не попадалось нормального материала. Все методички и учебники содержали в себе только теорию. Вдобавок ни в одном, из найденных мной материалов, не было полного цикла решения:

схема ⟶ уравнения ⟶ численное решение ⟶ графики.

Собственно, это и есть алгоритм действий.

Схема есть, теперь нужно составить уравнения, используя законы Ома и Кирхгофа.

Компонентные уравнения:

$C*\frac{d{U_{c}}}{d{t}}=i_{c}; L*\frac{d{i_{l}}}{d{t}}=U_{L}; $


$U_{1}=i_{1}*R_{1}; U_{2}=i_{2}*R_{2}; U_{3}=i_{3}*R_{3}; U_{4}=i_{4}*R_{4}; U_{1}=i_{1}*R_{1};$


Контурные уравнения:

$E-U_{L}-U_{1}=0; $


$U_{1}-U_{2}-U_{3}=0;$


$U_{3}-U_{C}-U_{4}=0;$


Узловые уравнения:

$i_{L} - i_{1} - i_{2} = 0;$


$i_{2} - i_{3} - i_{4} = 0;$


$i_{c} = i_{4};$



Теперь нужно вывести дифференциальные уравнения. Отмечу, что в этом методе за переменные состояния принято брать заряды конденсаторов и потокосцепления индуктивностей. Зная эти величины, можно вывести любые напряжения и токи узлов и ветвей. Также:

  1. Уравнения должны быть независимыми;
  2. В уравнения должны входить только переменные состояния и источников; все остальные переменные должны быть выражены через переменные состояния;
  3. В левую часть каждого уравнения должна войти первая производная из переменных состояния; в правой части не должно быть производных.

Выведем первое дифференциальное уравнение:

$U_{L}=E-U_{1}=E-U_{2}-U_{3}=E-U_{2}-U_{C}-U_{4};$


$U_{L}=E-i_{2}*R_{2}-U_{C}-i_{C}*R_{4}=E-(i_{L}-\frac{E-U_{L}}{R_{1}})*R_{2}-U_{C}-i_{C}*R_{4};$


$U_{L}=E-i_{L}*R_{2}+E*\frac{R_{2}}{R_{1}}-U_{L}*\frac{R_{2}}{R_{1}}-U_{C}-i_{C}*R_{4};$


$U_{L}*\frac{R_{1}+R_{2}}{R_{1}}=E*\frac{R_{1}+R_{2}}{R_{1}}-i_{L}*R_{2}-U_{C}-i_{C}*R_{4};$


$i_{C}=i_{L}-i_{1}-i_{3}=i_{L}-\frac{E-U_{L}}{R_{1}}-\frac{U_{C}+i_{C}*R_{4}}{R_{3}};$


$i_{C}\frac{R_{3}+R_{4}}{R_{3}}=i_{L}-\frac{E-U_{L}}{R_{1}}-\frac{U_{C}}{R_{3}};$


Подставим ток конденсатора в уравнение напряжения катушки:

$U_{L}*\frac{R_{1}+R_{2}}{R_{1}}=E*\frac{R_{1}+R_{2}}{R_{1}}-i_{L}*R_{2}-U_{C}-\frac{R_{3}*R_{4}}{R_{3}+R{4}}*(i_{L}-\frac{E}{R_{1}}+\frac{U_{L}}{R_{1}}-\frac{U_{C}}{R_{3}});$


Преобразуя уравнение, получим первое дифференциальное уравнение:

$L*\frac{di_{L}}{dt}=U_{L}=E-\frac{R_{1}}{(R_{1}+R_{2})*(R_{3}+R_{4})+R_{3}*R_{4}}*(i_{L}*(R_{2}*(R_{3}+R_{4})+R_{3})-U_{C}*R_{3});$


Выведем второе дифференциальное уравнение:

$i_{C}=i_{L}-i_{1}-i_{3}=i_{L}-\frac{E-U_{L}}{R_{1}}-\frac{U_{C}}{R_{3}}-\frac{i_{C}*R_{4}}{R_{3}};$


$C*\frac{d{U_{c}}}{d{t}}=i_{c}=\frac{R_{3}}{C*(R_{3}+R_{4})}*(i_{L}-\frac{E-U_{L}}{R_{1}}-\frac{U_{C}}{R_{3}});$



Теперь у нас есть система дифференциальных уравнений, которые можно решить численно:

$ \begin{cases} L*\frac{di_{L}}{dt}=E-\frac{R_{1}}{(R_{1}+R_{2})*(R_{3}+R_{4})+R_{3}*R_{4}}*(i_{L}*(R_{2}*(R_{3}+R_{4})+R_{3})-U_{C}*R_{3}); \\ C*\frac{d{U_{c}}}{d{t}}=\frac{R_{3}}{C*(R_{3}+R_{4})}*(i_{L}-\frac{E-U_{L}}{R_{1}}-\frac{U_{C}}{R_{3}}); \end{cases}$



Воспользуемся методом Эйлера т.к. он самый простой и воспользуемся Python:

$X_{i}=X_{i-1} + h*\frac{d{X_{i-1}}}{d{t}}$


Программа
import numpy as np
import matplotlib.pyplot as plt

#Input voltage amplitude
AMP = 21.0

#Active components
r1 = 2000.0; r2 = 10.0; r3 = 10.0; r4 =2000.0;

#Reactive components
c=0.0001; l=0.06;

#Time components
T=0.01; t0=0.0; step=T/1000;
tf=T*10

steps=int(tf/step);

#Input voltage
def E(t):
    n=int(t/T)
    if ((t >= n*T )and(t <= n*T + T/2)):
        return AMP
    else:
        return 0.0


time = np.arange(t0, tf, step)

ul = []; il = []; uc = []; ic = []; y = [];

for i in range(0, steps, 1):
    y.append(E(time[i]))

def dIl_dt(t):
    return float((1.0/l)*(E(t) - (r1/((r1+r2)*(r3+r4)+r3*r4) * (il[int(t/step)]*(r2*(r3+r4)+r3) - uc[int(t/step)]*r3))))

def dUc_dt(t):
    return float((1.0/c)* (r3/(r3+r4)) * (il[int(t/step)]-(E(t)-ul[int(t/step)])/r1 - uc[int(t/step)]/r3))

#Start condition
ul.append(E(0)); il.append(0.0); uc.append(0.0); ic.append(0.0);

#Euler method
for i in range(1, steps, 1):
    il.append(il[i-1] + step*dIl_dt(time[i-1]))
    uc.append(uc[i-1] + step*dUc_dt(time[i-1]))
    ul.append(l*dIl_dt(time[i]))
    ic.append(c*dUc_dt(time[i]))

plt.figure("charts")
e = plt.subplot(311)
e.plot(time, y)
e.set_xlabel('time (s)')
e.set_ylabel('E(t), (V)', color='b')
plt.grid(True)

UL = plt.subplot(312)
UL.plot(time, ul)
UL.set_xlabel('time (s)')
UL.set_ylabel('Ul(t), (V)', color = 'b')

IL = UL.twinx()
IL.plot(time, il, 'r')
IL.set_ylabel('Il(t), (A)', color = 'r')
plt.grid(True)

UC = plt.subplot(313)
UC.plot(time, uc)
UC.set_xlabel('time (s)')
UC.set_ylabel('Uc(t), (V)', color = 'b')

IC = UC.twinx()
IC.plot(time, ic, color = 'r')
IC.set_ylabel('Ic(t), (A)', color = 'r')
plt.grid(True)

plt.show()



Результаты моделирования:


Использовать для реальных расчётов лучше другие методы решения дифур, а для получения графиков напряжений и токов элементов для самообучения достаточно и простейшего метода Эйлера. В электронике самый распространённый метод Ньютона-Рафсона- в большинстве САПР используется именно этот метод.

Из литературы советую книги Матханова П.Н. и Зевеке Г.В.
А методички всяких политехов (МГТУ, Питерский, Томский и т.п.) и подобный материал легче выкинуть, чем понять, что там написано. Здесь очень к месту крылатая фраза: «упрощять- сложно, усложнять- легко».
Поделиться публикацией
Комментарии 29
    +3
    Если вы используете Python, почему бы не взять любой интегратор из scipy.integrate? Избавились бы от жутких
    ...il[int(t/step)]...
    ...ul[int(t/step)]...
    

    А Ньютон-Рафсон — это вообще не метод решения ОДУ, это метод решения нелинейных алгебраических (систем) уравнений.
      +1
      Эта публикация для того, чтобы был на русском языке хотя бы один how2 по моделированию электрических схем этим методом.


      Не хочу придираться, но достаточно открыть любую русскую книгу по теории управления, чтобы увидеть там

      \frac{d\vec x}{dt} = \mathbf A\, \vec x + \mathbf B \, \vec u

      — уравнение в пространстве состояний, которое получено у Вас и к которому сводятся все линейные системы. Собственно Ваш текст есть описание формализации к данной системе конкретной задачи из теории цепей, что в целом полезно, но новизны не несет
        +9
        Тем не менее плюсую, так как детально описан путь от постановки задачи до кода, а это большое подспорье для новичка, образовательная польза от статьи на лицо.

        Да, и уберите в формулах символы вариаций (дельты) и замените на d. Вариация и дифференциал — разные вещи
          +2
          Для новичка уж больно сложновато, на мой взгляд, для новичка, есть такой полезный ресурс как everycircuit.com
        +3
        Хотелось бы видеть на схеме обозначения U1-U4, i1-i4.
          0
          Правила Кирхгофа (часто, в литературе, называются не совсем корректно Зако́ны Кирхго́фа)
          Wiki
            0
            Эта публикация для того, чтобы был на русском языке хотя бы один how2 по моделированию электрических схем этим методом.

            А могли бы подсказать литературу how2 по моделированию на англ языке. Спасибо.
              +1
              Книги и курс от MIT по математике и электрическим цепям.
              +2
              А методички всяких политехов (...) и подобный материал легче выкинуть, чем понять, что там написано. Здесь очень к месту крылатая фраза: «упрощять- сложно, усложнять- легко»

              Вуз конечно вузу рознь и методичка методичке тем более рознь. Некоторые может и можно выбросить. А некоторые как раз наоборот упрощены и включают всё самое необходимое изложеное понятным образом. От автора или коллектива авторов зависит. Не без причины же говорят "методичка есть — идем сдавать". И не только сдавать но и для практической работы. Наши все достижения в том числе самые передовые в мире созданы людьми учившимися по методичкам и писавшими эти методички.

                0
                Мне не попадались такие материалы.
                Не без причины же говорят «методичка есть — идем сдавать».

                Именно, что сдавать- а не понимать и использовать своё понимание.
                Наши все достижения в том числе самые передовые в мире созданы людьми учившимися по методичкам и писавшими эти методички.

                Не согласен с этим. Т.к. почти весь современный мир создан на базе трудов учёных, работавших с 30х по 80е годы прошлого века. А эти люди учились в школах по ~5 лет и в университетах ~3-4 года. И я более чем уверен, что учились они по книгам, а не по методичкам. Писать- писали, а сами учились по книгам.

                Кстати, можете ради интереса поглядеть на царские учебники по математике и физике. А потом сравнить с теми, по которым Вы учились, а потом с современными. Уверен, Вы будете удивлены, быть может, даже шокированы.
                  0
                  Раньше науки были зело суровы… Как пример:
                  Арифметика. Леонтий Филлипович Магницкий
                  Можете задачки посмотреть. И это первые 4 класса обучения!
                    0
                    Кстати, можете ради интереса поглядеть на царские учебники по математике и физике

                    Можете подсказать, где их можно найти в хорошем качестве?
                      +1
                      google, duckduckgo, yandex etc.
                  0
                  Не знаю что вы там изучаете и как, но мы в 2008 году делали такие вещи в Matlab по методичкам, сейчас ВУЗ, где я учился входит в СФУ.
                    0
                    А чем плохи готовые, специально заточенные на моделирование, системы, типа универсальной Modelica или специализированной SPICE?
                      0
                      Отсутствием абсолютного контроля над симуляцией(SPICE).
                      С Modelica не сталкивался.
                        0

                        Насколько я читал, SPICE симуляторы могут тысячи элементов в цепи обрабатывать… В уже готовом софте.


                        А какие пределы у вашего подхода?

                          0
                          Почитайте тогда ещё про степень детализации «элементов»(и линейных и нелинейных) и «моделей». А потом про сходимости и точности, с соответствующими алгоритмами.

                          К примеру, дипломная схема в пике (упрощенная до 9 дифур+ШИМ2) на 15 сек. симуляции моделировалась 1,2-1,5 часа(FX4300+8Gb+SSD+LT-Spice). В сумме в схеме 52 элемента. И это без учёта нагрева и т.п.
                      0

                      читая заголовок, ожидал что будет рассказано как работает SPICE :(

                        0
                        Будь прокляты те дни, когда в институте мне убогий препод убого преподавал Электротехнику и требовал выполнения лабораторных в Electronic Workbench. Это были без преуменьшения худшие пары за всё время обучения. В этой статье больше понятной информации, чем за 1.5 года занятий у этого препода.
                          0
                          i2= U2/R2 = U1/(R1 + R3).
                          Из этого получаем, что i2 = i3. Это ниоткуда не следует
                          Ошибка?
                            0
                            i2= U2/R2 = U1/(R1 + R3)

                            Неправильно, в статье так:
                            i2= U2/R2 = U1/(R2 + R3)
                              0
                              да, я тут опечатался.
                              i2= U2/R2 = U1/(R2 + R3) — это то, что я и имел в виду. это неверно
                                0
                                нет- это верно.
                                i2=u2/r2;
                                u2=r2*u1/(r2+r3);

                                i2--->(r2*u1/(r2+r3))/r2=u1/(r2+r3)
                            0
                            u2=r2*u1/(r2+r3)

                            Да откуда ты это взял?
                              0
                              не ты, а Вы
                              ключевые слова «делители напряжения» и «делители тока»
                                +1
                                Это бы было так [ u2=r2*u1/(r2+r3) ], если бы не было C и R4 в цепи.
                                Они влияют на суммарное сопротивление правой части, а поэтому в знаменателе будет не (R2 + R3), а ещё и некоторым образом сопротивления C и R4. Это во-первых.

                                Во-вторых. Допустим, что ваш вариант правильный. Проверяем.
                                U2/R2 = U1/ (R2 + R3)
                                U1 = U2 * (R2 + R3) / R2
                                U1 = U2 + U2*R3/R2
                                U2 = i2 * R2 => (из уравнения выше) U1 = U2 + i2 * R3
                                По правилу Кирхгофа, которые вы написали чуть выше:
                                U1 — U2 — U3 = 0 => U1 = U2 + U3
                                Но мы уже получили, что U1 = U2 + i2*R3
                                Значит, из последних 2 уравнений следует, что U3 = i2 * R3, но U3 = i3 * R3 (это вы тоже писали)
                                Следовательно i2 * R3 = i3 * R3, а i2 = i3 (?)
                                В общем случае это неверно.

                                Можете это прокомментировать?
                                  0
                                  Действительно, неверно. На выходных исправлю. Или чуток пораньше.
                                    0
                                    Исправил

                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                              Самое читаемое