summaryrefslogtreecommitdiff
path: root/src/FairCurve/FairCurve_Newton.cxx
blob: 9c8249b0490a3c4034c6b361391192488922ee7e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// File:	FairCurve_Newton.cxx
// Created:	Fri Oct 11 10:18:04 1996
// Author:	Philippe MANGIN
//		<pmn@sgi29>


#include <FairCurve_Newton.ixx>

FairCurve_Newton::FairCurve_Newton(math_MultipleVarFunctionWithHessian& F, 
				   const math_Vector& StartingPoint, 
				   const Standard_Real SpatialTolerance, 
				   const Standard_Real CriteriumTolerance, 
				   const Standard_Integer NbIterations, 
				   const Standard_Real Convexity, 
				   const Standard_Boolean WithSingularity)
                            :math_NewtonMinimum(F, StartingPoint, CriteriumTolerance,
						NbIterations, Convexity, WithSingularity),
			     mySpTol(SpatialTolerance)
						  
{
// Attention cette ecriture est bancale car FairCurve_Newton::IsConverged() n'est pas
// pas utiliser dans le constructeur de NewtonMinimum !!
}

FairCurve_Newton::FairCurve_Newton(math_MultipleVarFunctionWithHessian& F,
				   const Standard_Real SpatialTolerance, 
				   const Standard_Real CriteriumTolerance, 
				   const Standard_Integer NbIterations, 
				   const Standard_Real Convexity, 
				   const Standard_Boolean WithSingularity)
                            :math_NewtonMinimum(F, CriteriumTolerance,
						NbIterations, Convexity, WithSingularity),
			     mySpTol(SpatialTolerance)
						  
{
// C'est beaucoup mieux
}

Standard_Boolean FairCurve_Newton::IsConverged() const
// On converge si le pas est tres petits
// ou si le critere progresse peu avec un pas raisonnable, cette derniere exigence
// permetant de detecter les glissements infinis, 
// (cas ou le critere varie tres lentement).
{
  Standard_Real N = TheStep.Norm();
  return ( (N <= mySpTol/100 ) || 
	   ( Abs(TheMinimum-PreviousMinimum) <= XTol*Abs(PreviousMinimum)
           && N<=mySpTol) );  
}