mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-12 16:09:25 +02:00
* initial versions
This commit is contained in:
parent
59c7d30e12
commit
6e38263ffc
495
packages/extra/numlib/doc/inv.tex
Normal file
495
packages/extra/numlib/doc/inv.tex
Normal file
@ -0,0 +1,495 @@
|
|||||||
|
%
|
||||||
|
% part of numlib docs. In time this won't be a standalone pdf anymore, but part of a larger part.
|
||||||
|
% for now I keep it directly compliable. Uses fpc.sty from fpc-docs pkg.
|
||||||
|
%
|
||||||
|
|
||||||
|
\documentclass{report}
|
||||||
|
|
||||||
|
\usepackage{fpc}
|
||||||
|
\lstset{%
|
||||||
|
basicstyle=\small,
|
||||||
|
language=delphi,
|
||||||
|
commentstyle=\itshape,
|
||||||
|
keywordstyle=\bfseries,
|
||||||
|
showstringspaces=false,
|
||||||
|
frame=
|
||||||
|
}
|
||||||
|
|
||||||
|
\makeindex
|
||||||
|
|
||||||
|
\newcommand{\FunctionDescription}{\item[Description]\rmfamily}
|
||||||
|
\newcommand{\Dataorganisation}{\item[Data Struct]\rmfamily}
|
||||||
|
\newcommand{\DeclarationandParams}{\item[Declaration]\rmfamily}
|
||||||
|
\newcommand{\References}{\item[References]\rmfamily}
|
||||||
|
\newcommand{\Method}{\item[Method]\rmfamily}
|
||||||
|
\newcommand{\Precision}{\item[Precision]\rmfamily}
|
||||||
|
\newcommand{\Remarks}{\item[Remarks]\rmfamily}
|
||||||
|
\newcommand{\Example}{\item[Example]\rmfamily}
|
||||||
|
\newcommand{\ProgramData}{\item[Example Data]\rmfamily}
|
||||||
|
\newcommand{\ProgramResults}{\item[Example Result]\rmfamily}
|
||||||
|
|
||||||
|
\begin{document}
|
||||||
|
|
||||||
|
\section{Unit inv}
|
||||||
|
|
||||||
|
\textbf{Original comments:} \\
|
||||||
|
The used floating point type \textbf{real} depends on the used version,
|
||||||
|
see the general introduction for more information. You'll need to USE
|
||||||
|
units typ an inv to use these routines.
|
||||||
|
|
||||||
|
\textbf{MvdV notes:} \\
|
||||||
|
Integers used for parameters are of type "ArbInt" to avoid problems with
|
||||||
|
systems that define integer differently depending on mode.
|
||||||
|
|
||||||
|
Floating point values are of type "ArbFloat" to allow writing code that is
|
||||||
|
independant of the exact real type. (Contrary to directly specifying single,
|
||||||
|
real, double or extended in library and examples). Typ.pas and the central
|
||||||
|
includefile have some conditional code to switch between floating point
|
||||||
|
types.
|
||||||
|
|
||||||
|
These changes were already prepared somewhat when I got the lib, but weren't
|
||||||
|
consequently applied. I did that while porting to FPC.
|
||||||
|
|
||||||
|
\begin{procedure}{invgen}
|
||||||
|
|
||||||
|
\FunctionDescription
|
||||||
|
|
||||||
|
Procedure to calculate the inverse of a matrix.
|
||||||
|
|
||||||
|
\Dataorganisation
|
||||||
|
|
||||||
|
The procedure assumes that the calling program has declared a two dimensional
|
||||||
|
matrix containing the maxtrixelements in a square partial block.
|
||||||
|
|
||||||
|
\DeclarationandParams
|
||||||
|
|
||||||
|
\lstinline|procedure invgen(n, rwidth: ArbInt; var ai: ArbFloat;var term: ArbInt);|
|
||||||
|
|
||||||
|
\begin{description}
|
||||||
|
\item[n: integer] \mbox{ } \\
|
||||||
|
The parameter {\bf n} describes the size of the matrix
|
||||||
|
\item[rwidth: integer] \mbox{} \\
|
||||||
|
The parameter {\bf rwidth} describes the declared rowlength of the twodimensional
|
||||||
|
matrix.
|
||||||
|
\item[var ai: real] \mbox{} \\
|
||||||
|
The parameter {\bf ai} must contain to the twodimensional arrayelement
|
||||||
|
that is top-left in the matrix.
|
||||||
|
After the function has ended succesfully (\textbf{term=1}) then
|
||||||
|
the input matrix has been changed into its inverse, otherwise the contents
|
||||||
|
of the input matrix are undefined.
|
||||||
|
ongedefinieerd.
|
||||||
|
\item[var term: integer] \mbox{} \\
|
||||||
|
After the procedure has run, this variable contains the reason for
|
||||||
|
the termination of the procedure:\\
|
||||||
|
{\bf term}=1, succesfull termination, the inverse has been calculated
|
||||||
|
{\bf term}=2, inverse matrix could not be calculated because the matrix
|
||||||
|
is (very close to) being singular.
|
||||||
|
{\bf term}=3, wrong input n$<$1
|
||||||
|
\end{description}
|
||||||
|
\Remarks
|
||||||
|
This procedure does not do array range checks. When called with invalid
|
||||||
|
parameters, invalid/nonsense responses or even crashes may be the result.
|
||||||
|
|
||||||
|
\Example
|
||||||
|
|
||||||
|
Calculate the inverse of
|
||||||
|
\[
|
||||||
|
A=
|
||||||
|
\left(
|
||||||
|
\begin{array}{rrrr}
|
||||||
|
4 & 2 & 4 & 1 \\
|
||||||
|
30 & 20 & 45 & 12 \\
|
||||||
|
20 & 15 & 36 & 10 \\
|
||||||
|
35 & 28 & 70 & 20
|
||||||
|
\end{array}
|
||||||
|
\right)
|
||||||
|
.
|
||||||
|
\]
|
||||||
|
|
||||||
|
Below is the source of the invgenex demo that demontrates invgenex, some
|
||||||
|
routines of iom were used to construct matrices.
|
||||||
|
|
||||||
|
\begin{lstlisting}
|
||||||
|
program invgenex;
|
||||||
|
uses typ, iom, inv;
|
||||||
|
const n = 4;
|
||||||
|
var term : ArbInt;
|
||||||
|
A : array[1..n,1..n] of ArbFloat;
|
||||||
|
|
||||||
|
begin
|
||||||
|
assign(input, paramstr(1)); reset(input);
|
||||||
|
assign(output, paramstr(2)); rewrite(output);
|
||||||
|
writeln('program results invgenex');
|
||||||
|
{ Read matrix A }
|
||||||
|
iomrem(input, A[1,1], n, n, n);
|
||||||
|
{ Print matrix A }
|
||||||
|
writeln; writeln('A =');
|
||||||
|
iomwrm(output, A[1,1], n, n, n, numdig);
|
||||||
|
{ Calculation of the inverse of A }
|
||||||
|
invgen(n, n, A[1,1], term);
|
||||||
|
writeln; writeln('term=', term:2);
|
||||||
|
if term=1 then
|
||||||
|
{ print inverse inverse of A }
|
||||||
|
begin
|
||||||
|
writeln; writeln('inverse of A =');
|
||||||
|
iomwrm(output, A[1,1], n, n, n, numdig);
|
||||||
|
end; {term=1}
|
||||||
|
close(input); close(output)
|
||||||
|
end.
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
\ProgramData
|
||||||
|
|
||||||
|
The input datafile looks like:
|
||||||
|
\begin{verbatim}
|
||||||
|
4 2 4 1
|
||||||
|
30 20 45 12
|
||||||
|
20 15 36 10
|
||||||
|
35 28 70 20
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
\ProgramResults
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
program results invgenex
|
||||||
|
|
||||||
|
A =
|
||||||
|
4.0000000000000000E+0000 2.0000000000000000E+0000
|
||||||
|
3.0000000000000000E+0001 2.0000000000000000E+0001
|
||||||
|
2.0000000000000000E+0001 1.5000000000000000E+0001
|
||||||
|
3.5000000000000000E+0001 2.8000000000000000E+0001
|
||||||
|
|
||||||
|
4.0000000000000000E+0000 1.0000000000000000E+0000
|
||||||
|
4.5000000000000000E+0001 1.2000000000000000E+0001
|
||||||
|
3.6000000000000000E+0001 1.0000000000000000E+0001
|
||||||
|
7.0000000000000000E+0001 2.0000000000000000E+0001
|
||||||
|
|
||||||
|
term= 1
|
||||||
|
|
||||||
|
inverse of A =
|
||||||
|
4.0000000000000000E+0000 -2.0000000000000000E+0000
|
||||||
|
-3.0000000000000000E+0001 2.0000000000000000E+0001
|
||||||
|
2.0000000000000000E+0001 -1.5000000000000000E+0001
|
||||||
|
-3.4999999999999999E+0001 2.7999999999999999E+0001
|
||||||
|
|
||||||
|
3.9999999999999999E+0000 -1.0000000000000000E+0000
|
||||||
|
-4.4999999999999999E+0001 1.2000000000000000E+0001
|
||||||
|
3.5999999999999999E+0001 -1.0000000000000000E+0001
|
||||||
|
-6.9999999999999999E+0001 2.0000000000000000E+0001
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
\Precision
|
||||||
|
|
||||||
|
The procedure doesn't supply information about the precision of the
|
||||||
|
operation after termination.
|
||||||
|
|
||||||
|
\Method
|
||||||
|
|
||||||
|
The calculation of the inverse is based on LU decomposition with partial
|
||||||
|
pivoting.
|
||||||
|
|
||||||
|
\References
|
||||||
|
|
||||||
|
Wilkinson, J.H. and Reinsch, C.\\
|
||||||
|
Handbook for Automatic Computation.\\
|
||||||
|
Volume II, Linear Algebra.\\
|
||||||
|
Springer Verlag, Contribution I/7, 1971.
|
||||||
|
|
||||||
|
\end{procedure}
|
||||||
|
|
||||||
|
\begin{procedure}{invgpd}
|
||||||
|
|
||||||
|
\FunctionDescription
|
||||||
|
|
||||||
|
Procedure to calculate the inverse of a symmetrical, postivive definite
|
||||||
|
|
||||||
|
%van een symmetrische,positief definiete matrix.
|
||||||
|
|
||||||
|
\Dataorganisation
|
||||||
|
The procedure assumes that the calling program has declared a two dimensional
|
||||||
|
matrix containing the maxtrixelements in a square partial block.
|
||||||
|
|
||||||
|
\DeclarationandParams
|
||||||
|
|
||||||
|
\lstinline|procedure invgpd(n, rwidth: ArbInt; var ai: ArbFloat; var term: ArbInt);|
|
||||||
|
|
||||||
|
\begin{description}
|
||||||
|
\item[n: integer] \mbox{ } \\
|
||||||
|
The parameter {\bf n} describes the size of the matrix
|
||||||
|
\item[rwidth: integer] \mbox{} \\
|
||||||
|
The parameter {\bf rwidth} describes the declared rowlength of the twodimensional
|
||||||
|
matrix.
|
||||||
|
\item[var ai: real] \mbox{} \\
|
||||||
|
The parameter {\bf ai} must contain to the twodimensional arrayelement
|
||||||
|
that is top-left in the matrix.
|
||||||
|
After the function has ended succesfully (\textbf{term=1}) then
|
||||||
|
the input matrix has been changed into its inverse, otherwise the contents
|
||||||
|
of the input matrix are undefined.
|
||||||
|
ongedefinieerd.
|
||||||
|
\item[var term: integer] \mbox{} \\
|
||||||
|
After the procedure has run, this variable contains the reason for
|
||||||
|
the termination of the procedure:\\
|
||||||
|
{\bf term}=1, succesfull termination, the inverse has been calculated
|
||||||
|
{\bf term}=2, inverse matrix could not be calculated because the matrix
|
||||||
|
is (very close to) being singular.
|
||||||
|
{\bf term}=3, wrong input n$<$1
|
||||||
|
\end{description}
|
||||||
|
\Remarks
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\item Only the bottomleft part of the matrix $A$ needs to be passed.
|
||||||
|
\item \textbf{Warning} This procedure does not do array range checks. When called with invalid
|
||||||
|
parameters, invalid/nonsense responses or even crashes may be the result.
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\Example
|
||||||
|
|
||||||
|
Calculate the inverse of
|
||||||
|
\[
|
||||||
|
A=
|
||||||
|
\left(
|
||||||
|
\begin{array}{rrrr}
|
||||||
|
5 & 7 & 6 & 5 \\
|
||||||
|
7 & 10 & 8 & 7 \\
|
||||||
|
6 & 8 & 10 & 9 \\
|
||||||
|
5 & 7 & 9 & 10
|
||||||
|
\end{array}
|
||||||
|
\right)
|
||||||
|
.
|
||||||
|
\]
|
||||||
|
|
||||||
|
\begin{lstlisting}
|
||||||
|
program invgpdex;
|
||||||
|
uses typ, iom, inv;
|
||||||
|
const n = 4;
|
||||||
|
var i, j, term : ArbInt;
|
||||||
|
A : array[1..n,1..n] of ArbFloat;
|
||||||
|
begin
|
||||||
|
assign(input, paramstr(1)); reset(input);
|
||||||
|
assign(output, paramstr(2)); rewrite(output);
|
||||||
|
writeln('program results invgpdex');
|
||||||
|
{ Read bottom leftpart of matrix A}
|
||||||
|
for i:=1 to n do iomrev(input, A[i,1], i);
|
||||||
|
{ print matrix A }
|
||||||
|
writeln; writeln('A =');
|
||||||
|
for i:=1 to n do for j:=1 to i-1 do A[j,i]:=A[i,j];
|
||||||
|
iomwrm(output, A[1,1], n, n, n, numdig);
|
||||||
|
{ Calculate inverse of matrix A}
|
||||||
|
invgpd(n, n, A[1,1], term);
|
||||||
|
writeln; writeln('term=', term:2);
|
||||||
|
if term=1 then
|
||||||
|
{ Print inverse of matrix A}
|
||||||
|
begin
|
||||||
|
writeln; writeln('inverse of A =');
|
||||||
|
iomwrm(output, A[1,1], n, n, n, numdig);
|
||||||
|
end; {term=1}
|
||||||
|
close(input); close(output)
|
||||||
|
end.
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
\ProgramData
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
5
|
||||||
|
7 10
|
||||||
|
6 8 10
|
||||||
|
5 7 9 10
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
\ProgramResults
|
||||||
|
\begin{verbatim}
|
||||||
|
|
||||||
|
program results invgpdex
|
||||||
|
|
||||||
|
A =
|
||||||
|
5.0000000000000000E+0000 7.0000000000000000E+0000
|
||||||
|
7.0000000000000000E+0000 1.0000000000000000E+0001
|
||||||
|
6.0000000000000000E+0000 8.0000000000000000E+0000
|
||||||
|
5.0000000000000000E+0000 7.0000000000000000E+0000
|
||||||
|
|
||||||
|
6.0000000000000000E+0000 5.0000000000000000E+0000
|
||||||
|
8.0000000000000000E+0000 7.0000000000000000E+0000
|
||||||
|
1.0000000000000000E+0001 9.0000000000000000E+0000
|
||||||
|
9.0000000000000000E+0000 1.0000000000000000E+0001
|
||||||
|
|
||||||
|
term= 1
|
||||||
|
|
||||||
|
inverse of A =
|
||||||
|
6.8000000000000000E+0001 -4.1000000000000000E+0001
|
||||||
|
-4.1000000000000000E+0001 2.5000000000000000E+0001
|
||||||
|
-1.7000000000000000E+0001 1.0000000000000000E+0001
|
||||||
|
1.0000000000000000E+0001 -6.0000000000000000E+0000
|
||||||
|
|
||||||
|
-1.7000000000000000E+0001 1.0000000000000000E+0001
|
||||||
|
1.0000000000000000E+0001 -6.0000000000000000E+0000
|
||||||
|
5.0000000000000000E+0000 -3.0000000000000000E+0000
|
||||||
|
-3.0000000000000000E+0000 2.0000000000000000E+0000
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
\Precision
|
||||||
|
|
||||||
|
The procedure doesn't supply information about the precision of the
|
||||||
|
operation after termination.
|
||||||
|
|
||||||
|
\Method
|
||||||
|
|
||||||
|
The calculation of the inverse is based on Cholesky decomposition for a
|
||||||
|
symmetrical positive definitie matrix.
|
||||||
|
|
||||||
|
\References
|
||||||
|
|
||||||
|
Wilkinson, J.H. and Reinsch, C.\\ Handbook for Automatic Computation.\\
|
||||||
|
Volume II, Linear Algebra.\\ Springer Verlag, Contribution I/7, 1971.
|
||||||
|
|
||||||
|
\end{procedure}
|
||||||
|
|
||||||
|
\begin{procedure}{invgsy}
|
||||||
|
|
||||||
|
\FunctionDescription
|
||||||
|
|
||||||
|
Procedure to calculate the inverse of a symmetrical matrix.
|
||||||
|
|
||||||
|
\Dataorganisation
|
||||||
|
|
||||||
|
The procedure assumes that the calling program has declared a two
|
||||||
|
dimensional matrix containing the maxtrixelements in (the bottomleft part
|
||||||
|
of) a square partial block.
|
||||||
|
|
||||||
|
\DeclarationandParams
|
||||||
|
|
||||||
|
\lstinline|procedure invgsy(n, rwidth: ArbInt; var ai: ArbFloat;var term:ArbInt);|
|
||||||
|
|
||||||
|
\begin{description}
|
||||||
|
\item[n: integer] \mbox{ } \\
|
||||||
|
The parameter {\bf n} describes the size of the matrix
|
||||||
|
\item[rwidth: integer] \mbox{} \\
|
||||||
|
The parameter {\bf rwidth} describes the declared rowlength of the twodimensional
|
||||||
|
matrix.
|
||||||
|
\item[var ai: real] \mbox{} \\
|
||||||
|
The parameter {\bf ai} must contain to the twodimensional arrayelement
|
||||||
|
that is top-left in the matrix.
|
||||||
|
After the function has ended succesfully (\textbf{term=1}) then
|
||||||
|
the input matrix has been changed into its inverse, otherwise the contents
|
||||||
|
of the input matrix are undefined.
|
||||||
|
ongedefinieerd.
|
||||||
|
\item[var term: integer] \mbox{} \\
|
||||||
|
After the procedure has run, this variable contains the reason for
|
||||||
|
the termination of the procedure:\\
|
||||||
|
{\bf term}=1, succesfull termination, the inverse has been calculated
|
||||||
|
{\bf term}=2, inverse matrix could not be calculated because the matrix
|
||||||
|
is (very close to) being singular.
|
||||||
|
{\bf term}=3, wrong input n$<$1
|
||||||
|
|
||||||
|
\end{description}
|
||||||
|
|
||||||
|
\Remarks
|
||||||
|
\begin{itemize}
|
||||||
|
\item Only the bottomleft part of the matrix $A$ needs to be passed.
|
||||||
|
\item \textbf{Warning} This procedure does not do array range checks. When called with invalid
|
||||||
|
parameters, invalid/nonsense responses or even crashes may be the result.
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\Example
|
||||||
|
|
||||||
|
Het berekenen van de inverse van
|
||||||
|
\[
|
||||||
|
A=
|
||||||
|
\left(
|
||||||
|
\begin{array}{rrrr}
|
||||||
|
5 & 7 & 6 & 5 \\
|
||||||
|
7 & 10 & 8 & 7 \\
|
||||||
|
6 & 8 & 10 & 9 \\
|
||||||
|
5 & 7 & 9 & 10
|
||||||
|
\end{array}
|
||||||
|
\right)
|
||||||
|
.
|
||||||
|
\]
|
||||||
|
|
||||||
|
\begin{lstlisting}
|
||||||
|
program invgsyex;
|
||||||
|
uses typ, iom, inv;
|
||||||
|
const n = 4;
|
||||||
|
var i, j, term : ArbInt;
|
||||||
|
A : array[1..n,1..n] of ArbFloat;
|
||||||
|
begin
|
||||||
|
assign(input, paramstr(1)); reset(input);
|
||||||
|
assign(output, paramstr(2)); rewrite(output);
|
||||||
|
writeln('program results invgsyex');
|
||||||
|
{ Read bottomleft part of matrix A}
|
||||||
|
for i:=1 to n do iomrev(input, A[i,1], i);
|
||||||
|
{ print matrix A}
|
||||||
|
writeln; writeln('A =');
|
||||||
|
for i:=1 to n do for j:=1 to i-1 do A[j,i]:=A[i,j];
|
||||||
|
iomwrm(output, A[1,1], n, n, n, numdig);
|
||||||
|
{ calculate inverse of matrix A}
|
||||||
|
invgsy(n, n, A[1,1], term);
|
||||||
|
writeln; writeln('term=', term:2);
|
||||||
|
if term=1 then
|
||||||
|
{ print inverse of matrix A}
|
||||||
|
begin
|
||||||
|
writeln; writeln('inverse of A =');
|
||||||
|
iomwrm(output, A[1,1], n, n, n, numdig);
|
||||||
|
end; {term=1}
|
||||||
|
close(input); close(output)
|
||||||
|
end.
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
\ProgramData
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
5
|
||||||
|
7 10
|
||||||
|
6 8 10
|
||||||
|
5 7 9 10
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
\ProgramResults
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
program results invgsyex
|
||||||
|
|
||||||
|
A =
|
||||||
|
5.0000000000000000E+0000 7.0000000000000000E+0000
|
||||||
|
7.0000000000000000E+0000 1.0000000000000000E+0001
|
||||||
|
6.0000000000000000E+0000 8.0000000000000000E+0000
|
||||||
|
5.0000000000000000E+0000 7.0000000000000000E+0000
|
||||||
|
|
||||||
|
6.0000000000000000E+0000 5.0000000000000000E+0000
|
||||||
|
8.0000000000000000E+0000 7.0000000000000000E+0000
|
||||||
|
1.0000000000000000E+0001 9.0000000000000000E+0000
|
||||||
|
9.0000000000000000E+0000 1.0000000000000000E+0001
|
||||||
|
|
||||||
|
term= 1
|
||||||
|
|
||||||
|
inverse of A =
|
||||||
|
6.8000000000000001E+0001 -4.1000000000000001E+0001
|
||||||
|
-4.1000000000000001E+0001 2.5000000000000000E+0001
|
||||||
|
-1.7000000000000000E+0001 1.0000000000000000E+0001
|
||||||
|
1.0000000000000000E+0001 -6.0000000000000001E+0000
|
||||||
|
|
||||||
|
-1.7000000000000000E+0001 1.0000000000000000E+0001
|
||||||
|
1.0000000000000000E+0001 -6.0000000000000001E+0000
|
||||||
|
5.0000000000000001E+0000 -3.0000000000000000E+0000
|
||||||
|
-3.0000000000000000E+0000 2.0000000000000000E+0000
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
\Precision
|
||||||
|
|
||||||
|
The procedure doesn't supply information about the precision of the
|
||||||
|
operation after termination.
|
||||||
|
|
||||||
|
\Method
|
||||||
|
|
||||||
|
The calculation of the inverse is based on reduction of a symmetrical
|
||||||
|
matrix to a tridiagonal form.
|
||||||
|
|
||||||
|
\References
|
||||||
|
|
||||||
|
Aasen, J. O. \\
|
||||||
|
On the reduction of a symmetric matrix to tridiagonal form. \\
|
||||||
|
BIT, 11, (1971), pag. 223-242.
|
||||||
|
|
||||||
|
\end{procedure}
|
||||||
|
|
||||||
|
\end{document}
|
||||||
|
|
4
packages/extra/numlib/examples/invgenex.dat
Normal file
4
packages/extra/numlib/examples/invgenex.dat
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
4 2 4 1
|
||||||
|
30 20 45 12
|
||||||
|
20 15 36 10
|
||||||
|
35 28 70 20
|
39
packages/extra/numlib/examples/invgenex.pas
Normal file
39
packages/extra/numlib/examples/invgenex.pas
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
{
|
||||||
|
$Id$
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
program invgenex;
|
||||||
|
uses typ, iom, inv;
|
||||||
|
const n = 4;
|
||||||
|
var term : arbint;
|
||||||
|
A : array[1..n,1..n] of arbfloat;
|
||||||
|
begin
|
||||||
|
assign(input, paramstr(1)); reset(input);
|
||||||
|
assign(output, paramstr(2)); rewrite(output);
|
||||||
|
writeln('program results invgenex');
|
||||||
|
{ Read matrix A}
|
||||||
|
iomrem(input, A[1,1], n, n, n);
|
||||||
|
{ Print matrix A }
|
||||||
|
writeln; writeln('A =');
|
||||||
|
iomwrm(output, A[1,1], n, n, n, numdig);
|
||||||
|
{ Calculate inverse of A}
|
||||||
|
invgen(n, n, A[1,1], term);
|
||||||
|
writeln; writeln('term=', term:2);
|
||||||
|
if term=1 then
|
||||||
|
{ Print inverse of matrix A}
|
||||||
|
begin
|
||||||
|
writeln; writeln('inverse of A =');
|
||||||
|
iomwrm(output, A[1,1], n, n, n, numdig);
|
||||||
|
end; {term=1}
|
||||||
|
close(input); close(output)
|
||||||
|
end.
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2004-04-18 14:47:11 marco
|
||||||
|
* initial versions
|
||||||
|
|
||||||
|
|
||||||
|
}
|
4
packages/extra/numlib/examples/invgpdex.dat
Normal file
4
packages/extra/numlib/examples/invgpdex.dat
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
5
|
||||||
|
7 10
|
||||||
|
6 8 10
|
||||||
|
5 7 9 10
|
37
packages/extra/numlib/examples/invgpdex.pas
Normal file
37
packages/extra/numlib/examples/invgpdex.pas
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
{
|
||||||
|
$Id$
|
||||||
|
}
|
||||||
|
|
||||||
|
program invgpdex;
|
||||||
|
uses typ, iom, inv;
|
||||||
|
const n = 4;
|
||||||
|
var i, j, term : ArbInt;
|
||||||
|
A : array[1..n,1..n] of ArbFloat;
|
||||||
|
begin
|
||||||
|
assign(input, paramstr(1)); reset(input);
|
||||||
|
assign(output, paramstr(2)); rewrite(output);
|
||||||
|
writeln('program results invgpdex');
|
||||||
|
{ read bottomleft part of matrix A}
|
||||||
|
for i:=1 to n do iomrev(input, A[i,1], i);
|
||||||
|
{ Print matrix A}
|
||||||
|
writeln; writeln('A =');
|
||||||
|
for i:=1 to n do for j:=1 to i-1 do A[j,i]:=A[i,j];
|
||||||
|
iomwrm(output, A[1,1], n, n, n, numdig);
|
||||||
|
{ Calculate inverse of matrix A}
|
||||||
|
invgpd(n, n, A[1,1], term);
|
||||||
|
writeln; writeln('term=', term:2);
|
||||||
|
if term=1 then
|
||||||
|
{ Print inverse of matrix A}
|
||||||
|
begin
|
||||||
|
writeln; writeln('inverse of A =');
|
||||||
|
iomwrm(output, A[1,1], n, n, n, numdig);
|
||||||
|
end; {term=1}
|
||||||
|
close(input); close(output)
|
||||||
|
end.
|
||||||
|
|
||||||
|
{
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2004-04-18 14:47:11 marco
|
||||||
|
* initial versions
|
||||||
|
|
||||||
|
}
|
4
packages/extra/numlib/examples/invgsyex.dat
Normal file
4
packages/extra/numlib/examples/invgsyex.dat
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
5
|
||||||
|
7 10
|
||||||
|
6 8 10
|
||||||
|
5 7 9 10
|
38
packages/extra/numlib/examples/invgsyex.pas
Normal file
38
packages/extra/numlib/examples/invgsyex.pas
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
{
|
||||||
|
$Id $
|
||||||
|
}
|
||||||
|
|
||||||
|
program invgsyex;
|
||||||
|
uses typ, iom, inv;
|
||||||
|
const n = 4;
|
||||||
|
var i, j, term : ArbInt;
|
||||||
|
A : array[1..n,1..n] of ArbFloat;
|
||||||
|
begin
|
||||||
|
assign(input, paramstr(1)); reset(input);
|
||||||
|
assign(output, paramstr(2)); rewrite(output);
|
||||||
|
writeln('program results invgsyex');
|
||||||
|
{ Read bottomleft part of matrix A }
|
||||||
|
for i:=1 to n do iomrev(input, A[i,1], i);
|
||||||
|
{ print matrix A }
|
||||||
|
writeln; writeln('A =');
|
||||||
|
for i:=1 to n do for j:=1 to i-1 do A[j,i]:=A[i,j];
|
||||||
|
iomwrm(output, A[1,1], n, n, n, numdig);
|
||||||
|
{ calculate inverse of matrix A}
|
||||||
|
invgsy(n, n, A[1,1], term);
|
||||||
|
writeln; writeln('term=', term:2);
|
||||||
|
if term=1 then
|
||||||
|
{ print inverse of matrix A }
|
||||||
|
begin
|
||||||
|
writeln; writeln('inverse of A =');
|
||||||
|
iomwrm(output, A[1,1], n, n, n, numdig);
|
||||||
|
end; {term=1}
|
||||||
|
close(input); close(output)
|
||||||
|
end.
|
||||||
|
|
||||||
|
{
|
||||||
|
$Log$
|
||||||
|
Revision 1.1 2004-04-18 14:47:11 marco
|
||||||
|
* initial versions
|
||||||
|
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user