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}")