¿Cómo se determina la resistencia efectiva de una red finita de resistencias?

14

Descargo de responsabilidad: soy un geofísico con experiencia limitada en ingeniería eléctrica. No estoy seguro de si este problema es increíblemente fácil, increíblemente complejo o completamente absurdo.

Mi objetivo: determinar la resistividad en masa de una muestra de roca utilizando redes de resistencia.

La muestra de roca debe modelarse utilizando una red de resistencias con ciertas resistencias que tienen alta resistencia (que representa roca sólida) y otras resistencias que tienen baja resistencia (que representan vías de fluido en la roca).

Supongamos que tengo una red de resistencias en una cuadrícula uniforme como se muestra a continuación. En el ejemplo que se muestra, cada segmento de línea tiene una resistencia asociada etiquetada de 1 a 24 en una cuadrícula de 3 por 3. Se conocen las resistencias de cada segmento de línea.

La longitud total de la cuadrícula es L y el "área" es A (en este caso es un ejemplo en 2-D, por lo que el área también es solo una longitud). La resistividad aparente de la muestra viene dada por:

ρbulk=ReffAL

ingrese la descripción de la imagen aquí

Mi pregunta: ¿Cómo determino la resistencia efectiva, RefF de la red?

He buscado en línea, pero todo lo que puedo encontrar son discusiones sobre redes infinitas , corrientes de fuente y sumidero, etc. No estoy interesado en la corriente o el voltaje.

¿Se puede resolver este problema tal como está?

Darcy
fuente
2
Lo conectaría a un simulador y dejaría que el simulador lo resuelva. Puedes construir tu modelo como un circuito de especias. Luego, para encontrar resistencia, simplemente use la ley de Ohm (V = I * R). Especias le dirá la corriente para que pueda calcular R.
mkeith
1
Todo se puede automatizar potencialmente usando la línea de comando spice, pero como prueba de concepto, puede ingresar a su circuito en una especia libre como LTSpice. Aplique un voltaje y muestre la corriente. LTspice también puede mostrar funciones simples como un voltaje dividido por una corriente (resistencia).
mkeith
Darcy, hay varios enfoques. Me gustaría hacer algunas preguntas antes de ofrecer alguna idea. (1) Hay un software muy fácil que podrías escribir. ¿Estás buscando este tipo de enfoque? (2) Podría resolver esto utilizando el análisis nodal tradicional. ¿Estás buscando este tipo de enfoque? (3) Su problema se descompone en vértices y bordes . (Dado su historial geofísico, esperaría que supiera el significado de esos dos términos). ¿Cómo, a priori, calcula los valores que conectaría para los bordes?
jonk
@jonk Me interesaría principalmente la opción (1) de escribir un pequeño fragmento de código para hacer esto. Determino las resistencias de los bordes en función de la geometría de los poros a priori y la resistividad conocida de un mineral o fluido de roca.
Darcy
Darcy, también hay técnicas que se basan en redes triangulares irregulares que inmediatamente me vienen a la mente cuando escribes "vías fluidas". ¿Has leído algo sobre ese tema? No sé cuáles son tus objetivos en última instancia, pero es posible que también quieras buscarlos. Sería genial utilizarlos para gradientes que lo ayudarán a comprender dónde tenderían a concentrarse las "corrientes". Si eso es una preocupación.
jonk

Respuestas:

11

La idea básica es bastante simple. Usted organiza una matriz ( ) que representa "nodos" o vértices en su sistema. Cada uno de estos nodos tiene asociado un "voltaje" de valor escalar que puede modificarse o actualizarse a medida que avanza el algoritmo. También habrá dos nodos cuyo voltaje no se puede cambiar. Vamos a aplicar una especie de "batería" aquí, por lo que esos dos nodos representan los dos extremos de esta batería.V

Por separado, otras dos matrices ( y R hRvRh ) representan los bordes en el sistema, horizontal y vertical. Estos son sus valores de resistencia, supongo. No estoy seguro de cómo piensa completarlos. Pero ese es tu problema. Esta técnica asume que también puede completar estas matrices.

Dependiendo del lenguaje de computadora que use, es posible que pueda o no usar índices negativos. No importa Es solo una cuestión de tener en cuenta lo que enfrenta.

Supongamos que la longitud se divide en N L secciones y que la "longitud" A se divide en N A secciones. Luego, deberá construir una matriz con vértices ( N L + 1 )( N A + 1 ) para los valores de voltaje escalar. (o más grande). También necesitará esas otras dos matrices con NLnorteLUNnorteUN(norteL+1)(norteUN+1) bordes verticales y N L( N A + 1norteUN(norteL+1) bordes horizontales entre esos vértices.norteL(norteUN+1)

Ahora. Inicializa todos los vértices con . Elija uno de los vértices a la izquierda (en el medio, preferiblemente) y anótelo como un 00 0VValor V que NO está permitido cambiar nunca. Usa el método que quieras para esto. Elija uno de los vértices a la derecha (en el medio, preferiblemente) y cambie su valor a 10 0V , mientras que nuevamente toma nota de que su valor NO puede cambiar nunca. Una técnica que funciona aquí es simplemente dejar que cambie normalmente, pero luego reemplazar el valor en cada paso. Pero no importa cómo lo consigas, siempre que lo consigas.1V

(Existen otras técnicas por razones de eficiencia. Pero probablemente no valga la pena molestarse con ellas aquí).

Ahora para el algoritmo, que a veces se llama un tablero de ajedrez o algoritmo rojo-negro . Moviéndose a través de la matriz de voltaje de su nodo, procese cada nodo donde la suma de los dos índices, es par, realizando la siguiente asignación simple:yo+j

Vyo,j=Rhyo,j-1Rhyo,j(Vyo-1,jRvyo,j+Vyo+1,jRvyo-1,j)Rhyo,j-1Rhyo,j(Rvyo,j+Rvyo-1,j)+Rvyo-1,jRvyo,j(Rhyo,j+Rhyo,j-1)+Rvyo-1,jRvyo,j(Vyo,j-1Rhyo,j+Vyo,j+1Rhyo,j-1)Rhyo,j-1Rhyo,j(Rvyo,j+Rvyo-1,j)+Rvyo-1,jRvyo,j(Rhyo,j+Rhyo,j-1)

La ecuación anterior no es más que calcular el voltaje de un nodo central que tiene cuatro resistencias conectadas a él, donde se conocen los voltajes en los otros extremos de las cuatro resistencias. El voltaje del nodo central se calcula a partir de la ecuación anterior. Como el divisor es el mismo para cada término, podrías calcular la suma de los numeradores y luego dividir una vez por el denominador.

Eso actualizará todos los nodos donde la suma es par. Ahora realiza el mismo procedimiento para todos los nodos donde la suma i + j es impar. Una vez que se hayan realizado estos dos pasos, habrá completado un ciclo.yo+jyo+j

Si es necesario, restablezca los dos nodos especiales (para y para 10 0V como se discutió anteriormente.) O, si protegió esos dos nodos, no hay necesidad de restablecerlos.1V

Estás listo para el próximo ciclo. Realice estos ciclos tantas veces como considere necesario para que el estado general se estabilice (y lo hará).

Cuando detiene el proceso, puede resolver fácilmente la resistencia eligiendo mirar los nodos que rodean su nodo protegido del lado izquierdo o mirar los nodos que rodean su nodo protegido del lado derecho. (Puede ser una buena idea hacer que su matriz sea lo suficientemente grande [por 1 en todas las direcciones] para que en realidad tenga cuatro nodos que rodean cualquier opción). La diferencia de voltajes entre los nodos circundantes y el nodo especial, dividido por el La resistencia en los bordes entre ellos le indica la salida / entrada actual de su nodo especial. Como se trata de un nodo de "batería", esta corriente debe ser TODA la corriente. Como el voltaje es , por definición, dividiendo 1 por la suma de estas cuatro corrientes que encuentre le indica la resistencia total.1V

Estoy mirando un código que escribí que totaliza, con muchos comentarios, solo 67 líneas. Entonces NO es difícil de escribir.

El "breve resumen" de esta idea es que aplicas un batería y luego ver como los voltajes se extienden por todo el sistema. Una vez que los voltajes se estabilizan (su criterio para eso), todo lo que tiene que hacer es mirar la corriente que entra o sale de un terminal de batería u otro. Ambos deben tener el mismo valor actual (dentro de algunos límites numéricos) por razones obvias.1V


¿Por qué es necesario separar el sistema en i + j = par e i + j = impar?

Suponga que calcula . Esto hace referencia a los nodos que rodean V 5 , 5 . Esta bien. Suponga que luego calcula V 5 , 6 = f ( V 4 , 6 , V 6 , 6 , V 5 ,V5 5,5 5=F(V4 4,5 5,V6 6,5 5,V5 5,4 4,V5 5,6 6)V5 5,5 5 5 , 8 ) . Tenga en cuenta que en la lista de parámetros está el valor que acaba de calcular para V 5 , 5 ? Esto "mancharía" mucho las cosas. No es sonido En cambio, cada ciclo de impar / par debería "aparecer como si" ocurriera en el mismo momento. Entonces, su próximo cálculo debe ser V 5 , 7 =f ( V 4 , 7 , V 6 , 7 , V 5 , 6 , VV5 5,6 6=F(V4 4,6 6,V6 6,6 6,V5 5,5 5,V5 5,7 7)V5 5,5 5V5 5,7 7=F(V4 4,7 7,V6 6,7 7,V5 5,6 6,V5 5,8)porque ninguna de las entradas a la función son nodos que se modificaron durante este paso. Luego te balanceas y calculas las alternativas, evitando las manchas pero ahora actualizando las alternativas. Realmente tienes que hacerlo de esta manera.

Además, ¿la fórmula es idéntica para los pasos pares e impares?

Si, es lo mismo.

¿Se puede resolver todo en un solo paso utilizando algún tipo de sistema lineal Ax = b donde A es un operador lineal yb proporciona las condiciones de contorno? Mirándolo, parece algo análogo a los métodos de diferencias finitas para resolver ecuaciones diferenciales parciales.

Hay una conexión Creo que se llama una implementación 'sin matriz'.


Aquí hay un ejemplo. El siguiente conjunto de valores de resistencia se colocó en LTSpice para simulación:

ingrese la descripción de la imagen aquí

Lo mantuve breve y simple. Como puede ver, la corriente calculada aproximada del1V30,225mamá30.224552mamá

Ejecuté el siguiente programa 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Ω

El programa anterior muestra una forma de configurar las resistencias, vertical y horizontal, así como la matriz de voltaje, de modo que simplifica algunas de las pruebas para nodos y / o valores de resistencia no existentes. El código es un poco más limpio, de esta manera, aunque requiere algunos elementos de matriz más. (Simplemente he hecho que los valores de resistencia adicionales sean de valor infinito). Simplemente compare cómo configuré las matrices con la forma en que se diseñó el esquema también, y creo que podrá resolver todo exactamente detalles aquí.

También he pirateado las resistencias y los valores de los nodos, por supuesto, sin convertir esto de ninguna manera en un programa de propósito general para leer una tabla de valores. Pero esa generalidad es bastante fácil de agregar. Y este código debería hacer que todo lo que escribí sea absolutamente inequívoco.

XX bucle . Acabo de elegir un número. Para hacer este propósito más general, puede preferir una forma diferente de determinar cuántas iteraciones realizar.

0 0V1V

(Bien. Una nota final más. Estaría mucho mejor dirigida a F # o cualquier compilador decente dirigido a un sistema informático masivamente paralelo. Cada cálculo en "rojo" o "negro" se puede realizar en paralelo; completamente independiente el uno del otro. F # hace que esto sea trivial. Entonces, codificado en F #, puede ejecutar esto en todos sus núcleos disponibles sin nada especial que hacer. Simplemente funciona. Solo una nota en caso de que esté recopilando MUCHOS datos de alguna manera y quiera tomar Ventaja completa de un sistema multinúcleo.)


NOTA FINAL:

La derivación es bastante simple de KCL. Coloque cuatro resistencias en la siguiente disposición:

esquemático

simular este circuito : esquema creado con CircuitLab

Aplicar KCL:

VR1+VR2+VR3+VR4 4=V1R1+V2R2+V3R3+V4 4R4 4V=(V1R1+V2R2+V3R3+V4 4R4 4)(R1∣∣R2∣∣R3∣∣R4 4)

Algunos jugando con álgebra obtienen el resultado que utilicé en el código.

jonk
fuente
Gracias por la gran respuesta. Tengo algunas preguntas aclaratorias. 1) ¿Por qué debe separar el sistema enyo+j = par y yo+j= impar? 2) ¿Se puede resolver todo en un solo paso utilizando algún tipo de sistema lineal?UNX=si dónde UN es un operador lineal y siproporciona las condiciones de contorno? Mirándolo, parece algo análogo a los métodos de diferencias finitas para resolver ecuaciones diferenciales parciales ...
Darcy
Además, ¿la fórmula es idéntica para los pasos pares e impares?
Darcy
2
@ Darcy Escribiré un poco más para ayudar a cubrir estos problemas.
jonk
Gracias de nuevo por los detalles. Una última pregunta (y tal vez esto podría ser una pregunta completamente separada, pero la preguntaré aquí): si todas las resistencias de la red tienen la misma resistencia (digamos 1 Ohm), entonces se deduce que la resistencia efectiva también debería ser 1 ohmio? Mi intuición dice que debería, pero no estoy seguro.
Darcy
1
@Darcy Su intuición es incorrecta y el resultado de MATLAB es correcto.
jonk
1

Ciertamente, puede adoptar el enfoque de una red de resistencia 2D para modelar un problema 2D, pero eso puede ser algo complicado cuando se mueve a 3 dimensiones. Es posible que desee considerar el uso de un enfoque más tradicional (en estos días) con conductores de volumen definidos en sus dominios con una conductividad apropiada asignada a cada uno. El código gratuito de FEMM ( http://www.femm.info/wiki/HomePage ) es muy capaz y puede usarse para 2D, simetría axial y 3D. A partir de ahí, puede considerar pasar a códigos mucho más capaces como SCIrun ( https://www.sci.utah.edu/), que es un código académico para problemas de volumen de conductores de complejidad sustancial. Lo uso habitualmente para mallas de más de un millón de tetraedros. Aunque se desarrolló principalmente para el modelado biológico, debería funcionar muy bien para lo que está haciendo. Los ejemplos de problemas de avance en el kit de herramientas de avance / inverso deberían ayudarlo a continuar. También puede encontrar valiosos los problemas inversos para la tomografía de impedancia. Generalmente uso la versión 4 ya que la versión 5 todavía es un trabajo en progreso. El software también tiene una interfaz para tetgen, que es un gran código de construcción de malla.

Finalmente, si no se opone a gastar dinero, siempre hay COMSOL, que es muy fácil de usar (y bastante costoso).

wilk
fuente