From 6cdc33f65d45a89fb5b3110f328ef9e1ed835521 Mon Sep 17 00:00:00 2001 From: Elias Pipping <elias.pipping@fu-berlin.de> Date: Tue, 31 Jul 2012 10:11:52 +0200 Subject: [PATCH] Fix up CircularCurvedFunction::cartesian() --- dune/tectonic/circularconvexfunction.hh | 17 +++++++++++++---- src/test-gradient-sample-steep.cc | 8 ++++---- src/test-gradient-sample-steep2.cc | 8 ++++---- src/test-gradient-sample-verysteep.cc | 8 ++++---- 4 files changed, 25 insertions(+), 16 deletions(-) diff --git a/dune/tectonic/circularconvexfunction.hh b/dune/tectonic/circularconvexfunction.hh index 8e64cc6d..c7fdc547 100644 --- a/dune/tectonic/circularconvexfunction.hh +++ b/dune/tectonic/circularconvexfunction.hh @@ -13,7 +13,13 @@ template <class NonlinearityType> class CircularConvexFunction { CircularConvexFunction(MatrixType const &A, VectorType const &b, NonlinearityType const &phi, VectorType const &x, VectorType const &dir) - : A(A), b(b), phi(phi), x(x), dir(dir) {} + : A(A), + b(b), + phi(phi), + x(x), + dir(dir), + xnorm(x.two_norm()), + dnorm(dir.two_norm()) {} double quadraticPart() const { return 0; } @@ -43,7 +49,7 @@ template <class NonlinearityType> class CircularConvexFunction { void cartesian(double m, VectorType &y) const { y = 0; y.axpy(std::cos(m), x); - y.axpy(std::sin(m), dir); + y.axpy(std::sin(m) * xnorm / dnorm, dir); } private: @@ -53,6 +59,9 @@ template <class NonlinearityType> class CircularConvexFunction { VectorType const &x; VectorType const &dir; + double const dnorm; + double const xnorm; + /* If x and d were normalised, we would have cartesian(a) = cos(a) * x + sin(a) * d and @@ -63,8 +72,8 @@ template <class NonlinearityType> class CircularConvexFunction { */ void tangent(double m, VectorType &y) const { y = 0; - y.axpy(-std::sin(m) * dir.two_norm2(), x); - y.axpy(std::cos(m) * x.two_norm2(), dir); + y.axpy(-std::sin(m) * dnorm, x); + y.axpy(std::cos(m) * xnorm, dir); } }; } diff --git a/src/test-gradient-sample-steep.cc b/src/test-gradient-sample-steep.cc index 42b8a54b..7cca14ab 100644 --- a/src/test-gradient-sample-steep.cc +++ b/src/test-gradient-sample-steep.cc @@ -36,18 +36,18 @@ int main() { start[0] = 0; start[1] = 1; - double const ret1 = functionTester(J, start, 5); + double const ret1 = functionTester(J, start, 3); // Something random start[0] = 279; start[1] = -96; - double const ret2 = functionTester(J, start, 5); - assert(std::abs(ret1 - ret2) < 1e-7); + double const ret2 = functionTester(J, start, 3); + assert(std::abs(ret1 - ret2) < 1e-5); start[0] = 0; start[1] = 0; double const ret3 = functionTester(J, start, 1); - assert(std::abs(ret1 - ret3) < 1e-7); + assert(std::abs(ret1 - ret3) < 1e-5); } diff --git a/src/test-gradient-sample-steep2.cc b/src/test-gradient-sample-steep2.cc index 894cb3ab..d5a40ad4 100644 --- a/src/test-gradient-sample-steep2.cc +++ b/src/test-gradient-sample-steep2.cc @@ -42,12 +42,12 @@ int main() { start[0] = 279; start[1] = -96; - double const ret2 = functionTester(J, start, 5); - assert(std::abs(ret1 - ret2) < 1e-7); + double const ret2 = functionTester(J, start, 3); + assert(std::abs(ret1 - ret2) < 1e-5); start[0] = 0; start[1] = 0; - double const ret3 = functionTester(J, start, 2); - assert(std::abs(ret1 - ret3) < 1e-7); + double const ret3 = functionTester(J, start, 1); + assert(std::abs(ret1 - ret3) < 1e-5); } diff --git a/src/test-gradient-sample-verysteep.cc b/src/test-gradient-sample-verysteep.cc index 2552f6ec..0da5ad9f 100644 --- a/src/test-gradient-sample-verysteep.cc +++ b/src/test-gradient-sample-verysteep.cc @@ -42,12 +42,12 @@ int main() { start[0] = 279; start[1] = -96; - double const ret2 = functionTester(J, start, 5); - assert(std::abs(ret1 - ret2) < 1e-7); + double const ret2 = functionTester(J, start, 4); + assert(std::abs(ret1 - ret2) < 1e-8); start[0] = 0; start[1] = 0; - double const ret3 = functionTester(J, start, 2); - assert(std::abs(ret1 - ret3) < 1e-7); + double const ret3 = functionTester(J, start, 1); + assert(std::abs(ret1 - ret3) < 1e-5); } -- GitLab