Message Boards Message Boards

Exploration of polyhedron resistor networks

GROUPS:

Dear all,

Many have perhaps done the infamous equivalent resistor of a cube question in their physics or (electrical) engineering classes. It is quite tricky as one can not reduce the resistors using the simple series-rule and parallel-rule for resistors. One has to do some more work: use symmetry or linear algebra to get to the right answer. I was actually interested in the equivalent resistor for an icosahedron:

enter image description here

Now imagine that all the edges are replaced by 1-Ohm resistors, what is the equivalent resistor of this network? The way of solving this is by using Kirchhoffs rules.

For every vertex the sum of the current must be 0 (what goes in must go out, otherwise it would accumulate at that vertex). For every edge I can relate the voltages at the ends of the edges (vertices).

V[a] - V[b] = i[a,b] r[a,b]

Since I presume all the resistors to be 1 ohm, this reduces the equation to:

V[a] - V[b] = i[a,b]

where we assume that V is in Volts and i in Amperes (i.e. both in derived SI units without prefixes). By applying a 1 volt difference between opposite ends and figure out how much current will flow we can calculate the equivalent resistance as 1/current.

I programmed this elaborate function to do all of that for me given a polyhedron:

ClearAll[EquivalentResistance,EquivalentResistanceHelper]
EquivalentResistance::invalidstartstop="Start and Stop should be distinct integers between 1 and `1` (inclusive)";
EquivalentResistance[poly_String]:=EquivalentResistance[poly,All]
EquivalentResistance[poly_String,Max]:=Block[{edges,dm,beginend},
    edges=PolyhedronData[poly,"EdgeIndices"];
    dm=DistanceMatrix[PolyhedronData[poly,"VertexCoordinates"]//N];
    beginend=FirstPosition[dm,Max[dm],{2}];
    Dataset[EquivalentResistanceHelper[poly,beginend]]
]
EquivalentResistance[poly_String,All]:=Block[{startsends},
    startsends=Subsets[Union@@PolyhedronData[poly,"EdgeIndices"],{2}];
    Dataset[Association[Thread[startsends->(EquivalentResistanceHelper[poly,#]&/@startsends)]]]
]
EquivalentResistance[poly_String,start_Integer]:=Block[{other},
    other=DeleteCases[Union@@PolyhedronData[poly,"EdgeIndices"],start];
    EquivalentResistance[poly,Thread[{start,other}]]
]
EquivalentResistance[poly_String,startsends:{{_,_}..}]:=Dataset[Association[Thread[startsends->(EquivalentResistanceHelper[poly,#]&/@startsends)]]]
EquivalentResistance[poly_String,{start_Integer,stop_Integer}]:=Dataset[EquivalentResistanceHelper[poly,{start,stop}]]
EquivalentResistanceHelper[poly_String,{start_Integer,stop_Integer}]:=Block[{resistors,edges,inout,begin,end,beginend,vertices,currentrulesin,currentrulesout,currentrules,voltrules,equations,variables,sols,totalcurrent,graphout,eqout,fullsolout,resout,i,V},
    resistors=edges=PolyhedronData[poly,"EdgeIndices"];
    If[1<=start<=Max[edges]\[And]1<=stop<=Max[edges]\[And]start=!=stop,
        {begin,end}=beginend={start,stop};
        edges=Join[edges,inout={{0,begin},{end,Max[edges]+1}}];
        {begin,end}=beginend={0,Max[edges]};
        graphout=HighlightGraph[Graph[UndirectedEdge@@@edges,VertexLabels->"Name",PlotRangePadding->Scaled[.15]],beginend~Join~(Style[#,Red]&/@(UndirectedEdge@@@resistors))];

        vertices=DeleteCases[Union@@edges,Alternatives@@beginend];
        currentrulesout=Table[Select[edges,First[#]==v&],{v,vertices}];
        currentrulesin=Table[Select[edges,Last[#]==v&],{v,vertices}];
        currentrulesin=Total/@Apply[i,currentrulesin,{2}];
        currentrulesout=Total/@Apply[i,currentrulesout,{2}];
        currentrules=Thread[currentrulesin-currentrulesout==0];

        voltrules=Join[V[#1]-V[#2]==i[#1,#2]&@@@edges[[;;-3]],V[#1]==V[#2]&@@@edges[[-2;;]],{V[begin]==1,V[end]==0}];

        equations=Join[voltrules,currentrules];
        variables=DeleteDuplicates[Cases[equations,i[_,_]|V[_],\[Infinity]]];
        sols=Sort@Solve[equations,variables][[1]];

        totalcurrent=i[0,start]/.sols;
        <|"Polyhedron"->poly,"Graph"->graphout,"Start"->start,"Stop"->stop,"Equations"->equations,"Solutions"->sols,"EquivalentResistance"->1/totalcurrent|>
    ,
        Message[EquivalentResistance::invalidstartstop,Max[edges]];
        Abort[]
    ]
]

Two-vertex specification

So how do we call this function? Well, there are several ways:

EquivalentResistance["Cube", {1, 2}]

This will give use the equivalent resistance between vertex 1 and 2 of a cube-network of resistors. It gives back a dataset:

enter image description here

Where the red-edges are 1-ohm resistors and the blue lines are our test-leads with no resistance. You can also see the equations and solutions to those equations:

enter image description here

with as many equations as solutions as it should.

Opposite ends

In addition, one can query the function like:

EquivalentResistance["Cube", Max]

which will find two 'opposite' ends of the cube, and calculate the resistance accordingly:

enter image description here

This is the classical problem many of us have solved in school (5/6 Ohm).

Multiple two-vertex specifications

One can also supply multiple pairs:

EquivalentResistance["Cube", {{1, 2}, {1, 6}, {1, 8}}]

giving a more elaborate dataset back:

enter image description here

Start vertex only

If one supplies only the starting point, it will find the resistance for all the other vertices:

EquivalentResistance["Cube", 3]

in this case it will find all the resistance with starting point 3:

enter image description here

All

Lastly one can specify All (or nothing)

EquivalentResistance["Cube", All] (* same as EquivalentResistance["Cube"] *)

to get a dataset with all possible combinations: 28 cases for a cube (8 edges: Pochhammer[7, 2]/2=28).

Solve original problem

Let's calculate the equivalent resistance for opposite points for all the platonic solids:

Dataset[Normal[EquivalentResistance[#,Max][{"Polyhedron","EquivalentResistance"}]]&/@PolyhedronData["Platonic"]]

giving:

enter image description here

Note that dataset shows numerical approximations of the actual values. The values are actually exact:

Values /@ Normal[%]

giving:

{{Cube,5/6},{Dodecahedron,7/6},{Icosahedron,1/2},{Octahedron,1/2},{Tetrahedron,1/2}}

Other examples

It also works (fast) with larger networks; say a bucky-ball shape:

EquivalentResistance["TruncatedIcosahedron", Max]

enter image description here

We can also make a table for all the non-compound polyhedrons what the equivalent resistances are:

alldata={#,EquivalentResistance[#,Max]["EquivalentResistance"]}&/@Select[Complement[PolyhedronData[],PolyhedronData["Compound"]],StringQ];
SortBy[Append[#,N[Last[#]]]&/@alldata,Last]//Grid

enter image description here

Some observations: some have an equivalent resistance smaller than 1, others bigger than 1. Somehow I would've expected that all would be smaller than 1 (there are always multiple paths to the ends). Also note that one gets very elaborate fractions for the more complex polyhedrons!

Conclusion

I hope you like this short exploration. One can easily extend this to arbitrary networks with arbitrary resistors. The methodology is the same: set up all the 'current rules', set up 'voltage rules', and some boundary conditions and solve it using Solve.

POSTED BY: Sander Huisman
Answer
8 months ago

enter image description here - Congratulations! This post is now Staff Pick! Thank you for your wonderful contributions. Please, keep them coming!

POSTED BY: Moderation Team
Answer
8 months ago

The resistances greater than one was surprising for me. What is the intuition behind that?

I was wondering about the case of general circuits (graphs instead of polyhedral) and just now noticed a bunch of sequences on OEIS regarding the number of resistances that can be had by n resistors (like in this case). They differ by what circuits they allow.

https://oeis.org/A180414 seems to allow any circuit but these others have restrictions involving bridges, no bridges, etc.. https://oeis.org/search?q=resistance&sort=&language=english&go=Search

The other thing I was wondering if there was some way of exploring the dynamics. The circuit dynamics come from variables, but maybe if the variable was the circuit diagram itself there could be some interesting dynamics. I am not certain what that means or how it could be visualized.

POSTED BY: Todd Rowland
Answer
7 months ago

You can imagine it using these two examples:

enter image description here

This would be an example of low-resistance (from bottom to top) as it can travel in many ways from top to bottom, but each path is ~2 ohm.

enter image description here

Here there are not many paths, and each path consists of many resistors, so it will be large resistance.

Hope you understand what's I'm trying to bring across...

POSTED BY: Sander Huisman
Answer
7 months ago

William Harter explored a similar concept in Representations of Multidimensional Symmetries in Networks. In this article, the author also considers inductance and capacitance. You need these other functions if you want to have interesting time-dynamic behavior. It's also nice to consider analog multipliers such as MPY634 in this circuit diagram, which I built and tested successfully 5-10 yrs ago.

POSTED BY: Brad Klee
Answer
7 months ago

Thanks Sander. I guess there are two competing things going on, adding paths to give the electrons more choices and making the paths longer for the electrons. Does anyone know how this calculation matches up with a physics-style sum of paths calculation? Is it a one-liner to count the number of paths (say without loops)?

Thanks Brad. I guess I was thinking of interesting time dynamic behavior as being something other than a linear second order ODE. Is that right?

POSTED BY: Todd Rowland
Answer
7 months ago

Hi Todd,

There's a wide variety on interest. A lot of the time I side with you. The Lorenz equations, for example, are non-linear, chaotic differential equations. Others are not so high minded, and don't care if you can produce an oscilloscope function that resembles a butterfly. A difficult life lesson for many undergrads in physics and math to have to learn. It reminds me of a joke I recently heard while studying an old 1970's exploitation movie (filmed in Germany): The girls don't find electricity and magnetism at all interesting until you've overheated something or "blown a fuse".

In real life, joule heating is quite exciting and easy for students to understand. As I'm sure you know, it's also a relevant topic considering the innards of computers and other technology. More exciting are unexpected affects of magnetic inductance. We have a demonstration for the students where an inductance coil powers a lightbulb tied to a coil of wire. As if this isn't enough magic, the students can hold onto the lightbulb circuit during the experiment. As the lightbulb lights up, the circuit also has a small amplitude, high frequency vibration due to the Lorentz force and the alternating current that powers the machine.

cheers,

Brad

POSTED BY: Brad Klee
Answer
7 months ago

Group Abstract Group Abstract