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

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

Сейчас я работаю над функцией оценки правления. Я представил доску в виде графика, так как это то, что нужно компьютеру в качестве входных данных. Но в этом случае вы также можете видеть это как электрическую цепь. Схема обычно выглядит так, только потом 11х11 шестигранников:

введите описание изображения здесь

Края/резисторы все либо 0,1, либо INF (бесконечность).

Моя цель - дать оценку доске. Я хочу подать электрическое напряжение на два граничных противоположных узла, а затем проверить общее сопротивление между ними.

Я сделал возможный сценарий на доске 2x2. Точки — это узлы, ребра — резисторы, числа — значения резисторов, а стрелки — мои предположения о потоке тока. введите описание изображения здесьНасколько я понимаю, я должен сделать что-то, называемое узловым анализом. Поэтому я сделал для каждого узла уравнение, в котором напряжение, входящее в узел, такое же, как и выходное. Итак, вот уравнения, которые я составил:

В 1 : ( В 1 В 2 ) 0 + ( В 1 В 3 ) 1 "=" 10
(Насколько я понимаю, номер источника напряжения не имеет значения, поэтому я выбрал 10).

В 2 : ( В 1 В 2 ) 0 "=" ( В 1 В 3 ) 1 + ( В 2 В 4 ) 1

В 3 : В 1 В 3 1 + ( В 2 В 3 ) 1 "=" ( В 3 В 4 ) 2 + ( В 3 В 5 )

В 4 : ( В 2 В 4 ) 1 + ( В 3 В 4 ) 2 "=" ( В 4 В 5 ) + ( В 4 В 6 ) 1

В 5 : ( В 3 В 5 ) + ( В 4 В 5 ) "=" ( В 5 В 6 )

В 6 : ( В 4 В 6 ) 1 + ( В 5 В 6 ) "=" 10 ?
(Я предполагаю, что текущее количество исключений здесь равно 10, но я не совсем уверен)

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

1 0 0 0 "=" 10

1 1 0 0 "=" 0

1 1 2,5 0,5 0 0 "=" 0

0 1 0,5 2,5 0 1 "=" 0

0 0 0 0 0 0 "=" 0

0 0 0 1 0 1 "=" 10 ( ? )

Если вы решите это, вы получите:

В 1 : Н а Н

В 2 : Н а Н

В 3 : 0,05

В 4 : 0,05

В 5 : 0

В 6 : 0,05

У меня сейчас два вопроса:

1. В чем моя ошибка? (потому что я не думаю, что напряжения могут быть NaN или отрицательными)

2. Если я правильно рассчитал эти напряжения, как мне рассчитать общее сопротивление?

Поверхностно я вижу несколько вещей, которые могут вызывать путаницу. Вы, кажется, смешиваете терминологию между напряжением и током - ток течет в/из узла, тогда как напряжение - это разница потенциалов между двумя узлами. Обозначение ваших узлов как V1, V2, Vx создает впечатление, что вы можете измерить напряжение в одной точке, но вы не можете. Любые 2 узла, соединенные сопротивлением 0 , не являются двумя разными узлами - это один и тот же узел, и поэтому напряжение «между ними» должно быть равно 0, поэтому вы также не можете выполнить осмысленный расчет тока там.

Ответы (2)

Установить узел В 6 "=" 0 В , начать. (Это удобно, и вы можете сделать это ровно один раз для любого узла, который вы хотите.) Также обратите внимание, что В 1 "=" В 2 , поэтому, когда вы ищете ребра, вам нужно будет найти все ребра, исходящие из всех таких общих «супер» узлов. (Так В 2 не будет отображаться ниже.) Я также заметил, что в вашем меньшем примере значение ребра равно "2", хотя я думаю, что ранее вы говорили, что только 0, 1 или было возможно. Я буду жить с этим, хотя.

Таким образом, итог здесь таков: (1) узлы, соединенные 0, являются одним и тем же узлом, и вы должны найти все ребра, исходящие из одного и того же узла, при настройке уравнений; и (2) что ребра с можно игнорировать; и (3) дроби со специальным узлом, который вы обозначили как 0 в числителе, можно отбросить.

Обратите внимание, что В 5 фактически является изолированной вершиной. Таким образом, вы не сможете вычислить напряжение для него. Это должно быть хорошо. Кроме того, у вас есть листовая вершина (я не знаю, как вы справляетесь с построением графа). Напряжение там будет неизвестно, если ребро и будет равно напряжению в подключенном узле, в противном случае. Я бы, наверное, просто установил его равным в таких случаях и покончил с этим.

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


В 12 р 13 + В 12 р 23 + В 12 р 24 "=" В 3 р 13 + В 3 р 23 + В 4 р 24 В 3 р 13 + В 3 р 23 + В 3 р 34 "=" В 12 р 13 + В 12 р 23 + В 4 р 34 В 4 р 24 + В 4 р 34 + В 4 р 46 "=" В 12 р 24 + В 3 р 34


Вышеупомянутое может быть преобразовано в:

В 12 1 р 13 | | р 23 | | р 24 + В 3 1 р 13 | | р 23 + В 4 1 р 24 "=" 0 В 12 1 р 13 | | р 23 + В 3 1 р 13 | | р 23 | | р 34 + В 4 1 р 34 "=" 0 В 12 1 р 24 + В 3 1 р 34 + В 4 1 р 24 | | р 34 | | р 46 "=" 0

Из вышесказанного симметрии также должны быть очевидны. (Посмотрите на константы и их положения.) Главная диагональ имеет уникальные значения, но остальные имеют значения, которые появляются дважды в легко заметных симметричных позициях.


Но вам не нужно первое уравнение, так как вы уже знаете значение В 12 . Таким образом, все сводится к двум нижним уравнениям, преобразованным в матричную форму:

В 3 1 р 13 | | р 23 | | р 34 + В 4 1 р 34 "=" В 12 1 р 13 | | р 23 В 3 1 р 34 + В 4 1 р 24 | | р 34 | | р 46 "=" В 12 1 р 24

Вышеупомянутое решает в вашем случае как В 3 "=" 9 1 6 В и В 4 "=" 5 5 6 В .


Решив для узловых напряжений, вы можете определить ток, просто изучив все ребра, выходящие из вашего узла 0 (если вы выберете его так, как я). Там есть только одно ребро, а именно р 46 , так что полное сопротивление здесь просто р т о т а л "=" В т о т а л я т о т а л "=" В 12 [ В 4 р 46 ] "=" р 46 В 12 В 4 .

Это работает для 1 5 7 Ом .


Вы должны быть в состоянии обобщить вышеизложенное, так как оно почти уже близко к автоматическому.

Спасибо за ваш ответ! Ваше объяснение определенно помогло мне лучше понять проблему. Я действительно думаю, что у меня возникнут проблемы с поиском всех узлов, которые вместе образуют «суперузел». Алгоритмически это очень сложно сделать, а также потребует дополнительного вычислительного времени. Нет ли способа, чтобы я мог поддерживать напряжение в каждом узле отдельно, составляя линейные уравнения? Поэтому вместо того, что вы предложили, превратить V1 и V2 в V12, просто сохранить их как V1 и V2.
@Math_Max Я не знаю, так как не тратил время на то, чтобы проработать детали для нужд твоего алгоритма. Я не уверен, что другие тоже так поступали. Конечно, я еще не читал об этом. Так что мне приходится тратить время, которое я еще не потратил. Что сразу приходит на ум, сохраняя все узлы, так это то, что вы сохраняете «0» в делителе каждого члена при их построении. Затем сделайте второй шаг обработки, каким-то образом распознав их. Лично? Однако я бы написал алгоритм обхода графа, чтобы адаптировать граф. Мне кажется более очевидным.

Я думаю, что есть более систематический способ решения схем, например, вы можете формализовать способ написания списка цепей вашей схемы, а затем реализовать [например] алгоритм MNA для решения всей схемы за вас, а затем вы можете получить эквивалентное сопротивление цепи или любой другой интересующий параметр. Я нашел библиотеку python под названием ahkab , которая реализует модифицированный алгоритм узлового анализа. если вы хотите реализовать это, вы можете проверить это

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

Формат нет-листа выглядит примерно так [вы можете сделать свой собственный формат]

v 1 6 10

1 1 3

0 1 2

1 2 3

1 2 4

2 3 4

1 4 6

end

первая строка указывает, что источник напряжения подключен к узлу 1, а 6все остальные строки указывают значение сопротивлений и место их подключения, <Resistor value> <Node1> <Node2>а также endзавершают чтение списка цепей.

Скрипт на питоне 3

import ahkab
ckt=ahkab.Circuit("Math_Max circuit")
nodes=[]
gnd=0
rCount=0
def node_replace(a,b):
    #A function for replacing 0 resistive path between nodes        
    for i in range(len(nodes)):
        if(nodes[i][1]==a):
            nodes[i][1]=b
        if(nodes[i][2]==a):
            nodes[i][2]=b

while(True):
    nlst=input().split()
    if(nlst[0]=='end'): break
    if(nlst[0]=='v'):
        gnd=int(nlst[2])
        ckt.add_vsource(nlst[0],nlst[1],ckt.gnd,dc_value=int(nlst[3]))
    else:
        nodes.append([int(nlst[0]),nlst[1],nlst[2]])

for i in range(len(nodes)):
    if(nodes[i][0]==0):
        node_replace(nodes[i][2],nodes[i][1])

for i in range(len(nodes)):
    if(nodes[i][0]!=0):
        gndNode=nodes[i][2]
        if(int(nodes[i][2])==gnd):
            gndNode=ckt.gnd
        ckt.add_resistor('r'+str(rCount),nodes[i][1],gndNode,value=nodes[i][0])
        rCount=rCount+1

results=ahkab.run(ckt, ahkab.new_op())['op']
print("TOTAL CURRENT: ",results['I(V)'][0][0])
print("Equivalent resistance: ",10/abs(results['I(V)'][0][0]))

Это был результат

введите описание изображения здесь

Код работает, оценивая общий ток с использованием алгоритма MNA, а затем делит его, source voltage / total currentчтобы получить эквивалентное сопротивление.

Спасибо за ваш ответ! К сожалению, я пишу код на Java, поэтому не могу использовать эту библиотеку. Но я пытался сам сделать алгоритм MNA, но все равно сталкиваюсь с проблемой деления на ноль. Я вижу, что в вашем нет-листе вы еще включаете нуль-резистор с 1 по 2. Вы хоть представляете, как с этой проблемой справляются в библиотеке?
Насколько я знаю, библиотека не допускает нулевое сопротивление. Вот почему приведенный выше сценарий имеет два цикла: первый проверяет пути с нулевым сопротивлением и рассматривает два узла, соединяющих их, как один узел, поскольку они оба имеют одинаковый потенциал.