RosettaCodeData/Task/Resistor-mesh/ERRE/resistor-mesh.erre
2023-07-01 13:44:08 -04:00

76 lines
1.3 KiB
Text

PROGRAM RESISTENCE_MESH
!$BASE=1
!$DYNAMIC
DIM A[0,0]
BEGIN
N=10
NN=N*N
!$DIM A[NN,NN+1]
PRINT(CHR$(12);) !CLS
! generate matrix data
NODE=0
FOR ROW=1 TO N DO
FOR COL=1 TO N DO
NODE=NODE+1
IF ROW>1 THEN
A[NODE,NODE]=A[NODE,NODE]+1
A[NODE,NODE-N]=-1
END IF
IF ROW<N THEN
A[NODE,NODE]=A[NODE,NODE]+1
A[NODE,NODE+N]=-1
END IF
IF COL>1 THEN
A[NODE,NODE]=A[NODE,NODE]+1
A[NODE,NODE-1]=-1
END IF
IF COL<N THEN
A[NODE,NODE]=A[NODE,NODE]+1
A[NODE,NODE+1]=-1
END IF
END FOR
END FOR
AR=2 AC=2 A=AC+N*(AR-1)
BR=7 BC=8 B=BC+N*(BR-1)
A[A,NN+1]=-1
A[B,NN+1]=1
PRINT("Nodes ";A,B)
! solve linear system
! using Gauss-Seidel method
! with pivoting
R=NN
FOR J=1 TO R DO
FOR I=J TO R DO
EXIT IF A[I,J]<>0
END FOR
IF I=R+1 THEN
PRINT("No solution!")
!$STOP
END IF
FOR K=1 TO R+1 DO
SWAP(A[J,K],A[I,K])
END FOR
Y=1/A[J,J]
FOR K=1 TO R+1 DO
A[J,K]=Y*A[J,K]
END FOR
FOR I=1 TO R DO
IF I<>J THEN
Y=-A[I,J]
FOR K=1 TO R+1 DO
A[I,K]=A[I,K]+Y*A[J,K]
END FOR
END IF
END FOR
END FOR
PRINT("Resistence=";ABS(A[A,NN+1]-A[B,NN+1]))
END PROGRAM