Отказ от ответственности: я геофизик с ограниченным образованием в области электротехники. Я не уверен, является ли эта проблема невероятно простой, невероятно сложной или совершенно бессмысленной.
Моя цель: определить объемное удельное сопротивление образца горной породы с помощью резисторных цепей.
Образец горной породы должен быть смоделирован с использованием сети резисторов, в которой одни резисторы имеют высокое сопротивление (представляющие твердую породу), а другие резисторы имеют низкое сопротивление (представляющие пути жидкости в породе).
Предположим, у меня есть сеть резисторов на равномерной сетке, как показано ниже. В показанном примере каждый сегмент линии имеет связанный резистор, помеченный от 1 до 24 на сетке 3 на 3. Сопротивления каждого отрезка линии известны.
Общая длина сетки а "площадь" (в данном случае это двухмерный пример, поэтому площадь также является просто длиной). Тогда объемное удельное сопротивление образца определяется как:
Мой вопрос: как определить эффективное сопротивление, сети?
Я искал в Интернете, но все, что я могу найти, это обсуждения бесконечных сетей, токов источника и стока и т. Д. Меня не интересуют ток или напряжение.
Можно ли решить эту проблему в ее нынешнем виде?
Основная идея довольно проста. Вы устраиваете матрицу ( ), который представляет «узлы» или вершины в вашей системе. Каждый из этих узлов имеет связанное с ним скалярное «напряжение», которое может быть изменено или обновлено по мере выполнения алгоритма. Также будет два узла, напряжение которых нельзя изменить. Мы собираемся применить здесь своего рода «батарею», поэтому эти два узла представляют два конца этой батареи.
Отдельно еще две матрицы ( и ) представляет ребра в системе, горизонтальные и вертикальные. Думаю, это ваши значения сопротивления. Я не знаю, как вы собираетесь их заполнять. Но это твоя проблема. Этот метод предполагает, что вы также можете заполнить эти матрицы.
В зависимости от языка программирования, который вы используете, вы можете или не можете использовать отрицательные индексы. Не имеет значения. Нужно просто помнить, с чем вы сталкиваетесь.
Предположим, длина поделен на сечения и эта "длина" поделен на разделы. Затем вам нужно построить матрицу с вершины для скалярных значений напряжения. (или больше.) Вам также понадобятся две другие матрицы с вертикальные грани и горизонтальные ребра между этими вершинами.
Сейчас. Инициализируйте все вершины с помощью . Выберите одну из вершин слева (желательно посередине) и отметьте ее как значение, которое НЕ может быть изменено. Используйте любой метод, который вы хотите для этого. Выберите одну из вершин справа (желательно посередине) и измените ее значение на , снова принимая к сведению, что его значение НЕ может изменяться. Техника, которая работает здесь, заключается в том, чтобы просто позволить ему изменяться в обычном режиме, но затем заменять значение на каждом шаге. Но неважно, как вы этого добьетесь, лишь бы вы этого достигли.
(Есть и другие приемы из соображений эффективности. Но здесь, наверное, не стоит с ними заморачиваться.)
Теперь об алгоритме, который иногда называют шахматным или красно-черным алгоритмом. Перемещаясь по матрице напряжения узла, обработайте каждый узел, где сумма двух индексов, четно, выполняя следующее простое присваивание:
Приведенное выше уравнение представляет собой не что иное, как вычисление напряжения центрального узла, к которому подключены четыре резистора, где известны напряжения на других концах четырех резисторов. Затем из приведенного выше уравнения вычисляется напряжение центрального узла. Поскольку делитель один и тот же для каждого члена, вы можете просто вычислить сумму числителей, а затем разделить один раз на знаменатель.
Это обновит все узлы, где сумма даже. Теперь вы выполняете ту же процедуру для всех узлов, где сумма странно. Выполнив оба эти шага, вы завершили один цикл.
При необходимости сбросьте специальные два узла (для и для как обсуждалось ранее.) Или, если вы защитили эти два узла, нет необходимости их сбрасывать.
Вы готовы к следующему циклу. Выполняйте эти циклы столько раз, сколько, по вашему мнению, необходимо для стабилизации общего состояния (и оно произойдет).
Когда вы останавливаете процесс, вы можете легко определить сопротивление, выбрав либо просмотр узлов, окружающих ваш защищенный слева узел, либо просмотр узлов, окружающих ваш защищенный справа узел. (Может быть хорошей идеей сделать вашу матрицу достаточно большой [на 1 во всех направлениях], чтобы у вас фактически было четыре узла, окружающих любой вариант.) Разница в напряжениях между окружающими узлами и специальным узлом, деленная на сопротивление на краях между ними говорит вам о текущем входе/выходе вашего специального узла. Поскольку это узел «батарея», этот ток должен быть ВСЕм текущим. Так как напряжение , по определению, деление 1 на сумму этих четырех токов, которые вы найдете, дает вам общее сопротивление.
Я смотрю на какой-то код, который я написал, всего 67 строк с кучей комментариев. Так что писать НЕ сложно.
«Краткое изложение» этой идеи состоит в том, что вы применяете аккумулятор, а затем наблюдайте, как напряжение распространяется по всей системе. Как только напряжение стабилизируется (ваши критерии для этого), все, что вам нужно сделать, это посмотреть на ток, входящий или выходящий из одной или другой клеммы аккумулятора. Они оба должны быть одинаковыми текущими значениями (в некоторых числовых пределах) по очевидным причинам.
Почему вы должны разделить систему на i+j = четное и i+j = нечетное?
Предположим, вы вычисляете . Это относится к узлам, которые окружают . Это нормально. Предположим, вы затем вычисляете . Обратите внимание, что в списке параметров есть значение, которое вы только что вычислили для ? Это бы сильно "размазало" вещи. Это не звук. Вместо этого каждый цикл нечетного/четного должен «выглядеть так, как будто» он произошел в один и тот же момент. Таким образом, ваше следующее вычисление должно быть потому что ни один из входов функции не является узлами, которые были изменены на этом шаге. Затем вы поворачиваетесь и вычисляете альтернативы, избегая размытия, но теперь обновляя альтернативы. Вы действительно должны сделать это таким образом.
Кроме того, идентична ли формула как для четных, так и для нечетных шагов?
Да, это то же самое.
Можно ли все это решить за один шаг, используя какую-нибудь линейную систему Ax=b, где A — линейный оператор, а b — граничные условия? Глядя на это, кажется, что это чем-то похоже на конечно-разностные методы решения уравнений в частных производных.
Связь есть. Я думаю, что это называется «безматричной» реализацией.
Вот пример. Для моделирования в LTSpice был помещен следующий набор номиналов резисторов:
Я говорил кратко и просто. Как видите, приблизительный расчетный ток от блок питания указан как . (Фактическое значение, вычисленное Spice, было .)
Я запустил следующую программу 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
Со следующим распечатанным результатом: . Какой правильный ответ.
В приведенной выше программе показан способ установки резисторов по вертикали и горизонтали, а также матрицы напряжения, что упрощает некоторые тесты для несуществующих узлов и/или значений резисторов. Таким образом, код становится немного чище, хотя и требует большего количества элементов массива. (Я просто сделал значения дополнительных резисторов бесконечными.) Просто сравните то, как я установил массивы, с тем, как была уложена схема, и я думаю, что вы сможете точно определить все. подробности здесь.
Я также взломал резисторы и значения узлов, конечно, никоим образом не превращая это в программу общего назначения для чтения таблицы значений. Но эту общность довольно легко добавить. И этот код должен сделать все, что я написал, абсолютно недвусмысленным.
Обратите внимание, что я также только что запустил петля 1000 типов, чередуя красный и черный внутри петля. Я просто выбрал номер. Чтобы сделать эту цель более общей, вы можете предпочесть другой способ определения количества итераций, которое необходимо выполнить.
И последнее замечание. Просто чтобы доказать, что вы можете использовать ток любого узла с фиксированным напряжением для вычисления резистора, я использовал две строки, чтобы распечатать оба значения: одно вычислено из стороны и один вычисляется из сторона. В любом случае вы должны увидеть один и тот же номер.
(Хорошо. Еще одно последнее замечание. Это было бы гораздо лучше нацелено на F # или любой достойный компилятор, ориентированный на систему с массовыми параллельными вычислениями. Каждое вычисление в «красном» или «черном» может выполняться параллельно, совершенно независимо друг от друга. F# делает это тривиальным.Поэтому закодировано на F#, вы можете запустить это на всех доступных ядрах без каких-либо специальных действий.Это просто работает.Просто примечание на случай, если вы каким-то образом собираете МНОГО данных и, возможно, захотите взять все преимущества многоядерной системы.)
КОНЕЦ ПРИМЕЧАНИЕ:
Вывод довольно прост из KCL. Поместите четыре резистора в следующем порядке:
смоделируйте эту схему - схема, созданная с помощью CircuitLab
Применить KCL:
Некоторые игры с алгеброй приводят к результату, который я использовал в коде.
Вы, конечно, можете использовать подход 2D-резисторной сети для моделирования 2D-задачи, но это может стать несколько сложным при переходе к 3-м измерениям. Возможно, вы захотите рассмотреть возможность использования более традиционного (в наши дни) подхода с объемными проводниками, определенными в ваших доменах, с соответствующей проводимостью, назначенной каждому. Бесплатный программный код FEMM ( http://www.femm.info/wiki/HomePage ) очень эффективен и может использоваться для 2D, осевой симметрии и 3D. Оттуда вы можете подумать о переходе на гораздо более эффективные коды, такие как SCIrun ( https://www.sci.utah.edu/), который представляет собой академический код для задач объемного дирижера значительной сложности. Я обычно использую его для сеток из более чем миллиона тетраэдров. Несмотря на то, что он был в первую очередь разработан для биологического моделирования, он должен отлично работать для того, что вы делаете. Примеры прямых задач в инструментарии прямого/обратного решения должны помочь вам в работе. Обратные задачи также могут оказаться полезными для импедансной томографии. Обычно я использую версию 4, поскольку работа над версией 5 все еще продолжается. Программное обеспечение также имеет интерфейс к tetgen, который является отличным кодом для построения сетки.
Наконец, если вы не против потратить деньги, всегда есть COMSOL, который очень прост в использовании (и довольно дорог).
Меня не интересует ток или напряжение.
Вы заинтересованы в этом . Сопротивление — это просто отношение тока к напряжению, при условии, что у вас есть решение для тока для некоторого внешнего напряжения. И вы можете решить это, используя любой пакет SPICE напрямую.
Этот подход к определению сопротивления имеет одну оговорку: для него нужна линейная система. Все, что имеет конденсаторы, катушки индуктивности и резисторы в качестве единственных элементов, будет такой системой. В противном случае сопротивление становится функцией приложенного напряжения и, возможно, также истории цепи, и его лучше называть добавочным или дифференциальным сопротивлением.
мкейт
мкейт
придурок
Дарси
придурок
придурок
JRE
JRE
JRE
Тони Стюарт EE75
Ричард1941
Ричард1941