From 8f7cbb67f9ece996824991a06be265e553c8bfe5 Mon Sep 17 00:00:00 2001 From: Elias Pipping <elias.pipping@fu-berlin.de> Date: Mon, 6 Aug 2012 15:59:25 +0200 Subject: [PATCH] Fix: No descent if the gradient is too small At least for the tangential descent, a gradient of magnitude 1e-16 causes problems. Test included --- dune/tectonic/minimisation.hh | 2 +- src/test-gradient-sample-steep.cc | 2 +- src/test-gradient-sample-steep2.cc | 2 +- src/test-gradient-sample-verysteep.cc | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dune/tectonic/minimisation.hh b/dune/tectonic/minimisation.hh index 5407fc3f..92eb9c0b 100644 --- a/dune/tectonic/minimisation.hh +++ b/dune/tectonic/minimisation.hh @@ -104,7 +104,7 @@ void minimise(Functional const &J, typename Functional::SmallVector &x, SmallVector descDir; bool const linesearchp = J.descentDirection(x, descDir); - if (descDir == SmallVector(0.0)) + if (descDir.two_norm() < 1e-14) // TODO: Make controllable return; if (linesearchp) { diff --git a/src/test-gradient-sample-steep.cc b/src/test-gradient-sample-steep.cc index 6b39276f..9e7350bd 100644 --- a/src/test-gradient-sample-steep.cc +++ b/src/test-gradient-sample-steep.cc @@ -20,7 +20,7 @@ int main() { typedef Functional::SmallVector SmallVector; SmallMatrix const A = { { 1, 0 }, { 0, 1 } }; - SmallVector const b = { 1, 2 }; + SmallVector const b = { 1, 2.5 }; auto const f = Dune::make_shared<Dune::SampleFunction<2> const>(); auto const phi = Dune::make_shared<Functional::NonlinearityType const>(f); diff --git a/src/test-gradient-sample-steep2.cc b/src/test-gradient-sample-steep2.cc index 6f27d54d..30a8507e 100644 --- a/src/test-gradient-sample-steep2.cc +++ b/src/test-gradient-sample-steep2.cc @@ -29,7 +29,7 @@ int main() { double ret1; { SmallVector start = { 0, 1 }; - ret1 = functionTester(J, start, 1); + ret1 = functionTester(J, start, 2); } double ret2; diff --git a/src/test-gradient-sample-verysteep.cc b/src/test-gradient-sample-verysteep.cc index 78e1ec89..86b3f2c8 100644 --- a/src/test-gradient-sample-verysteep.cc +++ b/src/test-gradient-sample-verysteep.cc @@ -29,7 +29,7 @@ int main() { double ret1; { SmallVector start = { 0, 1 }; - ret1 = functionTester(J, start, 1); + ret1 = functionTester(J, start, 2); } double ret2; -- GitLab