Wie bestimmen Sie den effektiven Widerstand eines endlichen Widerstandsgitters?

13

Haftungsausschluss: Ich bin ein Geophysiker mit begrenztem elektrotechnischem Hintergrund. Ich bin nicht sicher, ob dieses Problem unglaublich einfach, unglaublich komplex oder völlig unsinnig ist.

Mein Ziel: Bestimmen Sie den spezifischen Volumenwiderstand einer Gesteinsprobe mithilfe von Widerstandsnetzwerken.

Die Gesteinsprobe soll mit einem Widerstandsnetzwerk modelliert werden, bei dem bestimmte Widerstände einen hohen Widerstandswert (der für festes Gestein steht) und andere Widerstände einen niedrigen Widerstandswert (der für Flüssigkeitswege im Gestein steht) aufweisen.

Angenommen, ich habe ein Netzwerk von Widerständen in einem einheitlichen Raster, wie unten gezeigt. In dem gezeigten Beispiel ist jedem Leitungssegment ein Widerstand zugeordnet, der mit 1 bis 24 in einem 3 × 3-Gitter bezeichnet ist. Die Widerstände jedes Leitungssegments sind bekannt.

Die Gesamtlänge des Rasters ist L und die "Fläche" ist A (in diesem Fall ist es ein 2D-Beispiel, die Fläche ist also auch nur eine Länge). Der spezifische Volumenwiderstand der Probe ist dann gegeben durch:

ρbulk=ReffAL

Bildbeschreibung hier eingeben

Meine Frage: Wie bestimme ich den effektiven Widerstand, Reff des Netzwerks?

Ich habe online gesucht, aber alles, was ich finden kann, sind Diskussionen über unendliche Netzwerke, Quellen- und Senkenströme usw. Ich interessiere mich nicht für den Strom oder die Spannung.

Kann dieses Problem in der jetzigen Form gelöst werden?

Darcy
quelle
2
Ich würde es in einen Simulator einstecken und den Simulator es lösen lassen. Sie können Ihr Modell als Gewürzkreis konstruieren. Um dann Widerstand zu finden, verwenden Sie einfach das Ohmsche Gesetz (V = I * R). Spice
teilt
1
Das Ganze kann möglicherweise mit Kommandozeilen-Spice automatisiert werden, aber zur Überprüfung des Konzepts können Sie Ihre Schaltung in einem kostenlosen Spice wie LTSpice eingeben. Legen Sie eine Spannung an und zeigen Sie den Strom an. LTspice kann auch einfache Funktionen anzeigen, z. B. eine Spannung geteilt durch einen Strom (Widerstand).
mkeith
Darcy, es gibt eine Reihe von Ansätzen. Ich möchte ein paar Fragen stellen, bevor ich irgendwelche Gedanken vorbringe. (1) Es gibt eine sehr einfache Software, die Sie schreiben können. Suchen Sie einen solchen Ansatz? (2) Sie können dies mithilfe der herkömmlichen Knotenanalyse lösen. Suchen Sie einen solchen Ansatz? (3) Ihr Problem gliedert sich in Eckpunkte und Kanten . (Angesichts Ihres geophysikalischen Hintergrunds würde ich davon ausgehen, dass Sie die Bedeutung dieser beiden Begriffe kennen.) Wie können Sie a priori die Werte ermitteln, die Sie für die Kanten eingeben würden?
jonk
@jonk Mich würde in erster Linie die Option (1) interessieren, selbst einen kurzen Code zu schreiben, um dies zu tun. Die Kantenwiderstände ermittle ich anhand einer Priori-Poren-Geometrie und eines bekannten spezifischen Widerstands eines Gesteinsminerals oder einer Flüssigkeit.
Darcy
Darcy, es gibt auch Techniken, die aus triangulierten unregelmäßigen Netzwerken schöpfen, die mir sofort in den Sinn kommen, wenn Sie "flüssige Pfade" schreiben. Hast du etwas zu diesem Thema gelesen? Ich weiß nicht, was Ihre Ziele letztendlich sind, aber vielleicht möchten Sie diese auch nachschlagen. Diese eignen sich hervorragend für Farbverläufe, um zu verstehen, wo sich "Ströme" tendenziell konzentrieren. Wenn das ein Anliegen ist.
Donnerstag,

Antworten:

11

Die Grundidee ist ziemlich einfach. Sie ordnen eine Matrix ( ) an, die "Knoten" oder Scheitelpunkte in Ihrem System darstellt. Jedem dieser Knoten ist eine skalarwertige "Spannung" zugeordnet, die im Verlauf des Algorithmus geändert oder aktualisiert werden kann. Es wird auch zwei Knoten geben, deren Spannung nicht geändert werden kann. Wir werden hier eine Art "Batterie" anwenden, so dass diese beiden Knoten die beiden Enden dieser Batterie darstellen.V

Getrennt davon repräsentieren zwei weitere Matrizen ( und R h ) die Kanten im System, horizontal und vertikal. Das sind Ihre Widerstandswerte, denke ich. Ich bin mir nicht sicher, wie Sie diese ausfüllen wollen. Aber das ist dein Problem. Diese Technik setzt voraus, dass Sie auch diese Matrizen füllen können.RvRh

Abhängig von der verwendeten Computersprache können Sie möglicherweise negative Indizes verwenden oder nicht. Spielt keine rolle Es ist nur eine Frage der Überlegung, womit Sie konfrontiert sind.

Nehmen wir an, die Länge ist in N L Abschnitte unterteilt, und die "Länge" A ist in N A Abschnitte unterteilt. Dann müssen Sie eine Matrix mit ( N L + 1 )(LNLANA Eckpunkten für die skalaren Spannungswerte. (oder größer)Sie werden auch die anderen zwei Matrizen mit benötigen N A ( N L + 1 ) senkrechte Kanten und N L ( N A + 1(NL+1)(NA+1)NA(NL+1) horizontale Kanten zwischen diesen Eckpunkten.NL(NA+1)

Jetzt. Initialisieren Sie alle Scheitelpunkte mit . Wählen Sie einen der Eckpunkte links (vorzugsweise in der Mitte) und notieren Sie ihn als 00V Wert, der sich NICHT ändern darf. Wenden Sie hierfür die von Ihnen gewünschte Methode an. Wählen Sie einen der Scheitelpunkte rechts (vorzugsweise in der Mitte) und ändern Sie den Wert in 10V , wobei erneut zu beachten ist, dass sich sein Wert niemals ändern darf. Eine Technik, die hier funktioniert, besteht darin, sie einfach normal ändern zu lassen und dann den Wert bei jedem Schritt zu ersetzen. Aber es spielt keine Rolle, wie Sie dies erreichen, solange Sie es erreichen.1V

(Aus Effizienzgründen gibt es andere Techniken. Aber es lohnt sich wahrscheinlich nicht, sich hier mit ihnen zu beschäftigen.)

Nun zum Algorithmus, der manchmal als Schachbrett- oder Rot-Schwarz- Algorithmus bezeichnet wird. Verarbeiten Sie in Ihrer Knotenspannungsmatrix jeden Knoten, bei dem die Summe der beiden Indizes ist, und führen Sie die folgende einfache Zuordnung durch:i+j

Vi,j=Rhi,j1Rhi,j(Vi1,jRvi,j+Vi+1,jRvi1,j)Rhi,j1Rhi,j(Rvi,j+Rvi1,j)+Rvi1,jRvi,j(Rhi,j+Rhi,j1)+Rvi1,jRvi,j(Vi,j1Rhi,j+Vi,j+1Rhi,j1)Rhi,j1Rhi,j(Rvi,j+Rvi1,j)+Rvi1,jRvi,j(Rhi,j+Rhi,j1)

Die obige Gleichung ist nichts weiter als die Berechnung der Spannung eines zentralen Knotens mit vier daran angeschlossenen Widerständen, wobei die Spannungen an den anderen Enden der vier Widerstände bekannt sind. Die zentrale Knotenspannung wird dann aus der obigen Gleichung berechnet. Da der Divisor für jeden Term derselbe ist, können Sie einfach die Summe der Zähler berechnen und dann einmal durch den Nenner dividieren.

i+ji+j

0V1V

Sie sind bereit für den nächsten Zyklus. Führen Sie diese Zyklen so oft durch, wie Sie es für notwendig halten, damit sich der Gesamtzustand beruhigt (und das wird auch so sein).

1V

Ich starre auf einen Code, den ich geschrieben habe, mit vielen Kommentaren und nur 67 Zeilen. Es ist also NICHT schwer zu schreiben.

Die "kurze Zusammenfassung" dieser Idee ist, dass Sie eine anwenden1V


Warum müssen Sie das System in i + j = gerade und i + j = ungerade unterteilen?

V5,5=f(V4,5,V6,5,V5,4,V5,6)V5,5V5,6=f(V4,6,V6,6,V5,5,V5,7). Note that in the list of parameters is the value you just computed for V5,5? This would "smudge" things a lot. It's not sound. Instead, each cycle of odd/even should "appear as if" it occurred at the same moment. So your next computation should be V5,7=f(V4,7,V6,7,V5,6,V5,8) because none of the inputs to the function are nodes that were changed during this step. Then you swing around and compute the alternates, avoiding the smudging but now updating the alternates. You really do have to do it this way.

Also, is the formula identical for both even and odd steps through?

Yes, it's the same.

Can it all be solved in one step using some sort of linear system Ax=b where A is a linear operator and b provides the boundary conditions? Looking at it, it seems somewhat analogous to finite difference methods for solving partial differential equations..

There is a connection. I think it's called a 'matrix-free' implementation.


Here's an example. The following set of resistor values were placed into LTSpice for simulation:

enter image description here

I kept it short and simple. As you can see, the approximate computed current from the 1V power supply is given as 30.225mA. (The actual value computed by Spice was 30.224552mA.)

I ran the following VB.NET program:

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

With the following result printed out: R=33.0856844038614Ω. Which is the correct answer.

The above program shows a way of setting up the resistors, vertical and horizontal, as well as the voltage matrix, so that it simplifies some of the tests for non-existent nodes and/or resistor values. The code is a little cleaner, this way, though it does require some more array elements. (I've simply made the extra resistor values infinite in value.) Just compare how I've set up the arrays with the way the schematic was laid out, as well, and I think you will be able to work out all the exact details here.

I've also hacked in the resistors and node values, of course, without making this in any way a general purpose program for reading up a table of values. But that generality is pretty easy to add. And this code should make everything I wrote absolutely unambiguous.

Note that I also just ran the x loop 1000 types, alternating red and black within the x loop. I just picked a number. To make this more general purpose, you may prefer a different way of determining how many iterations to perform.

And a final note. Just to prove that you can use either fixed voltage node's current to compute the resistor, I've used two lines in order to print out both values: one computed from the 0V side and one computed from the 1V side. Either way, you should see the same number.

(Okay. One more final note. This would be much better targeted at F# or any decent compiler targeting a massively parallel computing system. Each calculation in either "red" or "black" can be performed in parallel; completely independently of each other. F# makes this trivial. So coded in F#, you could run this on all of your available cores without anything special to do. It just works. Just a note in case you are collecting a LOT of data in some fashion and might want to take full advantage of a multi-core system.)


END NOTE:

The derivation is pretty simple from KCL. Place four resistors into the following arrangement:

schematic

simulate this circuit – Schematic created using CircuitLab

Apply KCL:

VR1+VR2+VR3+VR4=V1R1+V2R2+V3R3+V4R4V=(V1R1+V2R2+V3R3+V4R4)(R1∣∣R2∣∣R3∣∣R4)

Some playing around with algebra gets the result I used in the code.

jonk
quelle
Thanks for the great answer. I have a few clarifying questions. 1) Why is it that you must separate the system into i+j = even and i+j = odd? 2) Can it all be solved in one step using some sort of linear system Ax=b where A is a linear operator and b provides the boundary conditions? Looking at it, it seems somewhat analogous to finite difference methods for solving partial differential equations...
Darcy
Also, is the formula identical for both even and odd steps through?
Darcy
2
@Darcy I'll write a little more to help cover these issues.
jonk
Thanks again for the details. One final question (and maybe this could go as an entirely separate question but I will ask it here): if all the resistors in the network have the same resistance (say 1 Ohm), then does it follow that the effective resistance should also be 1 Ohm? My intuition says that it should, but I am not sure.
Darcy
1
@Darcy Your intuition is wrong and the MATLAB result is correct.
jonk
1

You can certainly take the approach of a 2D resistor network to model a 2D problem but that can get somewhat tricky when moving to 3 dimensions. You might want to consider using a more traditional (these days) approach with volume conductors defined in your domains with an appropriate conductivity assigned to each. The FEMM freeware code (http://www.femm.info/wiki/HomePage) is very capable and can be used for 2D, axial symmetry and 3D. From there you can consider moving to much more capable codes like SCIrun (https://www.sci.utah.edu/) which is an academic code for volume conductor problems of substantial complexity. I use it routinely for meshes of more than a million tetrahedrons. Even though it was primarily developed for biological modeling it should work great for what you are doing. The examples of forward problems in the forward/inverse toolkit should get you going. You might find the inverse problems valuable for impedance tomography, too. I generally use version 4 since version 5 is still a work in progress. The software also has an interface to tetgen which is a great mesh building code.

Finally, if you are not opposed to spending money there is always COMSOL, which is very easy to use (and quite expensive).

wilk
quelle