Re: Сопротивление схемы электрических соединений.
От: Кодт Россия  
Дата: 25.07.03 16:36
Оценка:
Здравствуйте, Al_, Вы писали:

Al_>Вчитайтесь плс. Имхо интересно.


Al_>Вопрос в основном математический. Как расчитать полное сопротивление схемы?

Al_>Предполагается описание схемы на база ООП. Каждый резистор(к примеру) — объект, с определенными связями (пробовал брать за объект узел, но ничего хорошего не придумал).

Al_>Какую структуру лучше выбрать? Я рассматривал дерево.


Если ты выберешь для представления — не дерево, а граф, то это будет адекватнее.
Простой пример: цепь резисторного моста:
   +--R1--+--R4--+
   |      |      |
*--+      R3     +--*
   |      |      |
   +--R2--+--R5--+

Как здесь организовать дерево?
Vcc -> R1, R2
R1 <- Vcc, -> R3, R4
R2 <- Vcc, -> R3 (!!! это уже под-узел другой ветки), R5
...




Конечно, можно решать задачу путем определения участия каждого элемента в цепи. Но это — сурово.

Есть же типовая методика для решения таких задач.

Итак, граф цепи. Элементы — это ребра между узлами (точками коммутации).

1) в электрической цепи разделяют:
— источники напряжения (бесконечное сопротивление — разрыв)
— источники тока (нулевое сопротивление — КЗ)
— чисто активные/реактивные элементы.

Будем надеяться, что в цепи нет нелинейных элементов.
Если есть реактивные — будем иметь дело с комплексными числами, если нет — с вещественными.

2) Исключаем все источники, заменяя их на активные элементы (КЗ и разрывы).

3) Полученный граф будем последовательно упрощать.

* ребра-разрывы — выбрасываем
* ребра-коротыши — стягиваем две вершины в одну, ребро выбрасываем
* ребра-петли — выбрасываем (эту операцию, возможно, еще придется повторить).

Далее будем повторять:
* если к вершине (кроме полюсов) нет ребер — удаляем ее.
* если к вершине (кроме полюсов) подходит одно ребро — это обрыв — удаляем вершину и ребро.
* если к вершине (кроме полюсов) подходят два ребра — это последовательное соединение — вершину удаляем, ребра заменяем на одно.
* если ребро подходит к одной и той же вершине — это петля — удаляем его.
* если к двум вершинам подходят несколько ребер — это параллельное соединение — заменяем ребра на одно.
* наконец, если три ребра образуют треугольник — заменяем его на звезду (удаляем ребра, добавляем новую вершину и три новых ребра к вершинам треугольника).

Продолжаем, пока есть что упрощать.
В результате остаются два полюса и ребро между ними. Его сопротивление и есть сопротивление цепи.



Внешне — кажется, что алгоритм непродуктивен (постоянно занимаемся перебором всех вершин и ребер).
Однако он с легкостью поддается оптимизации.
Заводится список/множество нерассмотренных ребер и вершин; изначально в этом списке — все-все-все.
Из него вынимаем первую попавшуюся вершину и исследуем ее.
Если в результате у этой вершины изменились ребра — вновь помещаем ее в список.
Аналогично — с ребрами. Кроме того, когда мы добавляем вершину (по правилу треугольник-звезда) — тоже помещаем ее в список.
Список может быть с приоритетами: вершины отсортированы по числу ребер (сперва нули, затем одиночные, затем последовательности, затем все остальные).



Как представить такой граф — это уже интересная задача.
Объект ребро — атрибут: сопротивление; две вершины.
Объект вершина — множество ребер.
Объект граф — множество вершин (и, как объединение всех вершин — множество ребер).
Перекуём баги на фичи!
Re[2]: Сопротивление схемы электрических соединений.
От: mab Россия http://shade.msu.ru/~mab
Дата: 25.07.03 19:43
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Продолжаем, пока есть что упрощать.

К>В результате остаются два полюса и ребро между ними. Его сопротивление и есть сопротивление цепи.
Не очень понял: разве не бывает графов без треугольников, кратных ребер и вершин степени два??
Вроде бы указанные редукции к ним уже не применимы.
Re[3]: Сопротивление схемы электрических соединений.
От: Кодт Россия  
Дата: 26.07.03 14:03
Оценка:
Здравствуйте, mab, Вы писали:

mab>Здравствуйте, Кодт, Вы писали:


К>>Продолжаем, пока есть что упрощать.

К>>В результате остаются два полюса и ребро между ними. Его сопротивление и есть сопротивление цепи.
mab>Не очень понял: разве не бывает графов без треугольников, кратных ребер и вершин степени два??
mab>Вроде бы указанные редукции к ним уже не применимы.

Бывают, бывают. Например, куб.

Я уже ТОЭ в достаточной мере забыл, чтобы вспомнить, как разруливаются циклы. Как-то это делается...
Все равно там переход от цикла к звезде.
Перекуём баги на фичи!
Re[4]: Сопротивление схемы электрических соединений.
От: mab Россия http://shade.msu.ru/~mab
Дата: 26.07.03 14:15
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Я уже ТОЭ в достаточной мере забыл, чтобы вспомнить, как разруливаются циклы. Как-то это делается...

К>Все равно там переход от цикла к звезде.
А чем все-таки методы узловых потенциалов или, например, контурных токов плохи? Вроде бы составляешь систему и вперед.. Главное -- думать не надо
Re[17]: Сопротивление схемы электрических соединений.
От: Al_ Россия нпкинтегра.рф
Дата: 28.07.03 09:38
Оценка:
Здравствуйте, mab, Вы писали:

mab>Давай я попробую раз и навсегда прояснить, почему предоложенный "подход" мне кажется довольно абсурдным.

mab>>>Звучит прямо как "ты за советскую власть?
Al_>>(: Почти так и есть. Мне интересен этот подход. Думаю не придется отказываться от него.

Al_>>Можно, но со своей спецификой. Вызовы практически всех методов рекурентные, это здорово увеличивает производительость.

mab>Во-первых, скорее уж рекурсивные.
Я думал это одно и тоже. /:
mab>Во-вторых, увеличивает по сравнению с чем?
Если говорить в рамках поставленой задачи, то не знаю (скорее всего матричный метод). А вообще... помнишь, ставший уже классический пример с вычислением факториала?

mab>Может напомнить пример про вычисление чисел Фибоначчи по реккуррентному соотношению?

Милости просим, если не затруднит. С удовольствием посмотрю.

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

Поговорим об этом, когда дойду до конкретной реализации.

mab>В-четверых: зачем в рамках решаемой задачи это нужно

Смотри.

class CObject
{
public:
    BOOL CurrentIsCalculated;        // при изменении структуры эти зачения
    BOOL EndNodePotentialCalculated;    // должны обнулиться

    double Current;                // Здесь хранится выч. значение тока
    double EndPotential;            // ...значение потенциала

    CObject();
    CObject(double dImpedans);
    virtual ~CObject();
    CObject *pPrevItem;
    CQueue *pNextItems;
    CObject *GetFirstObject();
    void AppendNextItemsToQueue(CQueue *pQueue);

    double Impedans;                // Сопротивление объекта

    double CalculateCurrent();        //  Вычисляет ток, протекающий по объекту
                            // по соотношению 1-го правила Кирхгоффа.
    double VoltageFall();            // Падение напряжения на объекте
    double EndNodePotential();        // Потенциал в узле за объектом
};

class CCircuitry
{
    BOOL StructureChanged;        // Флаг изменения схемы
public:
    CCircuitry();
    ~CCircuitry();

    CObject *FirstObject;
    CObject *AddObjectTo(CObject *pObject, double dImpedans);

    //* Установка исходных данных
    void SetEndNodePotential(CObject *pObject, double dPotential);
};


Al_>>GetFirstItem() — возвращает указатель на самый первый элемент;

mab>Какой-такой самый первый элемент
Смотри сам.
CObject *CObject::GetFirstObject()
{
    if (pPrevItem) return pPrevItem->GetFirstObject();
    else return this;
}

Этото значение потребовалось в CalculateCurrent() сбора всех объектов схемы в одну очередь, чтоб затем их можно было перебрать.

В реализации CalculateCurrent() есть один момент, так что пока не проси привести его.

mab>>>Что такое "рядом находящиеся"?

Al_>>...элементы. см. класс.
mab>Смотрю. И офигеваю, потому что вроде бы особым тупизмом обычно не отличаюсь, но сейчас -- хоть убей не понимаю, что к чему.
mab>
)% А вот эти разве под это описание не подходят?!
CObject *pPrevItem;
CQueue *pNextItems;



Al_>>Никогда не занимаюсь распределением методов/свойств (кто за что отвечает) до написания кода. Имхо, пустая трата времени.

mab>Может это как-то и называется, но не ООП точно. Потому что в мало-мальски приличной системе такой подход приведет к катастрофе -- будет вноситься заплатка за заплаткой до тех пор, пока никто уже не будет вообще понимать, что происходит.
/: спасибо за критику. Пока краха ниразу не снучалось.

mab>В столь любимом тобой ООП типична ситуация, когда время на предварительную проработку на порядок больше времени написания кода.

Полностью с тобой соглласен, но в здесь, на работе, у меня нет возможности "предварительно прорабатывать", а то что я тут пишу мало заметно... поэтому тыкаемся, тыкаемся... За выходные я немного продвинулся...

Al_>>Лучше написать и наглядно оценить, затем что надо переделать. Может еще блок-схему посоветуешь написать перед началом? /:

mab>Посоветую хорошенько продумать дизайн системы перед тем, как ее писать
Ты будешь смеяться, но я еше толком методику не выбрал, а от нее много что зависит. но ты мне уже помог. За это тебе спасибо.

Al_>>Какую-то часть обязательно распихаю, возможно всю.

mab>И какую же часть? Такое ощущение, что ты думаешь, будто ООП само за тебя это решение примет.
Как потребуется, так и решу.

Al_>>Посмотрим. Как дойду до дела. Возможно что-то и вынесу за пределы ООП, в чем проблема-то?! тут главное эхотаг продумать (:

mab>Проблема в том, что думать об этом надо сейчас.
Все все равно не предусмотришь.

Al_>>Что? Перебор путей? Да мало-ли что может потребоваться...

mab>О боже...
mab>1) Потребоваться кому?
mab>2) Потребоваться когда?
mab>3) Почему о том, что может потребоваться еще непонятно когда и непонятно зачем ты думаешь сейчас? Или этому учит ООП?


Al_>>Можно — можно...

mab>Если не сложно -- приведи пример.

mab>>>Вообще же здесь есть ошибка проектирования (с точки зрения ООП): имеем класс, представляющий элемент, а сам контейнер никакому классу не соответствует. На мой взгляд, именно контейнер должен решать вопрос о построении матрицы смежности графа по собственному содержимому.

Al_>>При желании можно обойтись и без него. Да и создать его всегда можно.
mab>Ну да, я представляю себе: сначала итератор, а потом контейнер. Может это уже преувеличение, но и до этого дойти недолго.
Уже сдалал (см. выше) и, вроде никто от этого не умер. Ы?

mab>Вообще же дискуссия стала вырождаться. Если у тебя конкретный вопрос -- задай его. Например: как спроектировать такую систему. Тогда можно что-то конкретное сказать, например, что здесь видны такие абстракции, как "схема", "узел сети", "ребро сети".

Вот конкретный вопрос:
Теорема: Ток, протекающий по объекту, равен сумме токов объектов NextItems,
за вычетом токов объектов, для которых очередь NextItems такаяже как у "этого" объекта.

На основании этого расчитывается ток объекта.

mab>Вообще, лучше это в форуме "Проектирование" спрашивать.

MB

mab>Если есть привязка к C++, то, соответственно, милости просим в соответствующий форум. Только не надо обижаться, если там будут в очень крепких выражениях поминать твой CObject.

Ну думаю, что сейчас уже не такими крепкими (как видишь, там кое что переделал).

mab>С точки зрения computer science объяснено уже все: по схеме строишь систему ЛУ, а потом ее решаешь, например Гауссом. Еще советую обратить внимание на те ссылки, которые тебе дали -- весьма полезно.

Да. Сразу посмотрел и куда надо сохранил. Но пока на уме немного другая методика. Сейчас, к сожалению, уже нет времени писать. В следующем письме.
Автоматизация.ERP
Re[2]: Сопротивление схемы электрических соединений.
От: Al_ Россия нпкинтегра.рф
Дата: 29.07.03 02:23
Оценка:
Здравствуйте, Кодт, Вы писали:

Al_>>Вопрос в основном математический. Как расчитать полное сопротивление схемы?

Al_>>Предполагается описание схемы на база ООП.

К>Если ты выберешь для представления — не дерево, а граф, то это будет адекватнее.

К>Простой пример: цепь резисторного моста:
К>
К>   +--R1--+--R4--+
К>   |      |      |
К>*--+      R3     +--*
К>   |      |      |
К>   +--R2--+--R5--+
К>

К>Как здесь организовать дерево?
К>
К>Vcc -> R1, R2
К>R1 <- Vcc, -> R3, R4
К>R2 <- Vcc, -> R3 (!!! это уже под-узел другой ветки), R5
К>

Как мне сказали, это немножно не дерево (: но у меня это реализовано следующим образом:
Vcc -> R1, R2;
R1 <- Vcc; -> R3, R4
R2 <- Vcc; -> R5 (R3 второй раз не включается, он следующий элемент только для R1).
R3 <- R1; -> R5
R4 <- R1; -> End
R5 <- R2; -> End



К>Конечно, можно решать задачу путем определения участия каждого элемента в цепи. Но это — сурово.
Согласен. Уже отказался от этого.

К>Есть же типовая методика для решения таких задач.

К>Итак, граф цепи. Элементы — это ребра между узлами (точками коммутации).

К>1) в электрической цепи разделяют:

К>- источники напряжения (бесконечное сопротивление — разрыв)
К>- источники тока (нулевое сопротивление — КЗ)
К>- чисто активные/реактивные элементы.
Для начала упростим задачу, используя только активные элементы. Крайности, имхо, можно учесть и потом.

К>Будем надеяться, что в цепи нет нелинейных элементов.

Потом будут (: Сначала надо эту решить.

К>Если есть реактивные — будем иметь дело с комплексными числами, если нет — с вещественными.

Только вещественные.

К>2) Исключаем все источники, заменяя их на активные элементы (КЗ и разрывы).


К>3) Полученный граф будем последовательно упрощать.


К>* ребра-разрывы — выбрасываем

Это те, которые тольо одним концом присоеденены к узлу?

К>* ребра-коротыши — стягиваем две вершины в одну, ребро выбрасываем

Я, так понимаю, это с нулевым сопротивлением...

К>* ребра-петли — выбрасываем (эту операцию, возможно, еще придется повторить).

Оба конца — к одному узлу?

Я, выше, все уточнил, чтоб не было путаницы.
Все верно?

К>Далее будем повторять:

К>* если к вершине (кроме полюсов) нет ребер — удаляем ее.
К>* если к вершине (кроме полюсов) подходит одно ребро — это обрыв — удаляем вершину и ребро.
К>* если к вершине (кроме полюсов) подходят два ребра — это последовательное соединение — вершину удаляем, ребра заменяем на одно.
К>* если ребро подходит к одной и той же вершине — это петля — удаляем его.
К>* если к двум вершинам подходят несколько ребер — это параллельное соединение — заменяем ребра на одно.
К>* наконец, если три ребра образуют треугольник — заменяем его на звезду (удаляем ребра, добавляем новую вершину и три новых ребра к вершинам треугольника).

К>Продолжаем, пока есть что упрощать.

К>В результате остаются два полюса и ребро между ними. Его сопротивление и есть сопротивление цепи.
Все понятно. А есть 100% гарантия, того что останется одно ребро и 2 вершины? Если да, тогда я просто рад (:


К>Внешне — кажется, что алгоритм непродуктивен (постоянно занимаемся перебором всех вершин и ребер).
Отнюдь. Или, что ты подразумеваешь под непродуктивностью?..

К>Однако он с легкостью поддается оптимизации.

К>Заводится список/множество нерассмотренных ребер и вершин; изначально в этом списке — все-все-все.
К>Из него вынимаем первую попавшуюся вершину и исследуем ее.
К>Если в результате у этой вершины изменились ребра — вновь помещаем ее в список.
К>Аналогично — с ребрами. Кроме того, когда мы добавляем вершину (по правилу треугольник-звезда) — тоже помещаем ее в список.
К>Список может быть с приоритетами: вершины отсортированы по числу ребер (сперва нули, затем одиночные, затем последовательности, затем все остальные).
Ок! (:

Единственное — интересны, также, токи по каждому ребру. Но как алгоритм упрощения он весьма и весьма превлекателен.

А нелинейные элементы надо выность за пределы такого упрощения.

К>

К>Как представить такой граф — это уже интересная задача.
Вот оно! Самое интересное.

К>Объект ребро — атрибут: сопротивление; две вершины.

К>Объект вершина — множество ребер.
К>Объект граф — множество вершин (и, как объединение всех вершин — множество ребер).

Спасибо.
Автоматизация.ERP
Re[3]: Сопротивление схемы электрических соединений.
От: Кодт Россия  
Дата: 29.07.03 08:29
Оценка:
Здравствуйте, Al_, Вы писали:

К>>   +--R1--+--R4--+
К>>   |      |      |
К>>*--+      R3     +--*
К>>   |      |      |
К>>   +--R2--+--R5--+

К>>Как здесь организовать дерево?
Al_>Как мне сказали, это немножно не дерево (: но у меня это реализовано следующим образом:
Al_>
Al_>Vcc -> R1, R2;
Al_>R1 <- Vcc; -> R3, R4
Al_>R2 <- Vcc; -> R5 (R3 второй раз не включается, он следующий элемент только для R1).
Al_>R3 <- R1; -> R5
Al_>R4 <- R1; -> End
Al_>R5 <- R2; -> End
Al_>

Al_>


То есть из графа схемы ты делаешь орграф:
— у каждого ребра есть вершина-исток и вершина-сток
— список ребер, выходящих из стока, хранится в списке "следующие элементы"
— исток идентифицирован стоком "предыдущего" элемента

Почему бы в модели сразу не разделить объекты:
— вершины (клеммы)
— ребра (элементы)

Основное свойство клеммы — это потенциал; свойство элемента — сопротивление (и, как следствие разности потенциалов — ток).
При этом становится несущественно, где у элемента перед, а где зад. (В твоей модели — существенно).
Как выберешь, так и хрен с ним.

Опять же, ввод модели упрощается: просто указываешь множество клемм, и дальше — список элементов (клемма,клемма,сопротивление).
Нет нужды вводить фиктивные элементы Vcc, Vgnd.

К>>* ребра-разрывы — выбрасываем

Al_>Это те, которые тольо одним концом присоеденены к узлу?

Разрыв — это элемент с бесконечным сопротивлением.

К>>* ребра-коротыши — стягиваем две вершины в одну, ребро выбрасываем

Al_>Я, так понимаю, это с нулевым сопротивлением...

Да.

Я их перечислил для полноты картины (поскольку КЗ и ХХ возникают при удалении источников тока и напряжения).

К>>* ребра-петли — выбрасываем (эту операцию, возможно, еще придется повторить).

Al_>Оба конца — к одному узлу?

Да.

К>>Продолжаем, пока есть что упрощать.

К>>В результате остаются два полюса и ребро между ними. Его сопротивление и есть сопротивление цепи.
Al_>Все понятно. А есть 100% гарантия, того что останется одно ребро и 2 вершины? Если да, тогда я просто рад (:

Если мы умеем уничтожать циклы (превращая их в звезды) — то, без сомнения. Это легко доказать по индукции.

Al_>

К>>Внешне — кажется, что алгоритм непродуктивен (постоянно занимаемся перебором всех вершин и ребер).
Al_>Отнюдь. Или, что ты подразумеваешь под непродуктивностью?..

Имел в виду, что при сокращениях приходится постоянно сканировать граф. При тупой реализации — это исключительно долгое занятие (порядка O(N^3), если я не путаю).

К>>

К>>Как представить такой граф — это уже интересная задача.
Al_>Вот оно! Самое интересное.

Остаюсь при своем имхо, что вершины и ребра — это разные объекты (и агрегировать друг в друга не нужно).

Как сохранить при сокращениях информацию о токе через каждый элемент? Очень просто.
Каждый раз, удаляя элемент, мы не забываем его, а помечаем как выбывший.
Новые "эффективные" элементы помечаем, как вошедшие.
Клеммы мы тоже не забываем...

В результате получаем такую модель: Vcc -- R -- Gnd
Ток нам известен.
Если R — это замена последовательного соединения, то восстанавливаем клеммы и напряжения на них по току;
если параллельное — то токи по напряжению;
если звезда — то по страшной формуле.

Продолжаем, пока не останется эффективных элементов.
Перекуём баги на фичи!
Re[4]: Сопротивление схемы электрических соединений.
От: Al_ Россия нпкинтегра.рф
Дата: 29.07.03 09:17
Оценка:
Здравствуйте, Кодт, Вы писали:

Al_>>Как мне сказали, это немножно не дерево (: но у меня это реализовано следующим образом:

Al_>>
Al_>>Vcc -> R1, R2;
Al_>>R1 <- Vcc; -> R3, R4
Al_>>R2 <- Vcc; -> R5 (R3 второй раз не включается, он следующий элемент только для R1).
Al_>>R3 <- R1; -> R5
Al_>>R4 <- R1; -> End
Al_>>R5 <- R2; -> End
Al_>>


К>То есть из графа схемы ты делаешь орграф:

К>- у каждого ребра есть вершина-исток и вершина-сток
К>- список ребер, выходящих из стока, хранится в списке "следующие элементы"
К>- исток идентифицирован стоком "предыдущего" элемента
Верно. Посмотри на объект:
class CObject
{
public:
    BOOL CurrentIsCalculated;    // при изменении структуры эти зачения
    BOOL EndNodePotentialCalculated; // должны обнулиться

    double Current;                // Здесь хранится выч. значение тока
    double EndPotential;        // ...значение потенциала

    CObject(double dImpedans);
    virtual ~CObject();
/* Вот они, родные */
    CObject *pPrevObject;
    CQueue *pNextObjects;

    CObject *GetFirstObject();
/* Нужно для "переброса" всех объектов в одну очередь, чтоб потом их можно было безболезнено перебирать. См. метод CCircuitry::CollectAllObjects(CQueue **pAllObjects) ниже */
    void AppendNextItemsToQueue(CQueue *pQueue);

    double Impedans;            // Сопротивление объекта

    double CalculateCurrent();    // Вычисляет ток, протекающий по объекту
    double VoltageFall();        // Падение напряжения на объекте
    double EndNodePotential();    // Потенциал в узле за объектом
};


К>Почему бы в модели сразу не разделить объекты:

К>- вершины (клеммы)
К>- ребра (элементы)
А что это даст?

К>Основное свойство клеммы — это потенциал; свойство элемента — сопротивление (и, как следствие разности потенциалов — ток).

К>При этом становится несущественно, где у элемента перед, а где зад.
К>(В твоей модели — существенно).
Да, это нарушает логику... но пока при работе с такой системой я сталкивался с одними плюсами (: Посмотри ниже как легко она упрощается.

К>Опять же, ввод модели упрощается: просто указываешь множество клемм, и дальше — список элементов (клемма,клемма,сопротивление).

Ввод организован следующим образом: задаешь элемент, и к нему в список Next'ов добавляется новый. Легко и просто. Все это делает метод CCircuitry::AddObjectTo(CObject *pObject, double dImpedans).

А вот и схема:
class CCircuitry
{
    BOOL StructureChanged;        // Флаг изменения схемы
public:
    CCircuitry();
    ~CCircuitry();
/* Корень "дерева" */
    CObject *FirstObject;

    CObject *AddObjectTo(CObject *pObject, double dImpedans);

/* Собирает в одну очередь все элементы схемы */
    void CollectAllObjects(CQueue **pAllObjects);

/* Упрощение схемы по предложенному тобой алгоритму (реализация ниже)*/
    void SchemeSimplification();

    void DeleteObject(CObject *pObject);
    // Установка исходных данных
    void SetEndNodePotential(CObject *pObject, double dPotential);
};


К>Нет нужды вводить фиктивные элементы Vcc, Vgnd.

А я и не ввожу.
Для Vcc и Vgnd просто задаётся значение EndNodePotentialCalculated=TRUE и, соответственно, EndPotential=const.

К>>>* ребра-разрывы — выбрасываем

Al_>>Это те, которые тольо одним концом присоеденены к узлу?

К>Разрыв — это элемент с бесконечным сопротивлением.


К>>>* ребра-коротыши — стягиваем две вершины в одну, ребро выбрасываем

Al_>>Я, так понимаю, это с нулевым сопротивлением...
К>Да.

К>Я их перечислил для полноты картины (поскольку КЗ и ХХ возникают при удалении источников тока и напряжения).


К>>>* ребра-петли — выбрасываем (эту операцию, возможно, еще придется повторить).

Al_>>Оба конца — к одному узлу?
К>Да.

Вот так просто это все выглядит:
    // Рёбра-разрывы выбрасываются
    if (!pObject->pNextObjects) if (!pObject->EndNodePotentialCalculated)
    {
        DeleteObject(pObject);
        break;
    }
    // Рёбра-петли выбрасываются
    if (pObject->pNextObjects->FindByData(pObject->pPrevObject))
    {
        DeleteObject(pObject);
        break;
    }
    // Ребра-коротыши: стягиваются две вершины в одну, ребро выбрасывается
    if (!pObject->Impedans)
    {
        DeleteObject(pObject);
        break;
    }
    // Последовательное соединение:
    if (pObject->pNextObjects)
    {
        if (!pObject->EndNodePotentialCalculated) // Узел не должен запитываться.
        {
            CObject *pSecondObject;
            pObject->pNextObjects->ChoiseItems(); // Открывается выборка след. эл-тов
            if (pSecondObject=(CObject*)pObject->pNextObjects->SelectFromChoise())
                if (!pObject->pNextObjects->SelectNextFromChoise())
                {
                    // То есть в выборке только 1 элемент
                    pObject->Impedans += pSecondObject->Impedans;
                    DeleteObject(pSecondObject);
                    break;    
                }
        }
    }


К>Если мы умеем уничтожать циклы (превращая их в звезды) — то, без сомнения. Это легко доказать по индукции.

Если цикл не внёс именения в схему — значит завис ==> Принимаем меры...

Al_>>

К>>>Внешне — кажется, что алгоритм непродуктивен (постоянно занимаемся перебором всех вершин и ребер).
Al_>>Отнюдь. Или, что ты подразумеваешь под непродуктивностью?..

К>Имел в виду, что при сокращениях приходится постоянно сканировать граф. При тупой реализации — это исключительно долгое занятие (порядка O(N^3), если я не путаю).

Возможно. Как там говорится "оптимизация на этапе разработки — корень зла в программировании". Доживем увидим.

К>Остаюсь при своем имхо, что вершины и ребра — это разные объекты (и агрегировать друг в друга не нужно).

Сначаля добью свою методику, потом помотрим.

К>Как сохранить при сокращениях информацию о токе через каждый элемент? Очень просто.

К>Каждый раз, удаляя элемент, мы не забываем его, а помечаем как выбывший.
К>Новые "эффективные" элементы помечаем, как вошедшие.
К>Клеммы мы тоже не забываем...

К>В результате получаем такую модель: Vcc -- R -- Gnd

К>Ток нам известен.
К>Если R — это замена последовательного соединения, то восстанавливаем клеммы и напряжения на них по току;
К>если параллельное — то токи по напряжению;
К>если звезда — то по страшной формуле.
(: У меня есть одно предложение, как вообще обойтись без сворачивания.
Т.н. ООП-метод решения системы уравнений.
Автоматизация.ERP
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.