June 2018 Update
This commit is contained in:
parent
ba8067c3b7
commit
22f33d4004
5278 changed files with 84726 additions and 14379 deletions
107
Task/Resistor-mesh/Java/resistor-mesh.java
Normal file
107
Task/Resistor-mesh/Java/resistor-mesh.java
Normal 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);
|
||||
}
|
||||
}
|
||||
111
Task/Resistor-mesh/Modula-2/resistor-mesh.mod2
Normal file
111
Task/Resistor-mesh/Modula-2/resistor-mesh.mod2
Normal 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.
|
||||
Loading…
Add table
Add a link
Reference in a new issue