1 // Created on: 1991-08-22
2 // Created by: Laurent PAINNOT
3 // Copyright (c) 1991-1999 Matra Datavision
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
20 #include <Standard.hxx>
21 #include <Standard_DefineAlloc.hxx>
22 #include <Standard_Handle.hxx>
24 #include <math_Vector.hxx>
25 #include <math_Matrix.hxx>
26 #include <Standard_Integer.hxx>
27 #include <Standard_Boolean.hxx>
28 #include <Standard_Real.hxx>
29 #include <Standard_OStream.hxx>
30 class StdFail_NotDone;
31 class Standard_ConstructionError;
32 class math_Matrix;
35 //! This class implements a system resolution C*X = B with
36 //! an approach solution X0. There are no conditions on the
37 //! number of equations. The algorithm used is the Uzawa
38 //! algorithm. It is possible to have equal or inequal  (<)
39 //! equations to solve. The resolution is done with a
40 //! minimization of Norm(X-X0).
41 //! If there are only equal equations, the resolution is directly
42 //! done and is similar to Gauss resolution with an optimisation
43 //! because the matrix is a symmetric matrix.
44 //! (The resolution is done with Crout algorithm)
45 class math_Uzawa
46 {
47 public:
49   DEFINE_STANDARD_ALLOC
52   //! Given an input matrix Cont, two input vectors Secont
53   //! and StartingPoint, it solves Cont*X = Secont (only
54   //! = equations) with a minimization of Norme(X-X0).
55   //! The maximum iterations number allowed is fixed to
56   //! NbIterations.
57   //! The tolerance EpsLic is fixed for the dual variable
58   //! convergence. The tolerance EpsLix is used for the
59   //! convergence of X.
60   //! Exception ConstuctionError is raised if the line number
61   //! of Cont is different from the length of Secont.
62   Standard_EXPORT math_Uzawa(const math_Matrix& Cont, const math_Vector& Secont, const math_Vector& StartingPoint, const Standard_Real EpsLix = 1.0e-06, const Standard_Real EpsLic = 1.0e-06, const Standard_Integer NbIterations = 500);
64   //! Given an input matrix Cont, two input vectors Secont
65   //! and StartingPoint, it solves Cont*X = Secont (the Nce
66   //! first equations are equal equations and the Nci last
67   //! equations are inequalities <) with a minimization
68   //! of Norme(X-X0).
69   //! The maximum iterations number allowed is fixed to
70   //! NbIterations.
71   //! The tolerance EpsLic is fixed for the dual variable
72   //! convergence. The tolerance EpsLix is used for the
73   //! convergence of X.
74   //! There are no conditions on Nce and Nci.
75   //! Exception ConstuctionError is raised if the line number
76   //! of Cont is different from the length of Secont and from
77   //! Nce + Nci.
78   Standard_EXPORT math_Uzawa(const math_Matrix& Cont, const math_Vector& Secont, const math_Vector& StartingPoint, const Standard_Integer Nci, const Standard_Integer Nce, const Standard_Real EpsLix = 1.0e-06, const Standard_Real EpsLic = 1.0e-06, const Standard_Integer NbIterations = 500);
80   //! Returns true if the computations are successful, otherwise returns false.
81     Standard_Boolean IsDone() const;
83   //! Returns the vector solution of the system above.
84   //! An exception is raised if NotDone.
85     const math_Vector& Value() const;
87   //! Returns the initial error Cont*StartingPoint-Secont.
88   //! An exception is raised if NotDone.
89     const math_Vector& InitialError() const;
91   //! returns the duale variables V of the systeme.
92   Standard_EXPORT void Duale (math_Vector& V) const;
94   //! Returns the difference between X solution and the
95   //! StartingPoint.
96   //! An exception is raised if NotDone.
97     const math_Vector& Error() const;
99   //! returns the number of iterations really done.
100   //! An exception is raised if NotDone.
101     Standard_Integer NbIterations() const;
103   //! returns the inverse matrix of (C * Transposed(C)).
104   //! This result is needed for the computation of the gradient
105   //! when approximating a curve.
106     const math_Matrix& InverseCont() const;
108   //! Prints information on the current state of the object.
109   Standard_EXPORT void Dump (Standard_OStream& o) const;
114 protected:
117   //! Is used internally by the two constructors above.
118   Standard_EXPORT void Perform (const math_Matrix& Cont, const math_Vector& Secont, const math_Vector& StartingPoint, const Standard_Integer Nci, const Standard_Integer Nce, const Standard_Real EpsLix = 1.0e-06, const Standard_Real EpsLic = 1.0e-06, const Standard_Integer NbIterations = 500);
123 private:
127   math_Vector Resul;
128   math_Vector Erruza;
129   math_Vector Errinit;
130   math_Vector Vardua;
131   math_Matrix CTCinv;
132   Standard_Integer NbIter;
133   Standard_Boolean Done;
136 };
139 #include <math_Uzawa.lxx>