77 lines
1.8 KiB
Text
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}")
|