tasks a-s
This commit is contained in:
parent
47bf37c096
commit
b83f433714
12433 changed files with 156208 additions and 123 deletions
64
Task/Resistor-mesh/Python/resistor-mesh.py
Normal file
64
Task/Resistor-mesh/Python/resistor-mesh.py
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
DIFF_THRESHOLD = 1e-40
|
||||
|
||||
class Fixed:
|
||||
FREE = 0
|
||||
A = 1
|
||||
B = 2
|
||||
|
||||
class Node:
|
||||
__slots__ = ["voltage", "fixed"]
|
||||
def __init__(self, v=0.0, f=Fixed.FREE):
|
||||
self.voltage = v
|
||||
self.fixed = f
|
||||
|
||||
def set_boundary(m):
|
||||
m[1][1] = Node( 1.0, Fixed.A)
|
||||
m[6][7] = Node(-1.0, Fixed.B)
|
||||
|
||||
def calc_difference(m, d):
|
||||
h = len(m)
|
||||
w = len(m[0])
|
||||
total = 0.0
|
||||
|
||||
for i in xrange(h):
|
||||
for j in xrange(w):
|
||||
v = 0.0
|
||||
n = 0
|
||||
if i != 0: v += m[i-1][j].voltage; n += 1
|
||||
if j != 0: v += m[i][j-1].voltage; n += 1
|
||||
if i < h-1: v += m[i+1][j].voltage; n += 1
|
||||
if j < w-1: v += m[i][j+1].voltage; n += 1
|
||||
v = m[i][j].voltage - v / n
|
||||
|
||||
d[i][j].voltage = v
|
||||
if m[i][j].fixed == Fixed.FREE:
|
||||
total += v ** 2
|
||||
return total
|
||||
|
||||
def iter(m):
|
||||
h = len(m)
|
||||
w = len(m[0])
|
||||
difference = [[Node() for j in xrange(w)] for i in xrange(h)]
|
||||
|
||||
while True:
|
||||
set_boundary(m) # Enforce boundary conditions.
|
||||
if calc_difference(m, difference) < DIFF_THRESHOLD:
|
||||
break
|
||||
for i, di in enumerate(difference):
|
||||
for j, dij in enumerate(di):
|
||||
m[i][j].voltage -= dij.voltage
|
||||
|
||||
cur = [0.0] * 3
|
||||
for i, di in enumerate(difference):
|
||||
for j, dij in enumerate(di):
|
||||
cur[m[i][j].fixed] += (dij.voltage *
|
||||
(bool(i) + bool(j) + (i < h-1) + (j < w-1)))
|
||||
|
||||
return (cur[Fixed.A] - cur[Fixed.B]) / 2.0
|
||||
|
||||
def main():
|
||||
w = h = 10
|
||||
mesh = [[Node() for j in xrange(w)] for i in xrange(h)]
|
||||
print "R = %.16f" % (2 / iter(mesh))
|
||||
|
||||
main()
|
||||
Loading…
Add table
Add a link
Reference in a new issue