16 votos

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

Descargo de responsabilidad: yo soy un geofísico con limitado de ingeniería eléctrica de fondo. No estoy seguro de si este problema es muy fácil, increíblemente compleja, o completamente absurdo.

Mi objetivo: Determinar el grueso de la resistividad de una muestra de roca utilizando redes de resistencias.

La muestra de roca es ser modelado utilizando una red de resistores con ciertas resistencias que tienen alta resistencia(en representación de la roca sólida) y otras resistencias de tener una baja resistencia (que representan el líquido de las vías en la roca).

Supongamos que tengo una red de resistores en una cuadrícula uniforme como se muestra a continuación. En el ejemplo que se muestra, cada segmento de línea que tiene asociada una resistencia etiquetados del 1 al 24 en una de 3-por-3 de la cuadrícula. Las resistencias de cada segmento de línea son conocidos.

La longitud total de la red es \$L\$ y el "área" es \$A\$ (en este caso se trata de una 2-D ejemplo, de manera que el área es también una de longitud). La mayor parte de la resistividad de la muestra está dado por:

$$\rho_{bulk} = \frac{R_{eff}A}{L}$$

enter image description here

Mi pregunta: ¿Cómo puedo determinar la resistencia efectiva, \$R_{eff}\$ de la red?

He mirado por internet pero todo lo que puedo encontrar son las discusiones acerca de la infinita redes, fuente y sumidero corrientes etc. No, no estoy interesado en la corriente o voltaje.

Puede que este problema sea resuelto, tal y como está?

13voto

AitorTheRed Puntos 241

La idea básica es bastante simple. Usted dispone de una matriz de (\$V\$) que representa a los "nodos" o vértices en el sistema. Cada uno de estos nodos tiene un escalar con valores de "tensión" asociado que puede ser cambiado o actualizado, ya que el algoritmo procede. También habrá dos nodos cuyo voltaje no puede ser cambiado. Vamos a aplicar una "batería" de este tipo aquí, así que los dos nodos representan los dos extremos de esta batería.

Por otra parte, otro de dos matrices ( \ $Rv\$ \ $Rh\$ ) representa los bordes en el sistema, horizontal y vertical. Estos son sus valores de resistencia, supongo. No estoy seguro de cómo va en el llenado de estos. Pero ese es su problema. Esta técnica asume que son capaces de llenar estas matrices, así.

Dependiendo del lenguaje de computadora que usted utiliza, usted puede o no puede ser capaz de utilizar índices negativos. No importa. Es sólo una cuestión de mantener en mente lo que tienen que hacer frente.

Supongamos que la longitud \$L\$ se divide en \$N_L\$ secciones y que "longitud" \$A\$ se divide en \$N_A\$ secciones. Entonces usted tendrá que construir una matriz con \$\left(N_L+1\right)\cdot\left(N_A+1\right)\$ vértices para el escalar valores de tensión. (o más grande.) Usted también necesitará los otros dos matrices con \$N_A\cdot\left(N_L+1\right)\$ bordes verticales y \$N_L\cdot\left(N_A+1\right)\$ bordes horizontales entre los vértices.

Ahora. Inicializar todos los vértices con \$0\:\textrm{V}\$. Elija uno de los vértices de la izquierda (en el medio, de preferencia) y nota como un \$0\:\textrm{V}\$ valor que NO se puede cambiar nunca. Use el método que desee para esta. Elija uno de los vértices de la derecha (en el medio, de preferencia) y cambiar su valor a \$1\:\textrm{V}\$, mientras que de nuevo teniendo en cuenta que su valor NO está autorizado a cambiar nunca. Una técnica que funciona aquí es simplemente vamos a cambiar con normalidad, pero, a continuación, reemplace el valor de cada paso. Pero no importa cómo lograr esto, así que mucho tiempo lograrlo.

(Hay otras técnicas por razones de eficiencia. Pero probablemente no vale la pena molestarse con ellos aquí).

Ahora para el algoritmo, que a veces se llama un tablero de ajedrez o rojo-negro algoritmo. Moviéndose a través de su nodo de tensión de la matriz, el proceso de cada nodo, donde la suma de los dos índices, \$i+j\$ es incluso, realizar la siguiente asignación:

$$\begin{align*} V_{i,j}&=\frac{Rh_{i,j-1}\cdot Rh_{i,j}\cdot\left(V_{i-1,j}\cdot Rv_{i,j}+V_{i+1,j}\cdot Rv_{i-1,j}\right)}{Rh_{i,j-1}\cdot Rh_{i,j}\cdot \left(Rv_{i,j}+Rv_{i-1,j}\right)+Rv_{i-1,j}\cdot Rv_{i,j}\left(Rh_{i,j}+Rh_{i,j-1}\right)}\\\\ &+\frac{Rv_{i-1,j}\cdot Rv_{i,j}\cdot \left(V_{i,j-1}\cdot Rh_{i,j}+V_{i,j+1}\cdot Rh_{i,j-1}\right)}{Rh_{i,j-1}\cdot Rh_{i,j}\cdot \left(Rv_{i,j}+Rv_{i-1,j}\right)+Rv_{i-1,j}\cdot Rv_{i,j}\left(Rh_{i,j}+Rh_{i,j-1}\right)} \end{align*}$$

The above equation is nothing more than computing the voltage of a central node having four resistors connecting to it, where the voltages at the other ends of the four resistors are known. The central node voltage is then computed from the above equation. Since the divisor is the same for each term, you could just compute the sum of the numerators and then divide once by the denominator.

That will update all the nodes where the sum \$i+j\$ is even. Now you perform the same procedure to all of the nodes where the sum \$i+j\$ is odd. Once both these steps has been performed, you have completed one cycle.

If necessary, reset the special two nodes (for \$0\:\textrm{V}\$ and for \$1\:\textrm{V}\$ as earlier discussed.) Or, if you protected those two nodes, there's no need to reset them.

You are ready for the next cycle. Perform these cycles as many times as you feel is necessary for the overall state to settle down (and it will.)

When you stop the process, you can easily work out the resistance by either choosing to look at the nodes surrounding your left-side protected node or else look at the nodes surrounding your right-side protected node. (It may be a good idea to make your matrix just enough larger [by 1 in all directions] so that you will actually have four nodes surrounding either choice.) The difference in voltages between the surrounding nodes and the special node, divided by the resistance in the edges between them tells you the current leaving/entering your special node. Since this is a "battery" node, this current must be ALL of the current. Since the voltage is \$1\:\textrm{V}\$, by definition, dividing 1 by the sum of these four currents you find tells you the total resistance.

I'm staring at some code I wrote that totals, with lots of comments, just 67 lines. So it's NOT hard to write.

The "short summary" of this idea is that you apply a \$1\:\textrm{V}\$ de la batería y, a continuación, ver como los voltajes de extenderse por todo el sistema. Una vez que la tensión se estabilice (a tu criterio para que), todo lo que tienes que hacer es mirar en la corriente de entrada en, o fuera de, una terminal de la batería o el otro. Ambos deben ser del mismo valor actual (dentro de unos límites numéricos) por razones obvias.


¿Por qué es que usted debe separar el sistema en i+j = y i+j = impar?

Supongamos que calcular \$V_{5,5}=f\left(V_{4,5},V_{6,5},V_{5,4},V_{5,6}\right)\$. Esto hace referencia a los nodos que rodean \$V_{5,5}\$. Que está bien. Supongamos que el próximo calcular \$V_{5,6}=f\left(V_{4,6},V_{6,6},V_{5,5},V_{5,7}\right)\$. Tenga en cuenta que en la lista de parámetros es el valor calculado para \$V_{5,5}\$? Esta sería la "mancha" mucho las cosas. No es el sonido. En su lugar, cada ciclo de par/impar debe "aparecer como si" se produjo en el mismo momento. Así que el siguiente cálculo debe ser \$V_{5,7}=f\left(V_{4,7},V_{6,7},V_{5,6},V_{5,8}\right)\$ debido a que ninguna de las entradas a la función de los nodos que se han cambiado durante este paso. Entonces usted hace pivotar alrededor de la informática y de los suplentes, evitando las manchas pero ahora la actualización de los suplentes. Usted realmente no tiene que hacerlo de esta manera.

También, es la fórmula idéntica para ambos pares e impares pasos a través de?

Sí, es el mismo.

Puede que todo se resuelve en un solo paso utilizando algún tipo de sistema lineal Ax=b donde a es un operador lineal y b proporciona las condiciones de frontera? Mira, parece algo análogo a diferencia finita los métodos para resolver ecuaciones diferenciales parciales..

Hay una conexión. Creo que se llama una "matriz" libre de la aplicación.


He aquí un ejemplo. El siguiente conjunto de valores de resistencia fueron colocados en LTSpice para la simulación:

enter image description here

Seguí a corto y simple. Como se puede ver, la aproximada calculada actual de la \$1\:\textrm{V}\$ alimentación es dado como \$30.225\:\textrm{mA}\$. (El valor real calculado por Spice fue \$30.224552\:\textrm{mA}\$.)

Me encontré con el siguiente VB.NET programa:

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

Con el siguiente resultado impreso: \$R = 33.0856844038614\:\Omega\$. Cual es la respuesta correcta.

El programa anterior muestra una forma de configuración de las resistencias, vertical y horizontal, así como el voltaje de la matriz, por lo que se simplifica algunas de las pruebas para inexistente nodos y/o valores de la resistencia. El código es un poco más limpio, de esta manera, aunque requiere un poco de más elementos de la matriz. (Sencillamente, he hecho el extra valores de la resistencia infinita en valor.) Basta con comparar cómo he configurado las matrices con la forma en que el esquema fue presentado, así, y creo que va a ser capaz de trabajar todos los detalles aquí.

También he hackeado en las resistencias y los valores de nodo, por supuesto, sin hacer esto en cualquier forma a un propósito general del programa para la lectura de una tabla de valores. Pero la generalidad es bastante fácil añadir. Y este código debe hacer todo lo que escribí absolutamente inequívoca.

Tenga en cuenta que yo también corrí el \$x\$ bucle de 1000 tipos, alternando rojo y negro dentro de la \$x\$ bucle. Me acaba de recoger un número. Para hacer esto más de propósito general, usted puede preferir una forma diferente de determinar el número de iteraciones a realizar.

Y una nota final. Sólo para demostrar que se puede usar tanto fijo de voltaje del nodo actual para el cálculo de la resistencia, he utilizado dos líneas con el fin de imprimir dos valores: uno de los contados a partir de la \$0\:\textrm{V}\$ lado y uno contados a partir de la \$1\:\textrm{V}\$ lado. De cualquier manera, usted debe ver el mismo número.

(Bueno. Una última nota. Esto sería mucho mejor dirigido a F# o de cualquier decente compilador de la orientación de un masivamente paralelo de un sistema de computación. Cada cálculo en el "rojo" o "negro" se pueden realizar en paralelo; de forma totalmente independiente el uno del otro. F# hace que este trivial. De manera codificada en F#, puede ejecutar esto en todos los núcleos disponibles sin nada especial que hacer. Simplemente funciona. Sólo una nota en caso de que usted es la recopilación de una gran cantidad de datos en alguna forma, y puede ser que desee tomar ventaja completa de un sistema multi-núcleo.)


NOTA FINAL:

La derivación es bastante simple de KCL. Lugar de cuatro transistores en el siguiente arreglo:

schematic

simular este circuito – Esquema creado mediante CircuitLab

Aplicar KCL:

$$\begin{align*} \frac{V}{R_1}+\frac{V}{R_2}+\frac{V}{R_3}+\frac{V}{R_4} &= \frac{V_1}{R_1}+\frac{V_2}{R_2}+\frac{V_3}{R_3}+\frac{V_4}{R_4}\\\\ &\therefore\\\\ V &=\left(\frac{V_1}{R_1}+\frac{V_2}{R_2}+\frac{V_3}{R_3}+\frac{V_4}{R_4}\right)\bigg(R_1 \mid\mid R_2 \mid\mid R_3 \mid\mid R_4\bigg) \end{align*}$$

Un poco jugando con el álgebra obtiene el resultado que se usan en el código.

1voto

wilk Puntos 31

Usted sin duda puede tomar el enfoque de un 2D de la red de resistores para un modelo 2D problema, pero que puede ser un poco complicado cuando se mueve a 3 dimensiones. Usted puede ser que desee considerar el uso más tradicional (en estos días) enfoque con el volumen de los conductores se define en sus dominios, con una adecuada conductividad asignado a cada uno. La FEMM freeware de código (http://www.femm.info/wiki/HomePage) es muy capaz y puede ser utilizado para 2D, simetría axial y 3D. Desde allí se puede considerar mudarse a mucho más capaz códigos como SCIrun (https://www.sci.utah.edu/), que es un académico código para el volumen de conductor de problemas de considerable complejidad. Yo lo uso habitualmente para las mallas de más de un millón de tetraedros. Aunque fue desarrollado principalmente para modelos biológicos se debe trabajar mucho para lo que usted está haciendo. Los ejemplos de los problemas hacia adelante en el avance/inversa toolkit debe ponerse en marcha. Usted puede encontrar la inversa de los problemas valiosa para la tomografía de impedancia, demasiado. Yo generalmente uso la versión 4 desde la versión 5 es todavía un trabajo en progreso. El software también cuenta con una interfaz para tetgen que es una gran malla de código de construcción.

Por último, si usted no se opone a que el gasto de dinero siempre hay COMSOL, que es muy fácil de usar (y bastante caro).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X