From: aml Date: Thu, 29 May 2014 12:21:56 +0000 (+0400) Subject: 0024946: Wrong result obtained by Extrema Curve/Curve X-Git-Tag: V6_8_0_beta~285 X-Git-Url: http://git.dev.opencascade.org/gitweb/?p=occt.git;a=commitdiff_plain;h=2fe0e897e3036d083a15ee773acb22ac7b4b88df 0024946: Wrong result obtained by Extrema Curve/Curve Fixes in Extrema Curve/Curve algorithm and in corresponding testcase. Added test case bugs/modalg_5/bug24946 --- diff --git a/src/math/math_GlobOptMin.cxx b/src/math/math_GlobOptMin.cxx index cd52c606f0..0d1b7ce42a 100644 --- a/src/math/math_GlobOptMin.cxx +++ b/src/math/math_GlobOptMin.cxx @@ -152,21 +152,35 @@ void math_GlobOptMin::Perform() myE3 = - maxLength * myTol / 4; // Compure start point. - math_Vector aPnt(1,2); + math_Vector aPnt(1,myN); for(i = 1; i <= myN; i++) { Standard_Real currCentral = (myA(i) + myB(i)) / 2.0; aPnt(i) = currCentral; - myY.Append(currCentral); } myFunc->Value(aPnt, myF); + + math_Vector aExtremumPoint(1,myN); + Standard_Real aExtremumValue = RealLast(); + if (computeLocalExtremum(aPnt, aExtremumValue, aExtremumPoint)) + { + // Local Extremum finds better solution than midpoint. + if (aExtremumValue < myF) + { + myF = aExtremumValue; + aPnt = aExtremumPoint; + } + } + + myY.Clear(); + for(i = 1; i <= myN; i++) + myY.Append(aPnt(i)); mySolCount++; computeGlobalExtremum(myN); myDone = Standard_True; - } //======================================================================= diff --git a/tests/bugs/modalg_5/bug23706_14 b/tests/bugs/modalg_5/bug23706_14 index f27011589b..622b96eed4 100755 --- a/tests/bugs/modalg_5/bug23706_14 +++ b/tests/bugs/modalg_5/bug23706_14 @@ -11,9 +11,9 @@ puts "" set info [2dextrema b9 b10] set status 0 -for { set i 1 } { $i <= 6 } { incr i 1 } { +for { set i 1 } { $i <= 1 } { incr i 1 } { regexp "dist $i: +(\[-0-9.+eE\]+)" $info full pp - if { abs($pp - 4.316921907096100) > 1.0e-7 } { + if { abs($pp - 3.8268201236765877) > 1.0e-7 } { puts "Error : Extrema is wrong on dist $i" set status 1 } diff --git a/tests/bugs/modalg_5/bug24946 b/tests/bugs/modalg_5/bug24946 new file mode 100644 index 0000000000..92da1ba8b3 --- /dev/null +++ b/tests/bugs/modalg_5/bug24946 @@ -0,0 +1,22 @@ +puts "===========" +puts "OCC24946" +puts "===========" +puts "" +###################################################### +# Wrong result obtained by Extrema Curve/Curve +###################################################### + +restore [locate_data_file bug24946_ez5] b1 +restore [locate_data_file bug24946_ez101] b2 + +mkcurve cb1 b1 +mkcurve cb2 b2 + +extrema cb1 cb2 +regexp {The length ext_1 is+ +([-0-9.+eE]+)} [length ext_1] full ll + +if { $ll < 1.0e-7 } { + puts "OK: extrema is good" +} else { + puts "Error: extrema is wrong" +}