June 2018 Update

This commit is contained in:
Ingy döt Net 2018-06-22 20:57:24 +00:00
parent ba8067c3b7
commit 22f33d4004
5278 changed files with 84726 additions and 14379 deletions

View file

@ -0,0 +1,107 @@
import java.util.ArrayList;
import java.util.List;
public class ResistorMesh {
private static final int S = 10;
private static class Node {
double v;
int fixed;
Node(double v, int fixed) {
this.v = v;
this.fixed = fixed;
}
}
private static void setBoundary(List<List<Node>> m) {
m.get(1).get(1).v = 1.0;
m.get(1).get(1).fixed = 1;
m.get(6).get(7).v = -1.0;
m.get(6).get(7).fixed = -1;
}
private static double calcDiff(List<List<Node>> m, List<List<Node>> d, int w, int h) {
double total = 0.0;
for (int i = 0; i < h; ++i) {
for (int j = 0; j < w; ++j) {
double v = 0.0;
int n = 0;
if (i > 0) {
v += m.get(i - 1).get(j).v;
n++;
}
if (j > 0) {
v += m.get(i).get(j - 1).v;
n++;
}
if (i + 1 < h) {
v += m.get(i + 1).get(j).v;
n++;
}
if (j + 1 < w) {
v += m.get(i).get(j + 1).v;
n++;
}
v = m.get(i).get(j).v - v / n;
d.get(i).get(j).v = v;
if (m.get(i).get(j).fixed == 0) {
total += v * v;
}
}
}
return total;
}
private static double iter(List<List<Node>> m, int w, int h) {
List<List<Node>> d = new ArrayList<>(h);
for (int i = 0; i < h; ++i) {
List<Node> t = new ArrayList<>(w);
for (int j = 0; j < w; ++j) {
t.add(new Node(0.0, 0));
}
d.add(t);
}
double[] cur = new double[3];
double diff = 1e10;
while (diff > 1e-24) {
setBoundary(m);
diff = calcDiff(m, d, w, h);
for (int i = 0; i < h; ++i) {
for (int j = 0; j < w; ++j) {
m.get(i).get(j).v -= d.get(i).get(j).v;
}
}
}
for (int i = 0; i < h; ++i) {
for (int j = 0; j < w; ++j) {
int k = 0;
if (i != 0) k++;
if (j != 0) k++;
if (i < h - 1) k++;
if (j < w - 1) k++;
cur[m.get(i).get(j).fixed + 1] += d.get(i).get(j).v * k;
}
}
return (cur[2] - cur[0]) / 2.0;
}
public static void main(String[] args) {
List<List<Node>> mesh = new ArrayList<>(S);
for (int i = 0; i < S; ++i) {
List<Node> t = new ArrayList<>(S);
for (int j = 0; j < S; ++j) {
t.add(new Node(0.0, 0));
}
mesh.add(t);
}
double r = 2.0 / iter(mesh, S, S);
System.out.printf("R = %.15f", r);
}
}

View file

@ -0,0 +1,111 @@
MODULE ResistorMesh;
FROM RConversions IMPORT RealToStringFixed;
FROM Terminal IMPORT WriteString,WriteLn,ReadChar;
CONST S = 10;
TYPE Node = RECORD
v : LONGREAL;
fixed : INTEGER;
END;
PROCEDURE SetBoundary(VAR m : ARRAY OF ARRAY OF Node);
BEGIN
m[1][1].v := 1.0;
m[1][1].fixed := 1;
m[6][7].v := -1.0;
m[6][7].fixed := -1;
END SetBoundary;
PROCEDURE CalcDiff(VAR m,d : ARRAY OF ARRAY OF Node) : LONGREAL;
VAR
total,v : LONGREAL;
i,j,n : INTEGER;
BEGIN
total := 0.0;
FOR i:=0 TO S DO
FOR j:=0 TO S DO
v := 0.0;
n := 0;
IF i>0 THEN
v := v + m[i-1][j].v;
INC(n);
END;
IF j>0 THEN
v := v + m[i][j-1].v;
INC(n);
END;
IF i+1<S THEN
v := v + m[i+1][j].v;
INC(n);
END;
IF j+1<S THEN
v := v + m[i][j+1].v;
INC(n);
END;
v := m[i][j].v - v / LFLOAT(n);
d[i][j].v := v;
IF m[i][j].fixed=0 THEN
total := total + v*v;
END;
END;
END;
RETURN total;
END CalcDiff;
PROCEDURE Iter(m : ARRAY OF ARRAY OF Node) : LONGREAL;
VAR
d : ARRAY[0..S] OF ARRAY[0..S] OF Node;
i,j,k : INTEGER;
cur : ARRAY[0..2] OF LONGREAL;
diff : LONGREAL;
BEGIN
FOR i:=0 TO S DO
FOR j:=0 TO S DO
d[i][j] := Node{0.0,0};
END;
END;
diff := 1.0E10;
WHILE diff>1.0E-24 DO
SetBoundary(m);
diff := CalcDiff(m,d);
FOR i:=0 TO S DO
FOR j:=0 TO S DO
m[i][j].v := m[i][j].v - d[i][j].v;
END;
END;
END;
FOR i:=0 TO S DO
FOR j:=0 TO S DO
k:=0;
IF i#0 THEN INC(k) END;
IF j#0 THEN INC(k) END;
IF i<S-1 THEN INC(k) END;
IF j<S-1 THEN INC(k) END;
cur[m[i][j].fixed+1] := cur[m[i][j].fixed+1] + d[i][j].v*LFLOAT(k);
END;
END;
RETURN (cur[2]-cur[0]) / 2.0;
END Iter;
VAR
mesh : ARRAY[0..S] OF ARRAY[0..S] OF Node;
buf : ARRAY[0..32] OF CHAR;
r : LONGREAL;
pos : CARDINAL;
ok : BOOLEAN;
BEGIN
pos := 0;
r := 2.0 / Iter(mesh);
WriteString("R = ");
RealToStringFixed(r, 15,0, buf, pos, ok);
WriteString(buf);
WriteString(" ohms");
WriteLn;
ReadChar;
END ResistorMesh.