From f4a580884b5ae022211b75813e5e3c0cb33aafad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Tue, 10 Jan 2017 12:15:08 +0100 Subject: [PATCH] [apps/graph] Use the poincare derivative calculation to compute function derivative Change-Id: I2b4d9b443935ad789e898e253a22f9d2ab652b6a --- apps/constant.cpp | 1 - apps/constant.h | 1 - apps/graph/function.cpp | 10 +++++----- apps/graph/graph/graph_controller.cpp | 2 +- apps/graph/values/values_controller.cpp | 2 +- 5 files changed, 7 insertions(+), 9 deletions(-) diff --git a/apps/constant.cpp b/apps/constant.cpp index f19bfd1f4..8f6c523d4 100644 --- a/apps/constant.cpp +++ b/apps/constant.cpp @@ -2,6 +2,5 @@ constexpr int Constant::FloatBufferSizeInScientificMode; constexpr int Constant::NumberOfDigitsInMantissaInScientificMode; -constexpr int Constant::NumberOfDigitsInMantissaForDerivativeNumberInScientificMode; constexpr int Constant::FloatBufferSizeInDecimalMode; constexpr int Constant::NumberOfDigitsInMantissaInDecimalMode; diff --git a/apps/constant.h b/apps/constant.h index 0a4ecd15b..3e2095792 100644 --- a/apps/constant.h +++ b/apps/constant.h @@ -5,7 +5,6 @@ class Constant { public: constexpr static int FloatBufferSizeInScientificMode = 14; constexpr static int NumberOfDigitsInMantissaInScientificMode = 7; - constexpr static int NumberOfDigitsInMantissaForDerivativeNumberInScientificMode = 3; constexpr static int FloatBufferSizeInDecimalMode = 11; constexpr static int NumberOfDigitsInMantissaInDecimalMode = 4; }; diff --git a/apps/graph/function.cpp b/apps/graph/function.cpp index 3ef3aaf8f..b25f5def9 100644 --- a/apps/graph/function.cpp +++ b/apps/graph/function.cpp @@ -83,11 +83,11 @@ float Function::evaluateAtAbscissa(float x, Context * context) const { } float Function::approximateDerivative(float x, Context * context) const { - float functionPlus = evaluateAtAbscissa(x + k_epsilon, context); - float functionMinus = evaluateAtAbscissa(x - k_epsilon, context); - float growthRate = (functionPlus - functionMinus)/(2*k_epsilon); - growthRate = roundf(growthRate/k_precision)*k_precision; - return growthRate; + Float abscissa = Float(x); + Expression * args[2] = {m_expression, &abscissa}; + Derivative derivative = Derivative(); + derivative.setArgument(args, 2, true); + return derivative.approximate(*context); } } diff --git a/apps/graph/graph/graph_controller.cpp b/apps/graph/graph/graph_controller.cpp index b3f70541f..b9c6dfe2f 100644 --- a/apps/graph/graph/graph_controller.cpp +++ b/apps/graph/graph/graph_controller.cpp @@ -111,7 +111,7 @@ void GraphController::reloadBannerView() { buffer[1] = '\''; App * graphApp = (Graph::App *)app(); float y = f->approximateDerivative(m_cursor.x(), graphApp->localContext()); - Float(y).convertFloatToText(buffer+8, Constant::FloatBufferSizeInScientificMode, Constant::NumberOfDigitsInMantissaForDerivativeNumberInScientificMode); + Float(y).convertFloatToText(buffer+8, Constant::FloatBufferSizeInScientificMode, Constant::NumberOfDigitsInMantissaInScientificMode); m_bannerView.setLegendAtIndex(buffer, 2); } m_bannerView.layoutSubviews(); diff --git a/apps/graph/values/values_controller.cpp b/apps/graph/values/values_controller.cpp index 4ae13f643..e4e5ab890 100644 --- a/apps/graph/values/values_controller.cpp +++ b/apps/graph/values/values_controller.cpp @@ -161,7 +161,7 @@ void ValuesController::willDisplayCellAtLocation(TableViewCell * cell, int i, in float x = m_interval.element(j-1); App * graphApp = (Graph::App *)app(); if (isDerivativeColumn(i)) { - Float(function->approximateDerivative(x, graphApp->localContext())).convertFloatToText(buffer, Constant::FloatBufferSizeInScientificMode, Constant::NumberOfDigitsInMantissaForDerivativeNumberInScientificMode); + Float(function->approximateDerivative(x, graphApp->localContext())).convertFloatToText(buffer, Constant::FloatBufferSizeInScientificMode, Constant::NumberOfDigitsInMantissaInScientificMode); } else { Float(function->evaluateAtAbscissa(x, graphApp->localContext())).convertFloatToText(buffer, Constant::FloatBufferSizeInScientificMode, Constant::NumberOfDigitsInMantissaInScientificMode); }