0024946: Wrong result obtained by Extrema Curve/Curve
authoraml <aml@opencascade.com>
Thu, 29 May 2014 12:21:56 +0000 (16:21 +0400)
committerapn <apn@opencascade.com>
Thu, 29 May 2014 12:23:18 +0000 (16:23 +0400)
Fixes in Extrema Curve/Curve algorithm and in corresponding testcase.
Added test case bugs/modalg_5/bug24946

src/math/math_GlobOptMin.cxx
tests/bugs/modalg_5/bug23706_14
tests/bugs/modalg_5/bug24946 [new file with mode: 0644]

index cd52c60..0d1b7ce 100644 (file)
@@ -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;
-
 }
 
 //=======================================================================
index f270115..622b96e 100755 (executable)
@@ -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 (file)
index 0000000..92da1ba
--- /dev/null
@@ -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"
+}