Resistor mesh: Difference between revisions
Content added Content deleted
(Added Java) |
|||
Line 960: | Line 960: | ||
{{Out}} |
{{Out}} |
||
<pre>1.608991241730729655954495520510088761201</pre> |
<pre>1.608991241730729655954495520510088761201</pre> |
||
=={{header|Modula-2}}== |
|||
<lang modula>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.</lang> |
|||
=={{header|Octave}}== |
=={{header|Octave}}== |