RosettaCodeData/Task/Resistor-mesh/Pluto/resistor-mesh.pluto
2026-04-30 12:34:36 -04:00

77 lines
1.8 KiB
Text

class node
function __construct(public v, public fixed) end
end
local function set_boundary(m)
m[2][2].v = 1
m[2][2].fixed = 1
m[7][8].v = -1
m[7][8].fixed = -1
end
local function calc_diff(m, d, w, h)
local total = 0
for i = 1, h do
for j = 1, w do
local v = 0
local n = 0
if i > 1 then
v += m[i - 1][j].v
n += 1
end
if j > 1 then
v += m[i][j - 1].v
n += 1
end
if i < h then
v += m[i + 1][j].v
n += 1
end
if j < w then
v += m[i][j + 1].v
n += 1
end
v = m[i][j].v - v / n
d[i][j].v = v
if m[i][j].fixed == 0 then total += v * v end
end
end
return total
end
local function iter(m, w, h)
local d = table.create(h)
for i = 1, h do
d[i] = table.create(w)
for j = 1, w do d[i][j] = new node(0, 0) end
end
local cur = {0, 0, 0}
local diff = 1e10
while diff > 1e-24 do
set_boundary(m)
diff = calc_diff(m, d, w, h)
for i = 1, h do
for j = 1, w do m[i][j].v -= d[i][j].v end
end
end
for i = 1, h do
for j = 1, w do
local k = 0
if i != 1 then k += 1 end
if j != 1 then k += 1 end
if i < h then k += 1 end
if j < w then k += 1 end
cur[m[i][j].fixed + 2] += d[i][j].v * k
end
end
return (cur[3] - cur[1]) / 2
end
local S = 10
local mesh = table.create(S)
for i = 1, S do
mesh[i] = table.create(S)
for j = 1, S do mesh[i][j] = new node(0, 0) end
end
local r = 2 / iter(mesh, S, S)
print($"R = {r}")