📄 pinvs.pas
字号:
PROCEDURE pinvs(ie1,ie2,je1,jsf,jc1,k: integer; VAR c: glcarray;
nci,ncj,nck: integer; VAR s: glsarray; nsi,nsj: integer);
(* Programs using routine PINVS must define the types
TYPE
glcarray = ARRAY [1..nci,1..ncj,1..nck] OF real;
glsarray = ARRAY [1..nsi,1..nsj] OF real;
in the main routine. *)
CONST
zero=0.0;
one=1.0;
nmax=10;
VAR
js1,jpiv,jp,je2,jcoff,j,irow,ipiv,id,icoff,i: integer;
pivinv,piv,dum,big: real;
pscl: ARRAY [1..nmax] OF real;
indxr: ARRAY [1..nmax] OF integer;
BEGIN
je2 := je1+ie2-ie1;
js1 := je2+1;
FOR i := ie1 TO ie2 DO BEGIN
big := zero;
FOR j := je1 TO je2 DO IF (abs(s[i,j]) > big) THEN big := abs(s[i,j]);
IF (big = zero) THEN BEGIN
writeln('pause in routine PINVS');
writeln('singular matrix - row all 0'); readln
END;
pscl[i] := one/big;
indxr[i] := 0
END;
FOR id := ie1 TO ie2 DO BEGIN
piv := zero;
FOR i := ie1 TO ie2 DO BEGIN
IF (indxr[i] = 0) THEN BEGIN
big := zero;
FOR j := je1 TO je2 DO BEGIN
IF (abs(s[i,j]) > big) THEN BEGIN
jp := j;
big := abs(s[i,j])
END
END;
IF (big*pscl[i] > piv) THEN BEGIN
ipiv := i;
jpiv := jp;
piv := big*pscl[i]
END
END
END;
IF (s[ipiv,jpiv] = zero) THEN BEGIN
writeln('pause in routine PINVS');
writeln('singular matrix'); readln
END;
indxr[ipiv] := jpiv;
pivinv := one/s[ipiv,jpiv];
FOR j := je1 TO jsf DO s[ipiv,j] := s[ipiv,j]*pivinv;
s[ipiv,jpiv] := one;
FOR i := ie1 TO ie2 DO BEGIN
IF (indxr[i] <> jpiv) THEN BEGIN
IF (s[i,jpiv] <> zero) THEN BEGIN
dum := s[i,jpiv];
FOR j := je1 TO jsf DO s[i,j] := s[i,j]-dum*s[ipiv,j];
s[i,jpiv] := zero
END
END
END
END;
jcoff := jc1-js1;
icoff := ie1-je1;
FOR i := ie1 TO ie2 DO BEGIN
irow := indxr[i]+icoff;
FOR j := js1 TO jsf DO c[irow,j+jcoff,k] := s[i,j]
END
END;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -