diff --git a/apps/graph/function.cpp b/apps/graph/function.cpp index cd43159c8..b5c8e7d18 100644 --- a/apps/graph/function.cpp +++ b/apps/graph/function.cpp @@ -61,9 +61,16 @@ void Function::setActive(bool active) { m_active = active; } -float Function::evaluateAtAbscissa(float x, EvaluateContext * context) { +float Function::evaluateAtAbscissa(float x, EvaluateContext * context) const { context->setOverridenValueForSymbolX(x); return m_expression->approximate(*context); } +float Function::approximateDerivative(float x, EvaluateContext * context) const { + float functionPlus = evaluateAtAbscissa(x + k_epsilon, context); + float functionMinus = evaluateAtAbscissa(x - k_epsilon, context); + float growthRate = (functionPlus - functionMinus)/(2*k_epsilon); + return growthRate; +} + } diff --git a/apps/graph/function.h b/apps/graph/function.h index fc8ba57fc..44c1252f5 100644 --- a/apps/graph/function.h +++ b/apps/graph/function.h @@ -22,8 +22,10 @@ public: void setActive(bool active); void setContent(const char * c); void setColor(KDColor m_color); - float evaluateAtAbscissa(float x, EvaluateContext * context); + float evaluateAtAbscissa(float x, EvaluateContext * context) const; + float approximateDerivative(float x, EvaluateContext * context) const; private: + constexpr static float k_epsilon = 0.0001f; constexpr static int k_bodyLength = 255; char m_text[k_bodyLength]; const char * m_name;