Data update
This commit is contained in:
parent
5150844a7d
commit
4bb20c9b71
7735 changed files with 38060 additions and 199180 deletions
|
|
@ -1,69 +0,0 @@
|
|||
with Ada.Text_IO; use Ada.Text_IO;
|
||||
procedure ResistMesh is
|
||||
H, W : constant Positive := 10;
|
||||
rowA, colA : constant Positive := 2; -- row/col indexed from 1
|
||||
rowB : constant Positive := 7;
|
||||
colB : constant Positive := 8;
|
||||
|
||||
type Ntype is (A, B, Free);
|
||||
type Vtype is digits 15;
|
||||
type Node is record
|
||||
volt : Vtype := 0.0;
|
||||
name : Ntype := Free;
|
||||
end record;
|
||||
type NodeMesh is array (Positive range <>, Positive range <>) of Node;
|
||||
package IIO is new Ada.Text_IO.Float_IO (Vtype);
|
||||
mesh, dmesh : NodeMesh (1 .. H, 1 .. W);
|
||||
curA, curB, diff : Vtype;
|
||||
|
||||
procedure set_AB (mesh : in out NodeMesh) is begin
|
||||
mesh (rowA, colA).volt := 1.0; mesh (rowA, colA).name := A;
|
||||
mesh (rowB, colB).volt := -1.0; mesh (rowB, colB).name := B;
|
||||
end set_AB;
|
||||
|
||||
function sides (i : Positive; j : Positive) return Vtype is
|
||||
s : Integer := 0;
|
||||
begin
|
||||
if i /= 1 and i /= H then s := s + 2; else s := s + 1; end if;
|
||||
if j /= 1 and j /= W then s := s + 2; else s := s + 1; end if;
|
||||
return Vtype (s);
|
||||
end sides;
|
||||
|
||||
procedure calc_diff (mesh : NodeMesh; dmesh : out NodeMesh;
|
||||
total : out Vtype) is
|
||||
n : Natural;
|
||||
v : Vtype := 0.0;
|
||||
begin
|
||||
total := 0.0;
|
||||
for i in Positive range 1 .. H loop
|
||||
for j in Positive range 1 .. W loop
|
||||
n := 0; v := 0.0;
|
||||
if i /= 1 then v := v + mesh (i - 1, j).volt; n := n + 1; end if;
|
||||
if j /= 1 then v := v + mesh (i, j - 1).volt; n := n + 1; end if;
|
||||
if i < H then v := v + mesh (i + 1, j).volt; n := n + 1; end if;
|
||||
if j < W then v := v + mesh (i, j + 1).volt; n := n + 1; end if;
|
||||
v := mesh (i, j).volt - v / Vtype (n);
|
||||
dmesh (i, j).volt := v;
|
||||
if mesh (i, j).name = Free then total := total + v ** 2; end if;
|
||||
end loop;
|
||||
end loop;
|
||||
end calc_diff;
|
||||
|
||||
begin
|
||||
|
||||
loop
|
||||
set_AB (mesh);
|
||||
calc_diff (mesh, dmesh, diff);
|
||||
exit when diff < 1.0e-40;
|
||||
for i in Positive range 1 .. H loop
|
||||
for j in Positive range 1 .. W loop
|
||||
mesh (i, j).volt := mesh (i, j).volt - dmesh (i, j).volt;
|
||||
end loop;
|
||||
end loop;
|
||||
end loop;
|
||||
|
||||
curA := dmesh (rowA, colA).volt * sides (rowA, colA);
|
||||
curB := dmesh (rowB, colB).volt * sides (rowB, colB);
|
||||
diff := 4.0 / (curA - curB);
|
||||
IIO.Put (diff, Exp => 0); New_Line;
|
||||
end ResistMesh;
|
||||
|
|
@ -1,7 +1,27 @@
|
|||
N = 10
|
||||
D1 = speye(N-1,N) - spdiagm(ones(N-1),1,N-1,N)
|
||||
D = [ kron(D1, speye(N)); kron(speye(N), D1) ]
|
||||
i, j = N*1 + 2, N*7+7
|
||||
b = zeros(N^2); b[i], b[j] = 1, -1
|
||||
using SparseArrays, LinearAlgebra
|
||||
|
||||
const N = 10
|
||||
|
||||
# Build an (N-1) x N discrete forward-difference operator:
|
||||
# each row k has +1 at column k and -1 at column k+1
|
||||
const rows = vcat(1:(N-1), 1:(N-1))
|
||||
const cols = vcat(1:(N-1), 2:N)
|
||||
const vals = vcat(ones(N-1), -ones(N-1))
|
||||
const D1 = sparse(rows, cols, vals, N-1, N) # (N-1) x N
|
||||
|
||||
# Identity as a sparse NxN
|
||||
const I_N = spdiagm(0 => ones(N))
|
||||
|
||||
# Build 2D difference operator with Kronecker products
|
||||
const D = [kron(D1, I_N); kron(I_N, D1)] # (2*N*(N-1)) x (N^2)
|
||||
|
||||
# indices and right-hand side
|
||||
const i, j = N*1 + 2, N*7 + 7
|
||||
const b = zeros(N^2)
|
||||
b[i], b[j] = 1.0, -1.0
|
||||
|
||||
# Solve normal equations (least-squares / Poisson-style)
|
||||
v = (D' * D) \ b
|
||||
v[i] - v[j]
|
||||
|
||||
# potential difference
|
||||
println(v[i] - v[j])
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* Place a current souce between A and B, providing 1 A. Then we are really looking
|
||||
/* Place a current source between A and B, providing 1 A. Then we are really looking
|
||||
for the potential at A and B, since I = R (V(B) - V(A)) where I is given and we want R.
|
||||
|
||||
Atually, we will compute potential at each node, except A where we assume it's 0.
|
||||
|
|
|
|||
|
|
@ -1,29 +1,27 @@
|
|||
-->
|
||||
<span style="color: #008080;">function</span> <span style="color: #000000;">resistormesh</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">ni</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">nj</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">ai</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">aj</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">bi</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">bj</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #004080;">integer</span> <span style="color: #000000;">n</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">ni</span><span style="color: #0000FF;">*</span><span style="color: #000000;">nj</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">k</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">c</span>
|
||||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">A</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">n</span><span style="color: #0000FF;">),</span><span style="color: #000000;">n</span><span style="color: #0000FF;">),</span>
|
||||
<span style="color: #000000;">B</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">({</span><span style="color: #000000;">0</span><span style="color: #0000FF;">},</span><span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">ni</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #008080;">for</span> <span style="color: #000000;">j</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">nj</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #000000;">k</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">i</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)*</span><span style="color: #000000;">nj</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">j</span><span style="color: #000080;font-style:italic;">--1</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">ai</span> <span style="color: #008080;">and</span> <span style="color: #000000;">j</span><span style="color: #0000FF;">=</span><span style="color: #000000;">aj</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #000000;">A</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">,</span><span style="color: #000000;">k</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span>
|
||||
<span style="color: #008080;">else</span>
|
||||
<span style="color: #000000;">c</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">i</span><span style="color: #0000FF;"><</span><span style="color: #000000;">ni</span> <span style="color: #008080;">then</span> <span style="color: #000000;">c</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">;</span> <span style="color: #000000;">A</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">,</span><span style="color: #000000;">k</span><span style="color: #0000FF;">+</span><span style="color: #000000;">nj</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">></span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> <span style="color: #000000;">c</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">;</span> <span style="color: #000000;">A</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">,</span><span style="color: #000000;">k</span><span style="color: #0000FF;">-</span><span style="color: #000000;">nj</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">j</span><span style="color: #0000FF;"><</span><span style="color: #000000;">nj</span> <span style="color: #008080;">then</span> <span style="color: #000000;">c</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">;</span> <span style="color: #000000;">A</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">,</span><span style="color: #000000;">k</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">j</span><span style="color: #0000FF;">></span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> <span style="color: #000000;">c</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">;</span> <span style="color: #000000;">A</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">,</span><span style="color: #000000;">k</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #000000;">A</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">,</span><span style="color: #000000;">k</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">c</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
|
||||
<span style="color: #000000;">k</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">bi</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)*</span><span style="color: #000000;">nj</span> <span style="color: #0000FF;">+</span><span style="color: #000000;">bj</span>
|
||||
<span style="color: #000000;">B</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span>
|
||||
<span style="color: #000000;">A</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">inverse</span><span style="color: #0000FF;">(</span><span style="color: #000000;">A</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #000000;">B</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">matrix_mul</span><span style="color: #0000FF;">(</span><span style="color: #000000;">A</span><span style="color: #0000FF;">,</span><span style="color: #000000;">B</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">return</span> <span style="color: #000000;">B</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
|
||||
function resistormesh(integer ni, nj, ai, aj, bi, bj)
|
||||
integer n = ni*nj, k, c
|
||||
sequence A = repeat(repeat(0,n),n),
|
||||
B = repeat({0},n)
|
||||
for i=1 to ni do
|
||||
for j=1 to nj do
|
||||
k = (i-1)*nj + j--1
|
||||
if i=ai and j=aj then
|
||||
A[k,k] = 1
|
||||
else
|
||||
c = 0
|
||||
if i<ni then c += 1; A[k,k+nj] = -1 end if
|
||||
if i>1 then c += 1; A[k,k-nj] = -1 end if
|
||||
if j<nj then c += 1; A[k,k+1] = -1 end if
|
||||
if j>1 then c += 1; A[k,k-1] = -1 end if
|
||||
A[k,k] = c
|
||||
end if
|
||||
end for
|
||||
end for
|
||||
k = (bi-1)*nj +bj
|
||||
B[k,1] = 1
|
||||
A = inverse(A)
|
||||
B = matrix_mul(A,B)
|
||||
return B[k,1]
|
||||
end function
|
||||
|
||||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Resistance = %.13f ohms\n"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">resistormesh</span><span style="color: #0000FF;">(</span><span style="color: #000000;">10</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">10</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">8</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">7</span><span style="color: #0000FF;">))</span>
|
||||
<!--
|
||||
printf(1,"Resistance = %.13f ohms\n",resistormesh(10, 10, 2, 2, 8, 7))
|
||||
|
|
|
|||
|
|
@ -1,3 +1,10 @@
|
|||
from __future__ import print_function # allows print() in Python 2
|
||||
import sys
|
||||
|
||||
# Handle xrange compatibility
|
||||
if sys.version_info[0] < 3:
|
||||
range = xrange
|
||||
|
||||
DIFF_THRESHOLD = 1e-40
|
||||
|
||||
class Fixed:
|
||||
|
|
@ -12,7 +19,7 @@ class Node:
|
|||
self.fixed = f
|
||||
|
||||
def set_boundary(m):
|
||||
m[1][1] = Node( 1.0, Fixed.A)
|
||||
m[1][1] = Node(1.0, Fixed.A)
|
||||
m[6][7] = Node(-1.0, Fixed.B)
|
||||
|
||||
def calc_difference(m, d):
|
||||
|
|
@ -20,8 +27,8 @@ def calc_difference(m, d):
|
|||
w = len(m[0])
|
||||
total = 0.0
|
||||
|
||||
for i in xrange(h):
|
||||
for j in xrange(w):
|
||||
for i in range(h):
|
||||
for j in range(w):
|
||||
v = 0.0
|
||||
n = 0
|
||||
if i != 0: v += m[i-1][j].voltage; n += 1
|
||||
|
|
@ -38,10 +45,10 @@ def calc_difference(m, d):
|
|||
def iter(m):
|
||||
h = len(m)
|
||||
w = len(m[0])
|
||||
difference = [[Node() for j in xrange(w)] for i in xrange(h)]
|
||||
difference = [[Node() for j in range(w)] for i in range(h)]
|
||||
|
||||
while True:
|
||||
set_boundary(m) # Enforce boundary conditions.
|
||||
set_boundary(m) # Enforce boundary conditions.
|
||||
if calc_difference(m, difference) < DIFF_THRESHOLD:
|
||||
break
|
||||
for i, di in enumerate(difference):
|
||||
|
|
@ -56,9 +63,7 @@ def iter(m):
|
|||
|
||||
return (cur[Fixed.A] - cur[Fixed.B]) / 2.0
|
||||
|
||||
def main():
|
||||
if __name__ == "__main__":
|
||||
w = h = 10
|
||||
mesh = [[Node() for j in xrange(w)] for i in xrange(h)]
|
||||
print "R = %.16f" % (2 / iter(mesh))
|
||||
|
||||
main()
|
||||
mesh = [[Node() for j in range(w)] for i in range(h)]
|
||||
print("R = %.16f" % (2 / iter(mesh)))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue