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

Эта публикация для того, чтобы был на русском языке хотя бы один 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)


  1. Uranix
    12.03.2017 13:03
    +3

    Если вы используете Python, почему бы не взять любой интегратор из scipy.integrate? Избавились бы от жутких

    ...il[int(t/step)]...
    ...ul[int(t/step)]...
    

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


  1. maisvendoo
    12.03.2017 14:42
    +1

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


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

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

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


    1. maisvendoo
      12.03.2017 14:47
      +9

      Тем не менее плюсую, так как детально описан путь от постановки задачи до кода, а это большое подспорье для новичка, образовательная польза от статьи на лицо.

      Да, и уберите в формулах символы вариаций (дельты) и замените на d. Вариация и дифференциал — разные вещи


      1. htonych
        12.03.2017 21:04
        +2

        Для новичка уж больно сложновато, на мой взгляд, для новичка, есть такой полезный ресурс как everycircuit.com


  1. iliasam
    12.03.2017 15:42
    +3

    Хотелось бы видеть на схеме обозначения U1-U4, i1-i4.


  1. leocat33
    12.03.2017 17:40

    Правила Кирхгофа (часто, в литературе, называются не совсем корректно Зако?ны Кирхго?фа)
    Wiki


  1. GreySS
    12.03.2017 17:40

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

    А могли бы подсказать литературу how2 по моделированию на англ языке. Спасибо.


    1. gazpar
      12.03.2017 17:48
      +1

      Книги и курс от MIT по математике и электрическим цепям.


  1. oklas
    12.03.2017 22:12
    +2

    А методички всяких политехов (...) и подобный материал легче выкинуть, чем понять, что там написано. Здесь очень к месту крылатая фраза: «упрощять- сложно, усложнять- легко»

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


    1. gazpar
      13.03.2017 08:18

      Мне не попадались такие материалы.

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

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

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

      Кстати, можете ради интереса поглядеть на царские учебники по математике и физике. А потом сравнить с теми, по которым Вы учились, а потом с современными. Уверен, Вы будете удивлены, быть может, даже шокированы.


      1. leocat33
        13.03.2017 09:14

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


      1. envtmp
        13.03.2017 18:06

        Кстати, можете ради интереса поглядеть на царские учебники по математике и физике

        Можете подсказать, где их можно найти в хорошем качестве?


        1. gazpar
          13.03.2017 18:07
          +1

          google, duckduckgo, yandex etc.


  1. zloidemon
    13.03.2017 10:44

    Не знаю что вы там изучаете и как, но мы в 2008 году делали такие вещи в Matlab по методичкам, сейчас ВУЗ, где я учился входит в СФУ.


  1. potan
    13.03.2017 15:19

    А чем плохи готовые, специально заточенные на моделирование, системы, типа универсальной Modelica или специализированной SPICE?


    1. gazpar
      13.03.2017 18:12

      Отсутствием абсолютного контроля над симуляцией(SPICE).
      С Modelica не сталкивался.


      1. nikolay_karelin
        13.03.2017 21:58

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


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


        1. gazpar
          13.03.2017 22:07

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

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


  1. FGV
    13.03.2017 18:07

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


  1. Itachi261092
    14.03.2017 11:32

    Будь прокляты те дни, когда в институте мне убогий препод убого преподавал Электротехнику и требовал выполнения лабораторных в Electronic Workbench. Это были без преуменьшения худшие пары за всё время обучения. В этой статье больше понятной информации, чем за 1.5 года занятий у этого препода.


  1. erwin_shrodinger
    14.03.2017 18:15

    i2= U2/R2 = U1/(R1 + R3).
    Из этого получаем, что i2 = i3. Это ниоткуда не следует
    Ошибка?


    1. gazpar
      14.03.2017 18:16

      i2= U2/R2 = U1/(R1 + R3)

      Неправильно, в статье так:
      i2= U2/R2 = U1/(R2 + R3)


      1. erwin_shrodinger
        14.03.2017 18:24

        да, я тут опечатался.
        i2= U2/R2 = U1/(R2 + R3) — это то, что я и имел в виду. это неверно


        1. gazpar
          14.03.2017 18:43

          нет- это верно.
          i2=u2/r2;
          u2=r2*u1/(r2+r3);

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


  1. erwin_shrodinger
    15.03.2017 11:35

    u2=r2*u1/(r2+r3)

    Да откуда ты это взял?


    1. gazpar
      15.03.2017 18:33

      не ты, а Вы
      ключевые слова «делители напряжения» и «делители тока»


      1. erwin_shrodinger
        16.03.2017 17:53
        +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 (?)
        В общем случае это неверно.

        Можете это прокомментировать?


        1. gazpar
          16.03.2017 20:55

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


        1. gazpar
          16.03.2017 22:17

          Исправил