from __future__ import division
from numpy import zeros, linalg
#from pylab import nbytes
#import numpy
l = 3 # needs to be odd
V = zeros((l,l,l,l,l,l)) #voltage coeff at each point w.r.t ground
R = 1 #resistance
A = zeros((l,l,l)) #Solutions to the voltage equation i.e. a_ijk V^i = A_jk
def FillMatrix(i,j,k): #Kirkoff's Current Law
if i != 0 and i != l-1:
if j != 0 and j != l-1:
if k!= 0 and k!= l-1:
V[i,j,k,i+1,j,k] = 1
V[i,j,k,i,j+1,k] = 1
V[i,j,k,i,j,k+1] = 1
V[i,j,k,i-1,j,k] = 1
V[i,j,k,i,j-1,k] = 1
V[i,j,k,i,j,k-1] = 1
V[i,j,k,i,j,k] = -6
A[i,j,k]=0
if k == 0:
V[i,j,k,i+1,j,k] = 1
V[i,j,k,i,j+1,k] = 1
V[i,j,k,i,j,k+1] = 1
V[i,j,k,i-1,j,k] = 1
V[i,j,k,i,j-1,k] = 1
#V(i,j,k,i,j,k-1) = -1
V[i,j,k,i,j,k] = -5
A[i,j,k]=0
if k == l-1:
V[i,j,k,i+1,j,k] = 1
V[i,j,k,i,j+1,k] = 1
#V(i,j,k,i,j,k+1) = 1
V[i,j,k,i-1,j,k] = 1
V[i,j,k,i,j-1,k] = 1
V[i,j,k,i,j,k-1] = 1
V[i,j,k,i,j,k] = -5
A[i,j,k]=0
if j == 0 :
if k != 0 and k != l-1:
V[i,j,k,i+1,j,k] = 1
V[i,j,k,i,j+1,k] = 1
V[i,j,k,i,j,k+1] = 1
V[i,j,k,i-1,j,k] = 1
#V(i,j,k,i,j-1,k) = -1
V[i,j,k,i,j,k-1] = 1
V[i,j,k,i,j,k] = -5
A[i,j,k]=0
if k == 0:
V[i,j,k,i+1,j,k] = 1
V[i,j,k,i,j+1,k] = 1
V[i,j,k,i,j,k+1] = 1
V[i,j,k,i-1,j,k] = 1
# V(i,j,k,i,j-1,k) = -1
# V(i,j,k,i,j,k-1) = -1
V[i,j,k,i,j,k] = -4
A[i,j,k]=0
if k ==l-1:
V[i,j,k,i+1,j,k] = 1
V[i,j,k,i,j+1,k] = 1
#V(i,j,k,i,j,k+1) = 1
V[i,j,k,i-1,j,k] = 1
#V(i,j,k,i,j-1,k) = -1
V[i,j,k,i,j,k-1] = 1
V[i,j,k,i,j,k] = -4
A[i,j,k]=0
if j == l-1:
if k != 0 and k != l-1:
V[i,j,k,i+1,j,k] = 1
#V(i,j,k,i,j+1,k) = 1
V[i,j,k,i,j,k+1] = 1
V[i,j,k,i-1,j,k] = 1
V[i,j,k,i,j-1,k] = 1
V[i,j,k,i,j,k-1] = 1
V[i,j,k,i,j,k] = -5
A[i,j,k]=0
if k == 0:
V[i,j,k,i+1,j,k] = 1
#V(i,j,k,i,j+1,k) = 1
V[i,j,k,i,j,k+1] = 1
V[i,j,k,i-1,j,k] = 1
V[i,j,k,i,j-1,k] = 1
# V(i,j,k,i,j,k-1) = -1
V[i,j,k,i,j,k] = -4
A[i,j,k]=0
if k ==l-1:
V[i,j,k,i+1,j,k] = 1
#V(i,j,k,i,j+1,k) = 1
#V(i,j,k,i,j,k+1) = 1
V[i,j,k,i-1,j,k] = 1
V[i,j,k,i,j-1,k] = 1
V[i,j,k,i,j,k-1] = 1
V[i,j,k,i,j,k] = -4
A[i,j,k]=0
if i == 0:
if j != 0 and j != l-1:
if k != 0 and k!= l-1:
V[i,j,k,i+1,j,k] = 1
V[i,j,k,i,j+1,k] = 1
V[i,j,k,i,j,k+1] = 1
#V(i,j,k,i-1,j,k) = -1
V[i,j,k,i,j-1,k] = 1
V[i,j,k,i,j,k-1] = 1
V[i,j,k,i,j,k] = -5
A[i,j,k]=0
if k == 0:
V[i,j,k,i+1,j,k] = 1
V[i,j,k,i,j+1,k] = 1
V[i,j,k,i,j,k+1] = 1
#V(i,j,k,i-1,j,k) = -1
V[i,j,k,i,j-1,k] = 1
#V(i,j,k,i,j,k-1) = -1
V[i,j,k,i,j,k] = -4
A[i,j,k]=0
if k == l-1:
V[i,j,k,i+1,j,k] = 1
V[i,j,k,i,j+1,k] = 1
#V(i,j,k,i,j,k+1) = 1
#V(i,j,k,i-1,j,k) = -1
V[i,j,k,i,j-1,k] = 1
V[i,j,k,i,j,k-1] = 1
V[i,j,k,i,j,k] = -4
A[i,j,k]=0
if j == 0 :
if k != 0 and k != l-1:
V[i,j,k,i+1,j,k] = 1
V[i,j,k,i,j+1,k] = 1
V[i,j,k,i,j,k+1] = 1
#V(i,j,k,i-1,j,k) = -1
#V(i,j,k,i,j-1,k) = -1
V[i,j,k,i,j,k-1] = 1
V[i,j,k,i,j,k] = -4
A[i,j,k]=0
if k == 0:
V[i,j,k,i+1,j,k] = 1
V[i,j,k,i,j+1,k] = 1
V[i,j,k,i,j,k+1] = 1
#V(i,j,k,i-1,j,k) = -1
#V(i,j,k,i,j-1,k) = -1
#V(i,j,k,i,j,k-1) = -1
V[i,j,k,i,j,k] = -3
A[i,j,k]=0
if k == l-1:
V[i,j,k,i+1,j,k] = 1
V[i,j,k,i,j+1,k] = 1
#V(i,j,k,i,j,k+1) = 1
#V(i,j,k,i-1,j,k) = -1
#V(i,j,k,i,j-1,k) = -1
V[i,j,k,i,j,k-1] = 1
V[i,j,k,i,j,k] = -3
A[i,j,k]=0
if j == l-1:
if k != 0 and k != l-1:
V[i,j,k,i+1,j,k] = 1
#V(i,j,k,i,j+1,k) = 1
V[i,j,k,i,j,k+1] = 1
#V(i,j,k,i-1,j,k) = -1
V[i,j,k,i,j-1,k] = 1
V[i,j,k,i,j,k-1] = 1
V[i,j,k,i,j,k] = -4
A[i,j,k]=0
if k == 0:
V[i,j,k,i+1,j,k] = 1
#V(i,j,k,i,j+1,k) = 1
V[i,j,k,i,j,k+1] = 1
#V(i,j,k,i-1,j,k) = -1
V[i,j,k,i,j-1,k] = 1
# V(i,j,k,i,j,k-1) = -1
V[i,j,k,i,j,k] = -3
A[i,j,k]=0
if k == l-1:
V[i,j,k,i+1,j,k] = 1
#V(i,j,k,i,j+1,k) = 1
#V(i,j,k,i,j,k+1) = 1
#V(i,j,k,i-1,j,k) = -1
V[i,j,k,i,j-1,k] = 1
V[i,j,k,i,j,k-1] = 1
V[i,j,k,i,j,k] = -3
A[i,j,k]=0
if i == l-1:
if j != 0 and j != l-1:
if k != 0 and k!= l-1:
#V(i,j,k,i+1,j,k) = 1
V[i,j,k,i,j+1,k] = 1
V[i,j,k,i,j,k+1] = 1
V[i,j,k,i-1,j,k] = 1
V[i,j,k,i,j-1,k] = 1
V[i,j,k,i,j,k-1] = 1
V[i,j,k,i,j,k] = -5
A[i,j,k]=0
if k == 0:
#V(i,j,k,i+1,j,k) = 1
V[i,j,k,i,j+1,k] = 1
V[i,j,k,i,j,k+1] = 1
V[i,j,k,i-1,j,k] = 1
V[i,j,k,i,j-1,k] = 1
#V(i,j,k,i,j,k-1) = -1
V[i,j,k,i,j,k] = -4
A[i,j,k]=0
if k == l-1:
#V(i,j,k,i+1,j,k) = 1
V[i,j,k,i,j+1,k] = 1
#V(i,j,k,i,j,k+1) = 1
V[i,j,k,i-1,j,k] = 1
V[i,j,k,i,j-1,k] = 1
V[i,j,k,i,j,k-1] = 1
V[i,j,k,i,j,k] = -4
A[i,j,k]=0
if j == 0 :
if k != 0 and k != l-1:
#V(i,j,k,i+1,j,k) = 1
V[i,j,k,i,j+1,k] = 1
V[i,j,k,i,j,k+1] = 1
V[i,j,k,i-1,j,k] = 1
#V(i,j,k,i,j-1,k) = -1
V[i,j,k,i,j,k-1] = 1
V[i,j,k,i,j,k] = -4
A[i,j,k]=0
if k == 0:
#V(i,j,k,i+1,j,k) = 1
V[i,j,k,i,j+1,k] = 1
V[i,j,k,i,j,k+1] = 1
V[i,j,k,i-1,j,k] = 1
#V(i,j,k,i,j-1,k) = -1
#V(i,j,k,i,j,k-1) = -1
V[i,j,k,i,j,k] = -3
A[i,j,k]=0
if k == l-1:
#V(i,j,k,i+1,j,k) = 1
V[i,j,k,i,j+1,k] = 1
#V(i,j,k,i,j,k+1) = 1
V[i,j,k,i-1,j,k] = 1
#V(i,j,k,i,j-1,k) = -1
V[i,j,k,i,j,k-1] = 1
V[i,j,k,i,j,k] = -3
A[i,j,k]=0
if j == l-1:
if k != 0 and k != l-1:
#V(i,j,k,i+1,j,k) = 1
#V(i,j,k,i,j+1,k) = 1
V[i,j,k,i,j,k+1] = 1
V[i,j,k,i-1,j,k] = 1
V[i,j,k,i,j-1,k] = 1
V[i,j,k,i,j,k-1] = 1
V[i,j,k,i,j,k] = -4
A[i,j,k]=0
if k == 0:
#V(i,j,k,i+1,j,k) = 1
#V(i,j,k,i,j+1,k) = 1
V[i,j,k,i,j,k+1] = 1
V[i,j,k,i-1,j,k] = 1
V[i,j,k,i,j-1,k] = 1
# V(i,j,k,i,j,k-1) = -1
V[i,j,k,i,j,k] = -3
A[i,j,k]=0
if k == l-1:
#V(i,j,k,i+1,j,k) = 1
#V(i,j,k,i,j+1,k) = 1
#V(i,j,k,i,j,k+1) = 1
V[i,j,k,i-1,j,k] = 1
V[i,j,k,i,j-1,k] = 1
V[i,j,k,i,j,k-1] = 1
V[i,j,k,i,j,k] = -3
A[i,j,k]=0
return Nonefor i in range(l):
for j in range(l):
for k in range(l):
FillMatrix(i,j,k)
#Set voltage equation for V+
V[(l-1)/2,(l-1)/2,(l-1)/2,(l-1)/2,(l-1)/2,(l-1)/2] = 7
V[(l-1)/2,(l-1)/2,(l-1)/2,(l-1)/2 -1,(l-1)/2,(l-1)/2] = -1
V[(l-1)/2,(l-1)/2,(l-1)/2,(l-1)/2,(l-1)/2 -1,(l-1)/2] = -1
V[(l-1)/2,(l-1)/2,(l-1)/2,(l-1)/2,(l-1)/2,(l-1)/2 -1] = -1
V[(l-1)/2,(l-1)/2,(l-1)/2,(l-1)/2 +1,(l-1)/2,(l-1)/2] = -1
V[(l-1)/2,(l-1)/2,(l-1)/2,(l-1)/2,(l-1)/2 +1,(l-1)/2] = -1
V[(l-1)/2,(l-1)/2,(l-1)/2,(l-1)/2,(l-1)/2,(l-1)/2 +1] = -1
V[(l-1)/2,(l-1)/2,(l-1)/2,(l+1)/2,(l+1)/2,(l+1)/2] = 1 V[(l+1)/2,(l+1)/2,(l+1)/2,(l-1)/2,(l-1)/2,(l-1)/2] = -1
V[(l+1)/2,(l+1)/2,(l+1)/2,(l+1)/2,(l+1)/2,(l+1)/2] = -7 current = 50 #change this to anything you want and you should get 0.0261768888518 ohms for l = 17
A[(l-1)/2,(l-1)/2,(l-1)/2] = (current)
A[(l+1)/2,(l+1)/2,(l+1)/2] = (-1)*current
x = linalg.tensorsolve(V,A)
R_equivalent = (x[(l-1)/2,(l-1)/2,(l-1)/2]-x[(l+1)/2,(l+1)/2,(l+1)/2])/current
print("R_equivalent: ")
print R_equivalent