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 hR vR h ) 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( NL+ 1 ) ⋅ ( NUN+ 1 ) bordes verticales y N L ⋅ ( N A + 1norteUN⋅ ( NL+ 1 ) bordes horizontales entre esos vértices.norteL⋅ ( NUN+ 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:i + j
Vi , j= R hi , j - 1⋅ R hi , j⋅ ( Vi - 1 , j⋅ R vi , j+ Vi + 1 , j⋅ R vi - 1 , j)R hi , j - 1⋅ R hi , j⋅ ( R vi , j+ R vi -1 , j) + R vyo- 1 , j⋅R vyo, j( R hi , j+ R hi ,j - 1)+R vi -1 , j⋅R vyo, j⋅( Vi ,j - 1⋅R hyo, j+Vi , j + 1⋅R hi ,j - 1)Rhi , j- 1⋅R hyo, j⋅ ( R vyo, j+R vi - 1, j) +R vi - 1, j⋅R vyo, j( R hyo, j+ R hi , 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.i + ji + 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= f( V4 , 5, V6 , 5, V5 , 4, V5 , 6)V5 , 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 , 6= f( V4 , 6, V6 , 6, V5 , 5, V5 , 7)V5 , 5V5 , 7= f( V4 , 7, V6 , 7, V5 , 6, V5 , 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:
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:
simular este circuito : esquema creado con CircuitLab
Aplicar KCL:
VR1+ VR2+ VR3+ VR4 4V= V1R1+ V2R2+ V3R3+ V4 4R4 4∴= ( V1R1+ V2R2+ V3R3+ V4 4R4 4) ( R1∣ ∣ R2∣ ∣ R3∣ ∣ R4 4)
Algunos jugando con álgebra obtienen el resultado que utilicé en el código.