Kaydet (Commit) fec037e6 authored tarafından Laurent Balland-Poirier's avatar Laurent Balland-Poirier Kaydeden (comit) Norbert Thiebaud

tdf#72361 Forced intercept for exponentiial trendline

Change-Id: I252a4994d2ee981018d07d6fac7ffe639f065d3e
Reviewed-on: https://gerrit.libreoffice.org/15334Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarNorbert Thiebaud <nthiebaud@gmail.com>
üst 4d045be7
...@@ -302,7 +302,9 @@ void TrendlineResources::UpdateControlStates() ...@@ -302,7 +302,9 @@ void TrendlineResources::UpdateControlStates()
m_pNF_Period->SetMax( m_nNbPoints - 1 ); m_pNF_Period->SetMax( m_nNbPoints - 1 );
} }
bool bMovingAverage = ( m_eTrendLineType == CHREGRESS_MOVING_AVERAGE ); bool bMovingAverage = ( m_eTrendLineType == CHREGRESS_MOVING_AVERAGE );
bool bInterceptAvailable = ( m_eTrendLineType == CHREGRESS_LINEAR ) || ( m_eTrendLineType == CHREGRESS_POLYNOMIAL ); bool bInterceptAvailable = ( m_eTrendLineType == CHREGRESS_LINEAR )
|| ( m_eTrendLineType == CHREGRESS_POLYNOMIAL )
|| ( m_eTrendLineType == CHREGRESS_EXP );
m_pFmtFld_ExtrapolateForward->Enable( !bMovingAverage ); m_pFmtFld_ExtrapolateForward->Enable( !bMovingAverage );
m_pFmtFld_ExtrapolateBackward->Enable( !bMovingAverage ); m_pFmtFld_ExtrapolateBackward->Enable( !bMovingAverage );
m_pCB_SetIntercept->Enable( bInterceptAvailable ); m_pCB_SetIntercept->Enable( bInterceptAvailable );
......
...@@ -61,11 +61,24 @@ void SAL_CALL ExponentialRegressionCurveCalculator::recalculateRegression( ...@@ -61,11 +61,24 @@ void SAL_CALL ExponentialRegressionCurveCalculator::recalculateRegression(
} }
double fAverageX = 0.0, fAverageY = 0.0; double fAverageX = 0.0, fAverageY = 0.0;
double fLogIntercept = mForceIntercept ? log(mInterceptValue) : 0.0;
std::vector<double> yVector;
yVector.resize(nMax, 0.0);
size_t i = 0; size_t i = 0;
for( i = 0; i < nMax; ++i ) for( i = 0; i < nMax; ++i )
{ {
fAverageX += aValues.first[i]; double yValue = log(aValues.second[i]);
fAverageY += log( aValues.second[i] ); if (mForceIntercept)
{
yValue -= fLogIntercept;
}
else
{
fAverageX += aValues.first[i];
fAverageY += yValue;
}
yVector[i] = yValue;
} }
const double fN = static_cast< double >( nMax ); const double fN = static_cast< double >( nMax );
...@@ -76,7 +89,7 @@ void SAL_CALL ExponentialRegressionCurveCalculator::recalculateRegression( ...@@ -76,7 +89,7 @@ void SAL_CALL ExponentialRegressionCurveCalculator::recalculateRegression(
for( i = 0; i < nMax; ++i ) for( i = 0; i < nMax; ++i )
{ {
double fDeltaX = aValues.first[i] - fAverageX; double fDeltaX = aValues.first[i] - fAverageX;
double fDeltaY = log( aValues.second[i] ) - fAverageY; double fDeltaY = yVector[i] - fAverageY;
fQx += fDeltaX * fDeltaX; fQx += fDeltaX * fDeltaX;
fQy += fDeltaY * fDeltaY; fQy += fDeltaY * fDeltaY;
...@@ -84,9 +97,8 @@ void SAL_CALL ExponentialRegressionCurveCalculator::recalculateRegression( ...@@ -84,9 +97,8 @@ void SAL_CALL ExponentialRegressionCurveCalculator::recalculateRegression(
} }
m_fLogSlope = fQxy / fQx; m_fLogSlope = fQxy / fQx;
m_fLogIntercept = fAverageY - m_fLogSlope * fAverageX; m_fLogIntercept = mForceIntercept ? fLogIntercept : fAverageY - m_fLogSlope * fAverageX;
m_fCorrelationCoeffitient = fQxy / sqrt( fQx * fQy ); m_fCorrelationCoeffitient = fQxy / sqrt( fQx * fQy );
} }
double SAL_CALL ExponentialRegressionCurveCalculator::getCurveValue( double x ) double SAL_CALL ExponentialRegressionCurveCalculator::getCurveValue( double x )
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment