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()
m_pNF_Period->SetMax( m_nNbPoints - 1 );
}
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_ExtrapolateBackward->Enable( !bMovingAverage );
m_pCB_SetIntercept->Enable( bInterceptAvailable );
......
......@@ -61,11 +61,24 @@ void SAL_CALL ExponentialRegressionCurveCalculator::recalculateRegression(
}
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;
for( i = 0; i < nMax; ++i )
{
fAverageX += aValues.first[i];
fAverageY += log( aValues.second[i] );
double yValue = 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 );
......@@ -76,7 +89,7 @@ void SAL_CALL ExponentialRegressionCurveCalculator::recalculateRegression(
for( i = 0; i < nMax; ++i )
{
double fDeltaX = aValues.first[i] - fAverageX;
double fDeltaY = log( aValues.second[i] ) - fAverageY;
double fDeltaY = yVector[i] - fAverageY;
fQx += fDeltaX * fDeltaX;
fQy += fDeltaY * fDeltaY;
......@@ -84,9 +97,8 @@ void SAL_CALL ExponentialRegressionCurveCalculator::recalculateRegression(
}
m_fLogSlope = fQxy / fQx;
m_fLogIntercept = fAverageY - m_fLogSlope * fAverageX;
m_fLogIntercept = mForceIntercept ? fLogIntercept : fAverageY - m_fLogSlope * fAverageX;
m_fCorrelationCoeffitient = fQxy / sqrt( fQx * fQy );
}
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