2 #define No_Standard_RangeError
3 #define No_Standard_OutOfRange
4 #define No_Standard_DimensionError
7 #include <StdFail_NotDone.hxx>
8 #include <Standard_RangeError.hxx>
9 #include <math_DirectPolynomialRoots.hxx>
10 #include <math_FunctionRoots.ixx>
11 #include <math_FunctionWithDerivative.hxx>
12 #include <TColStd_Array1OfReal.hxx>
23 static Standard_Boolean myDebug = 0;
24 static Standard_Integer nbsolve = 0;
27 static void AppendRoot(TColStd_SequenceOfReal& Sol,
28 TColStd_SequenceOfInteger& NbStateSol,
29 const Standard_Real X,
30 math_FunctionWithDerivative& F,
31 // const Standard_Real K,
33 const Standard_Real dX) {
35 Standard_Integer n=Sol.Length();
39 cout << " Ajout de la solution numero : " << n+1 << endl;
40 cout << " Valeur de la racine :" << X << endl;
47 NbStateSol.Append(F.GetStateNumber());
51 Standard_Integer pl=n+1;
67 NbStateSol.Append(F.GetStateNumber());
70 Sol.InsertBefore(pl,X);
72 NbStateSol.InsertBefore(pl,F.GetStateNumber());
77 static void Solve(math_FunctionWithDerivative& F,
78 const Standard_Real K,
79 const Standard_Real x1,
80 const Standard_Real y1,
81 const Standard_Real x2,
82 const Standard_Real y2,
83 const Standard_Real tol,
84 const Standard_Real dX,
85 TColStd_SequenceOfReal& Sol,
86 TColStd_SequenceOfInteger& NbStateSol) {
89 cout <<"--> Resolution :" << ++nbsolve << endl;
90 cout <<" x1 =" << x1 << " y1 =" << y1 << endl;
91 cout <<" x2 =" << x2 << " y2 =" << y2 << endl;
95 Standard_Integer iter=0;
96 Standard_Real tols2 = 0.5*tol;
97 Standard_Real a,b,c,d=0,e=0,fa,fb,fc,p,q,r,s,tol1,xm,min1,min2;
98 a=x1;b=c=x2;fa=y1; fb=fc=y2;
99 for(iter=1;iter<=ITMAX;iter++) {
100 if((fb>0.0 && fc>0.0) || (fb<0.0 && fc<0.0)) {
103 if(Abs(fc)<Abs(fb)) {
104 a=b; b=c; c=a; fa=fb; fb=fc; fc=fa;
106 tol1 = EPSEPS*Abs(b)+tols2;
108 if(Abs(xm)<tol1 || fb==0) {
109 //-- On tente une iteration de newton
110 Standard_Real Xp,Yp,Dp;
111 Standard_Integer itern=5;
115 Ok = F.Values(Xp,Yp,Dp);
118 if(Dp>1e-10 || Dp<-1e-10) {
121 if(Xp<=x2 && Xp>=x1) {
122 F.Value(Xp,Yp); Yp-=K;
123 if(Abs(Yp)<Abs(fb)) {
131 while(Ok && --itern>=0);
133 AppendRoot(Sol,NbStateSol,b,F,K,dX);
136 if(Abs(e)>=tol1 && Abs(fa)>Abs(fb)) {
145 p=s*((xm+xm)*q*(q-r)-(b-a)*(r-1.0));
146 q=(q-1.0)*(r-1.0)*(s-1.0);
152 min1=3.0*xm*q-Abs(tol1*q);
154 if((p+p)<( (min1<min2) ? min1 : min2)) {
173 if(xm>=0) b+=Abs(tol1);
180 cout<<" Non Convergence dans math_FunctionRoots.cxx "<<endl;
187 TColStd_SequenceOfReal StaticSol;
191 math_FunctionRoots::math_FunctionRoots(math_FunctionWithDerivative& F,
192 const Standard_Real A,
193 const Standard_Real B,
194 const Standard_Integer NbSample,
195 const Standard_Real _EpsX,
196 const Standard_Real EpsF,
197 const Standard_Real EpsNull,
198 const Standard_Real K )
202 cout << "---- Debut de math_FunctionRoots ----" << endl;
207 static Standard_Integer methode = 1; //-- 1:(Nv Traitement) 3:(Nv + Ancien +check) 2:(Ancien)
211 Done = Standard_True;
214 Standard_Integer N=NbSample;
215 //-- ------------------------------------------------------------
216 //-- Verifications de bas niveau
225 //-- On teste si EpsX est trop petit (ie : U+Nn*EpsX == U )
226 Standard_Real EpsX = _EpsX;
227 Standard_Real DeltaU = Abs(X0)+Abs(XN);
228 Standard_Real NEpsX = 0.0000000001 * DeltaU;
233 //-- recherche d un intervalle ou F(xi) et F(xj) sont de signes differents
234 //-- A .............................................................. B
235 //-- X0 X1 X2 ........................................ Xn-1 Xn
239 double dx = (XN-X0)/N;
240 TColStd_Array1OfReal ptrval(0, N);
241 Standard_Integer Nvalid = -1;
242 Standard_Real aux = 0;
243 for(i=0; i<=N ; i++,X+=dx) {
246 if(Ok) ptrval(++Nvalid) = aux - K;
249 //-- Toute la fonction est nulle ?
252 Done = Standard_False;
256 AllNull=Standard_True;
257 // for(i=0;AllNull && i<=N;i++) {
258 for(i=0;AllNull && i<=N;i++) {
259 if(ptrval(i)>EpsNull || ptrval(i)<-EpsNull) {
260 AllNull=Standard_False;
264 //-- tous les points echantillons sont dans la tolerance
268 //-- Il y a des points hors tolerance
269 //-- on detecte les changements de signes STRICTS
270 Standard_Integer ip1;
271 // Standard_Boolean chgtsign=Standard_False;
272 Standard_Real tol = EpsX;
274 for(i=0,ip1=1,X=X0;i<N; i++,ip1++,X+=dx) {
278 if(ptrval(ip1)>0.0) {
279 //-- --------------------------------------------------
280 //-- changement de signe dans Xi Xi+1
281 Solve(F,K,X,ptrval(i),X2,ptrval(ip1),tol,NEpsX,Sol,NbStateSol);
285 if(ptrval(ip1)<0.0) {
286 //-- --------------------------------------------------
287 //-- changement de signe dans Xi Xi+1
288 Solve(F,K,X,ptrval(i),X2,ptrval(ip1),tol,NEpsX,Sol,NbStateSol);
292 //-- On detecte les cas ou la fct s annule sur des Xi et est
293 //-- non nulle au voisinage de Xi
295 //-- On prend 2 points u0,u1 au voisinage de Xi
296 //-- Si (F(u0)-K)*(F(u1)-K) <0 on lance une recherche
297 //-- Sinon si (F(u0)-K)*(F(u1)-K) !=0 on insere le point X
298 for(i=0; i<=N; i++) {
300 // Standard_Real Val,Deriv;
304 u0=dx*0.5; u1=X+u0; u0+=X;
311 F.Value(u0,y0); y0-=K;
312 F.Value(u1,y1); y1-=K;
314 Solve(F,K,u0,y0,u1,y1,tol,NEpsX,Sol,NbStateSol);
317 if(y0!=0.0 || y1!=0.0) {
318 AppendRoot(Sol,NbStateSol,X,F,K,NEpsX);
323 //-- --------------------------------------------------------------------------------
324 //-- Il faut traiter differement le cas des points en bout :
325 if(ptrval(0)<=EpsF && ptrval(0)>=-EpsF) {
326 AppendRoot(Sol,NbStateSol,X0,F,K,NEpsX);
328 if(ptrval(N)<=EpsF && ptrval(N)>=-EpsF) {
329 AppendRoot(Sol,NbStateSol,XN,F,K,NEpsX);
332 //-- --------------------------------------------------------------------------------
333 //-- --------------------------------------------------------------------------------
334 //-- On detecte les zones ou on a sur les points echantillons un minimum avec f(x)>0
335 //-- un maximum avec f(x)<0
336 //-- On reprend une discretisation plus fine au voisinage de ces extremums
338 //-- Recherche d un minima positif
339 Standard_Real xm,ym,dym,xm1,xp1;
340 Standard_Real majdx = 5.0*dx;
341 Standard_Boolean Rediscr;
342 // Standard_Real ptrvalbis[MAXBIS];
343 Standard_Integer im1=0;
345 for(i=1,xm=X0+dx; i<N; xm+=dx,i++,im1++,ip1++) {
346 Rediscr = Standard_False;
349 if((ptrval(im1)>ptrval(i)) && (ptrval(ip1)>ptrval(i))) {
350 //-- Peut on traverser l axe Ox
351 //-- -------------- Estimation a partir de Xim1
354 F.Values(xm1,ym,dym); ym-=K;
355 if(dym<-1e-10 || dym>1e-10) { // normalement dym < 0
356 Standard_Real t = ym / dym; //-- t=xm-x* = (ym-0)/dym
357 if(t<majdx && t > -majdx) {
358 Rediscr = Standard_True;
361 //-- -------------- Estimation a partir de Xip1
362 if(Rediscr==Standard_False) {
364 if(xp1 > XN ) xp1=XN;
365 F.Values(xp1,ym,dym); ym-=K;
366 if(dym<-1e-10 || dym>1e-10) { // normalement dym > 0
367 Standard_Real t = ym / dym; //-- t=xm-x* = (ym-0)/dym
368 if(t<majdx && t > -majdx) {
369 Rediscr = Standard_True;
375 else if(ptrval(i)<0.0) {
376 if((ptrval(im1)<ptrval(i)) && (ptrval(ip1)<ptrval(i))) {
377 //-- Peut on traverser l axe Ox
378 //-- -------------- Estimation a partir de Xim1
381 F.Values(xm1,ym,dym); ym-=K;
382 if(dym>1e-10 || dym<-1e-10) { // normalement dym > 0
383 Standard_Real t = ym / dym; //-- t=xm-x* = (ym-0)/dym
384 if(t<majdx && t > -majdx) {
385 Rediscr = Standard_True;
388 //-- -------------- Estimation a partir de Xim1
389 if(Rediscr==Standard_False) {
392 F.Values(xm1,ym,dym); ym-=K;
393 if(dym>1e-10 || dym<-1e-10) { // normalement dym < 0
394 Standard_Real t = ym / dym; //-- t=xm-x* = (ym-0)/dym
395 if(t<majdx && t > -majdx) {
396 Rediscr = Standard_True;
403 //-- --------------------------------------------------
404 //-- On recherche un extrema entre x0 et x3
405 //-- x1 et x2 sont tels que x0<x1<x2<x3
406 //-- et |f(x0)| > |f(x1)| et |f(x3)| > |f(x2)|
408 //-- En entree : a=xm-dx b=xm c=xm+dx
409 Standard_Real x0,x1,x2,x3,f0,f3;
410 Standard_Real R=0.61803399;
411 Standard_Real C=1.0-R;
412 Standard_Real tolCR=NEpsX*10.0;
419 Standard_Boolean recherche_minimum = (f0>0.0);
421 if(Abs(x3-xm) > Abs(x0-xm)) { x1=xm; x2=xm+C*(x3-xm); }
422 else { x2=xm; x1=xm-C*(xm-x0); }
424 F.Value(x1,f1); f1-=K;
425 F.Value(x2,f2); f2-=K;
426 //-- printf("\n *************** RECHERCHE MINIMUM **********\n");
427 while(Abs(x3-x0) > tolCR*(Abs(x1)+Abs(x2)) && (Abs(x1 -x2) > 0)) {
428 //-- printf("\n (%10.5g,%10.5g) (%10.5g,%10.5g) (%10.5g,%10.5g) (%10.5g,%10.5g) ",
429 //-- x0,f0,x1,f1,x2,f2,x3,f3);
430 if(recherche_minimum) {
432 x0=x1; x1=x2; x2=R*x1+C*x3;
433 f0=f1; f1=f2; F.Value(x2,f2); f2-=K;
436 x3=x2; x2=x1; x1=R*x2+C*x0;
437 f3=f2; f2=f1; F.Value(x1,f1); f1-=K;
442 x0=x1; x1=x2; x2=R*x1+C*x3;
443 f0=f1; f1=f2; F.Value(x2,f2); f2-=K;
446 x3=x2; x2=x1; x1=R*x2+C*x0;
447 f3=f2; f2=f1; F.Value(x1,f1); f1-=K;
450 //-- On ne fait pas que chercher des extremas. Il faut verifier
451 //-- si on ne tombe pas sur une racine
453 //-- printf("\n Recherche entre (%10.5g,%10.5g) (%10.5g,%10.5g) ",x0,f0,x1,f1);
454 Solve(F,K,x0,f0,x1,f1,tol,NEpsX,Sol,NbStateSol);
457 //-- printf("\n Recherche entre (%10.5g,%10.5g) (%10.5g,%10.5g) ",x2,f2,x3,f3);
458 Solve(F,K,x2,f2,x3,f3,tol,NEpsX,Sol,NbStateSol);
462 //-- x1,f(x1) minimum
464 AppendRoot(Sol,NbStateSol,x1,F,K,NEpsX);
468 //-- x2.f(x2) minimum
470 AppendRoot(Sol,NbStateSol,x2,F,K,NEpsX);
473 } //-- Recherche d un extrema
480 Standard_Integer n=Sol.Length();
481 for(Standard_Integer ii=1;ii<=n;ii++) {
482 StaticSol.Append(Sol.Value(ii));
490 //-- ********************************************************************************
491 //-- ANCIEN TRAITEMENT
492 //-- ********************************************************************************
495 // calculate all the real roots of a function within the range
496 // A..B. whitout condition on A and B
497 // a solution X is found when
498 // abs(Xi - Xi-1) <= EpsX and abs(F(Xi)-K) <= Epsf.
499 // The function is considered as null between A and B if
500 // abs(F-K) <= EpsNull within this range.
501 Standard_Real EpsX = _EpsX; //-- Cas ou le parametre va de 100000000 a 1000000001
502 //-- Il ne faut pas EpsX = 0.000...001 car dans ce cas
503 //-- U + Nn*EpsX == U
504 Standard_Real Lowr,Upp;
505 Standard_Real Increment;
507 Standard_Real FLowr,FUpp,DFLowr,DFUpp;
509 Standard_Real Fxu,DFxu,FFxu,DFFxu;
510 Standard_Real Fyu,DFyu,FFyu,DFFyu;
511 Standard_Boolean Finish;
513 Standard_Integer Nbiter = 30;
514 Standard_Integer Iter;
515 Standard_Real Ambda,T;
516 Standard_Real AA,BB,CC;
518 Standard_Real Alfa1=0,Alfa2;
519 Standard_Real OldDF = RealLast();
520 Standard_Real Standard_Underflow = 1e-32 ; //-- RealSmall();
523 Done = Standard_False;
525 StdFail_NotDone_Raise_if(NbSample <= 0, " ");
538 Increment = (Upp-Lowr)/NbSample;
539 StdFail_NotDone_Raise_if(Increment < EpsX, " ");
540 Done = Standard_True;
541 //-- On teste si EpsX est trop petit (ie : U+Nn*EpsX == U )
542 Standard_Real DeltaU = Abs(Upp)+Abs(Lowr);
543 Standard_Real NEpsX = 0.0000000001 * DeltaU;
546 //-- cout<<" \n EpsX Init = "<<_EpsX<<" devient : (deltaU : "<<DeltaU<<" ) EpsX = "<<EpsX<<endl;
549 Null2 = EpsNull*EpsNull;
551 Ok = F.Values(Lowr,FLowr,DFLowr);
554 Done = Standard_False;
560 Ok = F.Values(Upp,FUpp,DFUpp);
563 Done = Standard_False;
572 Fyu = FLowr-EpsX*DFLowr; // extrapolation lineaire
575 DFFyu = Fyu*DFyu; DFFyu+=DFFyu;
576 AllNull = ( FFyu <= Null2 );
588 Fyu = FLowr + (U-Lowr)*DFLowr;
592 Fyu = FUpp + (U-Upp)*DFUpp;
596 Ok = F.Values(U,Fyu,DFyu);
599 Done = Standard_False;
606 DFFyu = Fyu*DFyu; DFFyu+=DFFyu; //-- DFFyu = 2.*Fyu*DFyu;
608 if ( !AllNull || ( FFyu > Null2 && U <= Upp) ){
610 if (AllNull) { //rechercher les vraix zeros depuis le debut
612 AllNull = Standard_False;
614 Fxu = FLowr-EpsX*DFLowr;
617 DFFxu = Fxu*DFxu; DFFxu+=DFFxu; //-- DFFxu = 2.*Fxu*DFxu;
619 Ok = F.Values(U,Fyu,DFyu);
622 Done = Standard_False;
628 DFFyu = Fyu*DFyu; DFFyu+=DFFyu;//-- DFFyu = 2.*Fyu*DFyu;
630 Standard_Real FxuFyu=Fxu*Fyu;
632 if ( (DFFyu > 0. && DFFxu <= 0.)
633 || (DFFyu < 0. && FFyu >= FFxu && DFFxu <= 0.)
634 || (DFFyu > 0. && FFyu <= FFxu && DFFxu >= 0.)
635 || (FxuFyu <= 0.) ) {
636 // recherche d 1 minimun possible
637 Finish = Standard_False;
644 // chercher si f peut s annuler pour eviter
645 // des iterations inutiles
646 if ( Fxu*(Fxu + 2.*DFxu*Increment) > 0. &&
647 Fyu*(Fyu - 2.*DFyu*Increment) > 0. ) {
649 Finish = Standard_True;
650 FFi = Min ( FFxu , FFyu); //pour ne pas recalculer yu
652 else if ((DFFxu <= Standard_Underflow && -DFFxu <= Standard_Underflow) ||
653 (FFxu <= Standard_Underflow && -FFxu <= Standard_Underflow)) {
655 Finish = Standard_True;
657 FFi = FFyu; // pour recalculer yu
659 else if ((DFFyu <= Standard_Underflow && -DFFyu <= Standard_Underflow) ||
660 (FFyu <= Standard_Underflow && -FFyu <= Standard_Underflow)) {
662 Finish = Standard_True;
664 FFi = FFxu; // pour recalculer U
667 else if (FFxu <= Standard_Underflow && -FFxu <= Standard_Underflow) {
669 Finish = Standard_True;
673 else if (FFyu <= Standard_Underflow && -FFyu <= Standard_Underflow) {
675 Finish = Standard_True;
681 // calcul des 2 solutions annulant la derivee de l interpolation cubique
682 // Ambda*t=(U-Xu) F(t)=aa*t*t*t/3+bb*t*t+cc*t+d
683 // df=aa*t*t+2*bb*t+cc
685 AA = 3.*(Ambda*(DFFxu+DFFyu)+2.*(FFxu-FFyu));
686 BB = -2*(Ambda*(DFFyu+2.*DFFxu)+3.*(FFxu-FFyu));
689 if(Abs(AA)<1e-14 && Abs(BB)<1e-14 && Abs(CC)<1e-14) {
694 math_DirectPolynomialRoots Solv(AA,BB,CC);
695 if ( !Solv.InfiniteRoots() ) {
696 Nn=Solv.NbSolutions();
698 if (Fxu*Fyu < 0.) { Alfa1 = 0.5;}
699 else Finish = Standard_True;
702 Alfa1 = Solv.Value(1);
704 Alfa2 = Solv.Value(2);
710 if (Alfa1 > 1. || Alfa2 < 0.){
711 // resolution par dichotomie
712 if (Fxu*Fyu < 0.) Alfa1 = 0.5;
713 else Finish = Standard_True;
715 else if ( Alfa1 < 0. ||
716 ( DFFxu > 0. && DFFyu >= 0.) ) {
718 //(cas changement de signe de la distance signee sans
719 // changement de signe de la derivee:
720 //cas de 'presque'tangence avec 2
721 // solutions proches) ,on prend la plus grane racine
723 if (Fxu*Fyu < 0.) Alfa1 = 0.5;
724 else Finish = Standard_True;
731 else if (Fxu*Fyu < -1e-14) Alfa1 = 0.5;
732 //-- else if (Fxu*Fyu < 0.) Alfa1 = 0.5;
733 else Finish = Standard_True;
736 // petits tests pour diminuer le nombre d iterations
737 if (Alfa1 <= EpsX ) {
740 else if (Alfa1 >= (1.-EpsX) ) {
741 Alfa1 = Alfa1+Alfa1-1.;
743 Alfa1 = Ambda*(1. - Alfa1);
746 AA = FLowr + (U - Lowr)*DFLowr;
749 else if ( U >= Upp ) {
750 AA = FUpp + (U - Upp)*DFUpp;
754 Ok = F.Values(U,AA,BB);
757 Done = Standard_False;
765 if ( ( ( CC < 0. && FFi < FFxu ) || DFFxu > 0.)
772 if (Alfa1 > Ambda*0.5) {
774 // determination d 1 autre borne pour diviser
775 //le nouvel intervalle par 2 au -
778 AA = FLowr + (Xu - Lowr)*DFLowr;
781 else if ( Xu >= Upp ) {
782 AA = FUpp + (Xu - Upp)*DFUpp;
786 Ok = F.Values(Xu,AA,BB);
789 Done = Standard_False;
797 if ( (( CC >= 0. || FFi >= FFxu ) && DFFxu <0.)
806 else if ( AA*Fyu < 0. && AA*Fxu >0.) {
807 // changement de signe sur l intervalle u,U
812 FFi = Min(FFxu,FFyu);
817 else { Ambda = Alfa1;}
819 else { Ambda = Alfa1;}
826 if ( (Ambda-Alfa1) > Ambda*0.5 ) {
828 Xu = U - (Ambda-Alfa1)*0.5;
830 AA = FLowr + (Xu - Lowr)*DFLowr;
833 else if ( Xu >= Upp ) {
834 AA = FUpp + (Xu - Upp)*DFUpp;
838 Ok = F.Values(Xu,AA,BB);
841 Done = Standard_False;
849 if ( AA*Fyu <=0. && AA*Fxu > 0.) {
854 Ambda = ( Ambda - Alfa1 )*0.5;
857 else if ( AA*Fxu < 0. && AA*Fyu > 0.) {
862 Ambda = ( Ambda - Alfa1 )*0.5;
864 FFi = Min(FFxu , FFyu);
869 Ambda = Ambda - Alfa1;
874 Ambda = Ambda - Alfa1;
878 if (Abs(FFxu) <= Standard_Underflow ||
879 (Abs(DFFxu) <= Standard_Underflow && Fxu*Fyu > 0.)
881 Finish = Standard_True;
882 if (Abs(FFxu) <= Standard_Underflow ) {FFxu =0.0;}
885 else if (Abs(FFyu) <= Standard_Underflow ||
886 (Abs(DFFyu) <= Standard_Underflow && Fxu*Fyu > 0.)
888 Finish = Standard_True;
889 if (Abs(FFyu) <= Standard_Underflow ) {FFyu =0.0;}
894 Finish = Iter >= Nbiter || (Ambda <= EpsX &&
895 ( Fxu*Fyu >= 0. || FFi <= EpsF*EpsF));
898 } // fin interpolation cubique
900 // restitution du meilleur resultat
902 if ( FFxu < FFi ) { U = U + T -Ambda;}
903 else if ( FFyu < FFi ) { U = U + T;}
905 if ( U >= (Lowr -EpsX) && U <= (Upp + EpsX) ) {
906 U = Max( Lowr , Min( U , Upp));
909 if ( Abs(FFi) < EpsF ) {
911 if (Abs(Fxu) <= Standard_Underflow) { AA = DFxu;}
912 else if (Abs(Fyu) <= Standard_Underflow) { AA = DFyu;}
913 else if (Fxu*Fyu > 0.) { AA = 0.;}
914 else { AA = Fyu-Fxu;}
915 if (!Sol.IsEmpty()) {
916 if (Abs(Sol.Last() - U) > 5.*EpsX
919 NbStateSol.Append(F.GetStateNumber());
924 NbStateSol.Append(F.GetStateNumber());
932 while ( Nn < 1000000 && DFFyu <= 0.) {
933 // on repart d 1 pouyem plus loin
936 AA = FLowr + (U - Lowr)*DFLowr;
939 else if ( U >= Upp ) {
940 AA = FUpp + (U - Upp)*DFUpp;
944 Ok = F.Values(U,AA,BB);
964 Standard_Integer n1=StaticSol.Length();
965 Standard_Integer n2=Sol.Length();
967 printf("\n mathFunctionRoots : n1=%d n2=%d EpsF=%g EpsX=%g\n",n1,n2,EpsF,NEpsX);
968 for(Standard_Integer x1=1; x1<=n1;x1++) {
969 Standard_Real v; F.Value(StaticSol(x1),v); v-=K;
970 printf(" (%+13.8g:%+13.8g) ",StaticSol(x1),v);
973 for(Standard_Integer x2=1; x2<=n2; x2++) {
974 Standard_Real v; F.Value(Sol(x2),v); v-=K;
975 printf(" (%+13.8g:%+13.8g) ",Sol(x2),v);
979 Standard_Integer n=n1;
981 for(Standard_Integer i=1;i<=n;i++) {
982 Standard_Real t = Sol(i)-StaticSol(i);
994 printf("\n mathFunctionRoots : i:%d/%d delta: %g",i,n,t);
1003 void math_FunctionRoots::Dump(Standard_OStream& o) const
1006 o << "math_FunctionRoots ";
1008 o << " Status = Done \n";
1009 o << " Number of solutions = " << Sol.Length() << endl;
1010 for (Standard_Integer i = 1; i <= Sol.Length(); i++) {
1011 o << " Solution Number " << i << "= " << Sol.Value(i) << endl;
1015 o<< " Status = not Done \n";