From 0d2b82900bbd68fea9c5f47f4c7deb8293f89352 Mon Sep 17 00:00:00 2001 From: Oliver Sander <sander@igpm.rwth-aachen.de> Date: Thu, 11 Feb 2010 21:39:32 +0000 Subject: [PATCH] rewrite the gradient assembler such as to demand the derivative of the _squared_ distance from the target space. Unlike the distance itself, the squared distance is differentiable at zero [[Imported from SVN: r5546]] --- src/averagedistanceassembler.hh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/averagedistanceassembler.hh b/src/averagedistanceassembler.hh index 17f9c3ee..0f62f984 100644 --- a/src/averagedistanceassembler.hh +++ b/src/averagedistanceassembler.hh @@ -33,9 +33,16 @@ public: typename TargetSpace::EmbeddedTangentVector& gradient) const { gradient = 0; +#if 0 // This old code uses the derivative of dist(,), which is (frequently, at least) + // not differentiable at 0 for (size_t i=0; i<coefficients_.size(); i++) gradient.axpy(weights_[i]*TargetSpace::distance(coefficients_[i], x), TargetSpace::derivativeOfDistanceWRTSecondArgument(coefficients_[i], x)); +#else + for (size_t i=0; i<coefficients_.size(); i++) + gradient.axpy(0.5*weights_[i], + TargetSpace::derivativeOfDistanceSquaredWRTSecondArgument(coefficients_[i], x)); +#endif } void assembleMatrix(const TargetSpace& x, -- GitLab