RosettaCodeData/Task/Resistor-mesh/BBC-BASIC/resistor-mesh.basic

32 lines
900 B
Plaintext

INSTALL @lib$+"ARRAYLIB"
*FLOAT 64
@% = &F0F
PRINT "Resistance = "; FNresistormesh(10, 10, 1, 1, 7, 6) " ohms"
END
DEF FNresistormesh(ni%, nj%, ai%, aj%, bi%, bj%)
LOCAL c%, i%, j%, k%, n%, A(), B()
n% = ni% * nj%
DIM A(n%-1, n%-1), B(n%-1, 0)
FOR i% = 0 TO ni%-1
FOR j% = 0 TO nj%-1
k% = i% * nj% + j%
IF i% = ai% AND j% = aj% THEN
A(k%, k%) = 1
ELSE
c% = 0
IF (i% + 1) < ni% c% += 1 : A(k%, k% + nj%) = -1
IF i% > 0 c% += 1 : A(k%, k% - nj%) = -1
IF (j% + 1) < nj% c% += 1 : A(k%, k% + 1) = -1
IF j% > 0 c% += 1 : A(k%, k% - 1) = -1
A(k%, k%) = c%
ENDIF
NEXT
NEXT
k% = bi% * nj% + bj%
B(k%, 0) = 1
PROC_invert(A())
B() = A().B()
= B(k%, 0)