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


14

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

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

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

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

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

ρbulk=ReffAL

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

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

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

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


2
Я бы подключил его к симулятору, и пусть симулятор решит его. Вы можете построить свою модель как цепь специй. Затем, чтобы найти сопротивление, просто используйте закон Ома (V = I * R). Spice расскажет вам ток, чтобы вы могли рассчитать R.
Mkeith

1
Все это потенциально может быть автоматизировано с использованием специй командной строки, но для подтверждения концепции вы можете ввести свою схему в бесплатную специю, такую ​​как LTSpice. Подайте напряжение и отобразите ток. LTspice также может отображать простые функции, такие как напряжение, деленное на ток (сопротивление).
Mkeith

Дарси, есть несколько подходов. Я хотел бы задать несколько вопросов, прежде чем предлагать какие-либо мысли. (1) Существует очень легкое программное обеспечение, которое вы можете написать. Вы ищете такой подход? (2) Вы можете решить эту проблему с помощью традиционного узлового анализа. Вы ищете такой подход? (3) Ваша проблема разбивается на вершины и ребра . (Учитывая ваш опыт геофизиков, я ожидаю, что вы знаете значение этих двух терминов.) Как вы априори определяете значения, которые вы добавляете для краев?
Джон

@jonk В первую очередь меня заинтересовал бы вариант (1), чтобы сам написать небольшой фрагмент кода для этого. Я определяю краевые сопротивления на основе априорной геометрии пор и известного удельного сопротивления минерала или флюида породы.
Дарси

Дарси, есть также методы, которые опираются на триангулированные нерегулярные сети, которые сразу же приходят мне в голову, когда вы пишете «плавные пути». Вы читали что-нибудь на эту тему? Я не знаю, каковы ваши цели в конечном итоге, но вы можете посмотреть их тоже. Это было бы здорово использовать для градиентов, помогающих вам понять, где "токи" будут иметь тенденцию концентрироваться. Если это проблема.
Джон

Ответы:


11

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

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

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

Давайте предположим, что длина разделена на N L секций, а «длина» A разделена на N A секций. Затем вам нужно будет построить матрицу с ( N L + 1 )( N A + 1 ) вершинами для значений скалярного напряжения. (или больше.) Вам также понадобятся эти две другие матрицы с N A( N L + 1 ) вертикальными ребрами и N L( N A + 1).LNLANA(NL+1)(NA+1)NA(NL+1) горизонтальные ребра между этими вершинами.NL(NA+1)

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

(Существуют и другие методы по соображениям эффективности. Но, вероятно, здесь не стоит их использовать.)

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

Vi,j=Rhi,j1Rhi,j(Vi1,jRvi,j+Vi+1,jRvi1,j)Rhi,j1Rhi,j(Rvi,j+Rvi1,j)+Rvi1,jRvi,j(Rhi,j+Rhi,j1)+Rvi1,jRvi,j(Vi,j1Rhi,j+Vi,j+1Rhi,j1)Rhi,j1Rhi,j(Rvi,j+Rvi1,j)+Rvi1,jRvi,j(Rhi,j+Rhi,j1)

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

Это обновит все узлы, где сумма является четной. Теперь вы выполняете ту же процедуру для всех узлов, где сумма i + j нечетна. После выполнения обоих этих шагов вы завершили один цикл.i+ji+j

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

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

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

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

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


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

V5,5=f(V4,5,V6,5,V5,4,V5,6)V5,5V5,6=f(V4,6,V6,6,V5,5,V5,7)V5,5V5,7=f(V4,7,V6,7,V5,6,V5,8)потому что ни один из входов в функцию не является узлами, которые были изменены во время этого шага. Затем вы качаетесь и вычисляете альтернативы, избегая появления пятен, но теперь обновляете альтернативы. Вы действительно должны сделать это таким образом.

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

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

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

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


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

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

1V30.225mA30.224552mA

Я запустил следующую программу 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

R=33.0856844038614Ω

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

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

xx

0V1V

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


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

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

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

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

Применить KCL:

VR1+VR2+VR3+VR4=V1R1+V2R2+V3R3+V4R4V=(V1R1+V2R2+V3R3+V4R4)(R1∣∣R2∣∣R3∣∣R4)

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


i+ji+jAx=bAb

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

2
@Darcy Я напишу немного больше, чтобы помочь решить эти проблемы.
Джон

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

1
@Darcy Ваша интуиция не так, и результат MATLAB верен.
Джон

1

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.