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:
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:
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.