Как определить эффективное сопротивление конечной сетки резисторов?

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

Моя цель: определить объемное удельное сопротивление образца горной породы с помощью резисторных цепей.

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

Предположим, у меня есть сеть резисторов на равномерной сетке, как показано ниже. В показанном примере каждый сегмент линии имеет связанный резистор, помеченный от 1 до 24 на сетке 3 на 3. Сопротивления каждого отрезка линии известны.

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

р б ты л к знак равно р е ф ф А л

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

Мой вопрос: как определить эффективное сопротивление, р е ф ф сети?

Я искал в Интернете, но все, что я могу найти, это обсуждения бесконечных сетей, токов источника и стока и т. Д. Меня не интересуют ток или напряжение.

Можно ли решить эту проблему в ее нынешнем виде?

Я бы подключил его к симулятору и позволил бы симулятору решить эту проблему. Вы можете построить свою модель как схему специй. Затем, чтобы найти сопротивление, просто используйте закон Ома (V = I * R). Spice сообщит вам ток, чтобы вы могли рассчитать R.
Все это потенциально может быть автоматизировано с помощью spice командной строки, но для проверки концепции вы можете ввести свою схему в бесплатную spice, такую ​​​​как LTSpice. Подайте напряжение и отобразите ток. LTspice также может отображать простые функции, такие как напряжение, деленное на ток (сопротивление).
Дарси, есть несколько подходов. Я хотел бы задать несколько вопросов, прежде чем высказывать какие-либо мысли. (1) Существует очень простая программа, которую вы могли бы написать. Вы ищете такой подход? (2) Вы можете решить эту проблему с помощью традиционного узлового анализа. Вы ищете такой подход? (3) Ваша проблема разбивается на вершины и ребра . (Учитывая ваш геофизический опыт, я ожидаю, что вы знаете значение этих двух терминов.) Как вы априори вычисляете значения, которые подставите для ребер?
@jonk Меня в первую очередь интересовал бы вариант (1), чтобы самому написать короткий фрагмент кода для этого. Я определяю краевые сопротивления на основе априорной геометрии пор и известного удельного сопротивления горного минерала или жидкости.
Дарси, есть также методы, основанные на триангулированных нерегулярных сетях, которые сразу же приходят мне на ум, когда вы пишете «текучие пути». Вы что-нибудь читали на эту тему? Я не знаю, каковы ваши конечные цели, но вы, возможно, захотите посмотреть и их. Их было бы здорово использовать для градиентов, помогающих понять, где «потоки» имеют тенденцию концентрироваться. Если это забота.
@Дарси Хорошо. Тогда я напишу простой ответ. Предполагается, что вы можете разделить длину и ширину на целые числа M и N, чтобы сетка была правильной. Кроме того, код довольно прост для понимания и написания.
Некоторое время назад был такой вопрос, на который было много ответов. Я не могу найти это прямо сейчас. Это самое близкое, что я могу найти.
Я помню, как видел матричную формулу в учебнике по геологии. Где твой?
Ток, протекающий в породе, зависит от механического напряжения в породе. Чтобы узнать больше об этом странном эффекте, погуглите работу Фридмана Фройнда в институте SETI. Если Фройнд — инопланетянин, то он вроде бы легальный, и у него есть разум, поэтому SETI успешна. Немного мне еще предстоит увидеть термодинамическое объяснение этого эффекта.
На вашем эскизе показаны провода, подключенные к середине резисторов в двух местах. При моделировании этих сетей мы, инженеры-электрики, только подключаем провода к узлам цепи.

Ответы (3)

Основная идея довольно проста. Вы устраиваете матрицу ( В ), который представляет «узлы» или вершины в вашей системе. Каждый из этих узлов имеет связанное с ним скалярное «напряжение», которое может быть изменено или обновлено по мере выполнения алгоритма. Также будет два узла, напряжение которых нельзя изменить. Мы собираемся применить здесь своего рода «батарею», поэтому эти два узла представляют два конца этой батареи.

Отдельно еще две матрицы ( р в и р час ) представляет ребра в системе, горизонтальные и вертикальные. Думаю, это ваши значения сопротивления. Я не знаю, как вы собираетесь их заполнять. Но это твоя проблема. Этот метод предполагает, что вы также можете заполнить эти матрицы.

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

Предположим, длина л поделен на Н л сечения и эта "длина" А поделен на Н А разделы. Затем вам нужно построить матрицу с ( Н л + 1 ) ( Н А + 1 ) вершины для скалярных значений напряжения. (или больше.) Вам также понадобятся две другие матрицы с Н А ( Н л + 1 ) вертикальные грани и Н л ( Н А + 1 ) горизонтальные ребра между этими вершинами.

Сейчас. Инициализируйте все вершины с помощью 0 В . Выберите одну из вершин слева (желательно посередине) и отметьте ее как 0 В значение, которое НЕ может быть изменено. Используйте любой метод, который вы хотите для этого. Выберите одну из вершин справа (желательно посередине) и измените ее значение на 1 В , снова принимая к сведению, что его значение НЕ может изменяться. Техника, которая работает здесь, заключается в том, чтобы просто позволить ему изменяться в обычном режиме, но затем заменять значение на каждом шаге. Но неважно, как вы этого добьетесь, лишь бы вы этого достигли.

(Есть и другие приемы из соображений эффективности. Но здесь, наверное, не стоит с ними заморачиваться.)

Теперь об алгоритме, который иногда называют шахматным или красно-черным алгоритмом. Перемещаясь по матрице напряжения узла, обработайте каждый узел, где сумма двух индексов, я + Дж четно, выполняя следующее простое присваивание:

В я , Дж знак равно р час я , Дж 1 р час я , Дж ( В я 1 , Дж р в я , Дж + В я + 1 , Дж р в я 1 , Дж ) р час я , Дж 1 р час я , Дж ( р в я , Дж + р в я 1 , Дж ) + р в я 1 , Дж р в я , Дж ( р час я , Дж + р час я , Дж 1 ) + р в я 1 , Дж р в я , Дж ( В я , Дж 1 р час я , Дж + В я , Дж + 1 р час я , Дж 1 ) р час я , Дж 1 р час я , Дж ( р в я , Дж + р в я 1 , Дж ) + р в я 1 , Дж р в я , Дж ( р час я , Дж + р час я , Дж 1 )

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

Это обновит все узлы, где сумма я + Дж даже. Теперь вы выполняете ту же процедуру для всех узлов, где сумма я + Дж странно. Выполнив оба эти шага, вы завершили один цикл.

При необходимости сбросьте специальные два узла (для 0 В и для 1 В как обсуждалось ранее.) Или, если вы защитили эти два узла, нет необходимости их сбрасывать.

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

Когда вы останавливаете процесс, вы можете легко определить сопротивление, выбрав либо просмотр узлов, окружающих ваш защищенный слева узел, либо просмотр узлов, окружающих ваш защищенный справа узел. (Может быть хорошей идеей сделать вашу матрицу достаточно большой [на 1 во всех направлениях], чтобы у вас фактически было четыре узла, окружающих любой вариант.) Разница в напряжениях между окружающими узлами и специальным узлом, деленная на сопротивление на краях между ними говорит вам о текущем входе/выходе вашего специального узла. Поскольку это узел «батарея», этот ток должен быть ВСЕм текущим. Так как напряжение 1 В , по определению, деление 1 на сумму этих четырех токов, которые вы найдете, дает вам общее сопротивление.

Я смотрю на какой-то код, который я написал, всего 67 строк с кучей комментариев. Так что писать НЕ сложно.

«Краткое изложение» этой идеи состоит в том, что вы применяете 1 В аккумулятор, а затем наблюдайте, как напряжение распространяется по всей системе. Как только напряжение стабилизируется (ваши критерии для этого), все, что вам нужно сделать, это посмотреть на ток, входящий или выходящий из одной или другой клеммы аккумулятора. Они оба должны быть одинаковыми текущими значениями (в некоторых числовых пределах) по очевидным причинам.


Почему вы должны разделить систему на i+j = четное и i+j = нечетное?

Предположим, вы вычисляете В 5 , 5 знак равно ф ( В 4 , 5 , В 6 , 5 , В 5 , 4 , В 5 , 6 ) . Это относится к узлам, которые окружают В 5 , 5 . Это нормально. Предположим, вы затем вычисляете В 5 , 6 знак равно ф ( В 4 , 6 , В 6 , 6 , В 5 , 5 , В 5 , 7 ) . Обратите внимание, что в списке параметров есть значение, которое вы только что вычислили для В 5 , 5 ? Это бы сильно "размазало" вещи. Это не звук. Вместо этого каждый цикл нечетного/четного должен «выглядеть так, как будто» он произошел в один и тот же момент. Таким образом, ваше следующее вычисление должно быть В 5 , 7 знак равно ф ( В 4 , 7 , В 6 , 7 , В 5 , 6 , В 5 , 8 ) потому что ни один из входов функции не является узлами, которые были изменены на этом шаге. Затем вы поворачиваетесь и вычисляете альтернативы, избегая размытия, но теперь обновляя альтернативы. Вы действительно должны сделать это таким образом.

Кроме того, идентична ли формула как для четных, так и для нечетных шагов?

Да, это то же самое.

Можно ли все это решить за один шаг, используя какую-нибудь линейную систему Ax=b, где A — линейный оператор, а b — граничные условия? Глядя на это, кажется, что это чем-то похоже на конечно-разностные методы решения уравнений в частных производных.

Связь есть. Я думаю, что это называется «безматричной» реализацией.


Вот пример. Для моделирования в LTSpice был помещен следующий набор номиналов резисторов:

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

Я говорил кратко и просто. Как видите, приблизительный расчетный ток от 1 В блок питания указан как 30.225 мА . (Фактическое значение, вычисленное Spice, было 30.224552 мА .)

Я запустил следующую программу VB.NET:

Module GEOGRID

    Const NL As Integer = 2
    Const NA As Integer = 2
    Const INF As Double = 1.0E+32

    Sub Main()

        Static Rh As Double(,) = New Double(NL + 2, NA + 1) {
                    {INF, INF, INF, INF},
                    {INF, 5, 21, INF},
                    {INF, 76, 10, INF},
                    {INF, 32, 22, INF},
                    {INF, INF, INF, INF}}
        Static Rv As Double(,) = New Double(NA + 1, NL + 2) {
                    {INF, INF, INF, INF, INF},
                    {INF, 61, 50, 16, INF},
                    {INF, 56, 45, 18, INF},
                    {INF, INF, INF, INF, INF}}
        Dim V As Double(,) = New Double(NL + 2, NA + 2) {
                    {0, 0, 0, 0, 0},
                    {0, 0, 0, 0, 0},
                    {0, 0, 0, 1, 0},
                    {0, 0, 0, 0, 0},
                    {0, 0, 0, 0, 0}}
        Dim PDE As Func(Of Integer, Integer, Double) = Function(ByVal i As Integer, ByVal j As Integer) (
                    Rh(i, j - 1) * Rh(i, j) * (V(i - 1, j) * Rv(i, j) + V(i + 1, j) * Rv(i - 1, j)) +
                    Rv(i - 1, j) * Rv(i, j) * (V(i, j - 1) * Rh(i, j) + V(i, j + 1) * Rh(i, j - 1))
                  ) / (
                    Rh(i, j - 1) * Rh(i, j) * (Rv(i, j) + Rv(i - 1, j)) +
                    Rv(i - 1, j) * Rv(i, j) * (Rh(i, j) + Rh(i, j - 1))
                  )
        Dim IV As Func(Of Integer, Integer, Double) = Function(ByVal i As Integer, ByVal j As Integer) 0 +
                    (V(i, j) - V(i - 1, j)) / Rv(i - 1, j) + (V(i, j) - V(i + 1, j)) / Rv(i, j) +
                    (V(i, j) - V(i, j - 1)) / Rh(i, j - 1) + (V(i, j) - V(i, j + 1)) / Rh(i, j)
        Dim idx As Integer = NA \ 2 + 1
        Dim jdx1 As Integer = NL + 1
        Dim jdx2 As Integer = 1
        For x As Integer = 1 To 1000
            For k As Integer = 0 To (NA + 1) * (NL + 1) - 1 Step 2
                Dim i As Integer = k \ (NL + 1)
                Dim j As Integer = k - i * (NL + 1) + 1
                i += 1
                If Not (i = idx AndAlso (j = jdx1 OrElse j = jdx2)) Then V(i, j) = PDE(i, j)
            Next
            For k As Integer = 1 To (NA + 1) * (NL + 1) - 1 Step 2
                Dim i As Integer = k \ (NL + 1)
                Dim j As Integer = k - i * (NL + 1) + 1
                i += 1
                If Not (i = idx AndAlso (j = jdx1 OrElse j = jdx2)) Then V(i, j) = PDE(i, j)
            Next
        Next
        Console.WriteLine("R = " & (1.0 / IV(idx, jdx1)).ToString)
        Console.WriteLine("R = " & (-1.0 / IV(idx, jdx2)).ToString)
    End Sub

End Module

Со следующим распечатанным результатом: р знак равно 33.0856844038614 Ом . Какой правильный ответ.

В приведенной выше программе показан способ установки резисторов по вертикали и горизонтали, а также матрицы напряжения, что упрощает некоторые тесты для несуществующих узлов и/или значений резисторов. Таким образом, код становится немного чище, хотя и требует большего количества элементов массива. (Я просто сделал значения дополнительных резисторов бесконечными.) Просто сравните то, как я установил массивы, с тем, как была уложена схема, и я думаю, что вы сможете точно определить все. подробности здесь.

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

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

И последнее замечание. Просто чтобы доказать, что вы можете использовать ток любого узла с фиксированным напряжением для вычисления резистора, я использовал две строки, чтобы распечатать оба значения: одно вычислено из 0 В стороны и один вычисляется из 1 В сторона. В любом случае вы должны увидеть один и тот же номер.

(Хорошо. Еще одно последнее замечание. Это было бы гораздо лучше нацелено на F # или любой достойный компилятор, ориентированный на систему с массовыми параллельными вычислениями. Каждое вычисление в «красном» или «черном» может выполняться параллельно, совершенно независимо друг от друга. F# делает это тривиальным.Поэтому закодировано на F#, вы можете запустить это на всех доступных ядрах без каких-либо специальных действий.Это просто работает.Просто примечание на случай, если вы каким-то образом собираете МНОГО данных и, возможно, захотите взять все преимущества многоядерной системы.)


КОНЕЦ ПРИМЕЧАНИЕ:

Вывод довольно прост из KCL. Поместите четыре резистора в следующем порядке:

схематический

смоделируйте эту схему - схема, созданная с помощью CircuitLab

Применить KCL:

В р 1 + В р 2 + В р 3 + В р 4 знак равно В 1 р 1 + В 2 р 2 + В 3 р 3 + В 4 р 4 В знак равно ( В 1 р 1 + В 2 р 2 + В 3 р 3 + В 4 р 4 ) ( р 1 ∣∣ р 2 ∣∣ р 3 ∣∣ р 4 )

Некоторые игры с алгеброй приводят к результату, который я использовал в коде.

Спасибо за отличный ответ. У меня есть несколько уточняющих вопросов. 1) Почему вы должны разделить систему на я + Дж = четное и я + Дж = странно? 2) Можно ли решить все за один шаг, используя какую-то линейную систему? А Икс знак равно б куда А является линейным оператором и б обеспечивает граничные условия? Глядя на это, кажется, что это чем-то похоже на конечно-разностные методы решения уравнений в частных производных...
Кроме того, идентична ли формула как для четных, так и для нечетных шагов?
@ Дарси Я напишу еще немного, чтобы осветить эти проблемы.
Еще раз спасибо за подробности. И последний вопрос (может быть, это можно было бы выделить в отдельный вопрос, но я задам его здесь): если все резисторы в сети имеют одинаковое сопротивление (скажем, 1 Ом), следует ли из этого, что эффективное сопротивление также должно быть 1 Ом? Моя интуиция подсказывает, что так и должно быть, но я не уверен.
Я закодировал задачу в MATLAB для простой системы 2x2, которую вы показали выше. Я получаю тот же ответ, что и вы, что обнадеживает. Если я установлю для всех резисторов значение 1 Ом, то при запуске моей программы эффективное сопротивление также будет равно 1 Ом. Это соответствует тому, что подсказывает моя интуиция. Однако, когда я перехожу на систему 3x3 или 4x4, моя интуиция больше не работает. Для системы 4x4 с одинаковыми резисторами 1 Ом я получаю эффективное сопротивление 1,3636 Ом. Это ошибка или моя интуиция просто неверна?
@Darcy Ваша интуиция неверна, и результат MATLAB правильный.
@Darcy Если это поможет, эта ссылка содержит полезное обсуждение, также касающееся конечных сеток: Infinite Grid of Resistors . Однако он должен обратиться к вашей интуиции. Моя собственная интуиция склонна подходить к проблеме по-другому. По мере того, как сетка становится бесконечно тоньше, будет один путь проводимости через середину плюс пары чуть более низкой проводимости по обеим сторонам (пути эллиптической формы), вырастающие до полного круга. Я бы пренебрег разницей квадрата и круга в этом. Но ИП обязательно появится.
Можете ли вы предоставить источник, откуда вы взяли уравнение шахматной доски? Я предполагаю, что он использует KCL или что-то в этом роде? Я не понимаю, как вы его получили. Nvm: я получил это здесь: en.wikipedia.org/wiki/Nodal_analysis
@Darcy Да, я получил это на месте от KCL, вручную, только для вас.

Вы, конечно, можете использовать подход 2D-резисторной сети для моделирования 2D-задачи, но это может стать несколько сложным при переходе к 3-м измерениям. Возможно, вы захотите рассмотреть возможность использования более традиционного (в наши дни) подхода с объемными проводниками, определенными в ваших доменах, с соответствующей проводимостью, назначенной каждому. Бесплатный программный код FEMM ( http://www.femm.info/wiki/HomePage ) очень эффективен и может использоваться для 2D, осевой симметрии и 3D. Оттуда вы можете подумать о переходе на гораздо более эффективные коды, такие как SCIrun ( https://www.sci.utah.edu/), который представляет собой академический код для задач объемного дирижера значительной сложности. Я обычно использую его для сеток из более чем миллиона тетраэдров. Несмотря на то, что он был в первую очередь разработан для биологического моделирования, он должен отлично работать для того, что вы делаете. Примеры прямых задач в инструментарии прямого/обратного решения должны помочь вам в работе. Обратные задачи также могут оказаться полезными для импедансной томографии. Обычно я использую версию 4, поскольку работа над версией 5 все еще продолжается. Программное обеспечение также имеет интерфейс к tetgen, который является отличным кодом для построения сетки.

Наконец, если вы не против потратить деньги, всегда есть COMSOL, который очень прост в использовании (и довольно дорог).

Меня не интересует ток или напряжение.

Вы заинтересованы в этом . Сопротивление — это просто отношение тока к напряжению, при условии, что у вас есть решение для тока для некоторого внешнего напряжения. И вы можете решить это, используя любой пакет SPICE напрямую.

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