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) );
}
|