ExtendedCriticalPower: Use version 5

This commit is contained in:
Damien
2014-01-05 18:38:54 +01:00
parent acf439bb1d
commit d367adb0e6
3 changed files with 71 additions and 97 deletions

View File

@@ -483,30 +483,28 @@ CpintPlot::plot_CP_curve(CpintPlot *thisPlot, // the plot we're currently di
/*extendedCurveTitle = ecp->getPlotMarkerForExtendedCP_4_3(athleteModeleCP4);
extendedCurveTitle->attach(thisPlot);*/
//extendedCPCurve5 = ecp->getPlotCurveForExtendedCP_5_3(athleteModeleCP5);
//extendedCPCurve5->attach(thisPlot);
extendedCPCurve5 = ecp->getPlotCurveForExtendedCP_5_3(athleteModeleCP5);
extendedCPCurve5->attach(thisPlot);
/*extendedCPCurve_WSecond = ecp->getPlotCurveForExtendedCP_5_3_WSecond(athleteModeleCP5);
/*extendedCPCurve_WSecond = ecp->getPlotCurveForExtendedCP_5_3_WSecond(athleteModeleCP5, false);
extendedCPCurve_WSecond->attach(thisPlot);
extendedCPCurve_WPrime = ecp->getPlotCurveForExtendedCP_5_3_WPrime(athleteModeleCP5);
extendedCPCurve_WPrime = ecp->getPlotCurveForExtendedCP_5_3_WPrime(athleteModeleCP5, false);
extendedCPCurve_WPrime->attach(thisPlot);
extendedCPCurve_CP = ecp->getPlotCurveForExtendedCP_5_3_CP(athleteModeleCP5);
extendedCPCurve_CP->attach(thisPlot);
extendedCPCurve_WPrime_CP = ecp->getPlotCurveForExtendedCP_5_3_WPrime_CP(athleteModeleCP5);
extendedCPCurve_WPrime_CP->attach(thisPlot);*/
extendedCPCurve_CP = ecp->getPlotCurveForExtendedCP_5_3_CP(athleteModeleCP5, false);
extendedCPCurve_CP->attach(thisPlot);*/
extendedCPCurve6 = ecp->getPlotCurveForExtendedCP_6_3(athleteModeleCP6);
extendedCPCurve6->attach(thisPlot);
//extendedCPCurve6 = ecp->getPlotCurveForExtendedCP_6_3(athleteModeleCP6);
//extendedCPCurve6->attach(thisPlot);
/*extendedCPCurve_WSecond = ecp->getPlotCurveForExtendedCP_6_3_WSecond(athleteModeleCP6, true);
/*extendedCPCurve_WSecond = ecp->getPlotCurveForExtendedCP_6_3_WSecond(athleteModeleCP6, false);
extendedCPCurve_WSecond->attach(thisPlot);
extendedCPCurve_WPrime = ecp->getPlotCurveForExtendedCP_6_3_WPrime(athleteModeleCP6, true);
extendedCPCurve_WPrime = ecp->getPlotCurveForExtendedCP_6_3_WPrime(athleteModeleCP6, false);
extendedCPCurve_WPrime->attach(thisPlot);
extendedCPCurve_CP = ecp->getPlotCurveForExtendedCP_6_3_CP(athleteModeleCP6, true);
extendedCPCurve_CP = ecp->getPlotCurveForExtendedCP_6_3_CP(athleteModeleCP6, false);
extendedCPCurve_CP->attach(thisPlot);*/
curveTitle = ecp->getPlotMarkerForExtendedCP(athleteModeleCP6);
curveTitle = ecp->getPlotMarkerForExtendedCP(athleteModeleCP5);
curveTitle->setXValue(5);
curveTitle->setYValue(70);
curveTitle->attach(thisPlot);

View File

@@ -648,7 +648,7 @@ ExtendedCriticalPower::getPlotCurveForExtendedCP_4_3(Model_eCP model)
QwtPlotCurve *extendedCPCurve2 = new QwtPlotCurve("eCP2");
if (appsettings->value(NULL, GC_ANTIALIAS, false).toBool() == true)
extendedCPCurve2->setRenderHint(QwtPlotItem::RenderAntialiased);
QPen e2pen(GColor(CHEARTRATE));
QPen e2pen(Qt::yellow);
e2pen.setWidth(1);
e2pen.setStyle(Qt::DashLine);
extendedCPCurve2->setPen(e2pen);
@@ -927,7 +927,7 @@ ExtendedCriticalPower::deriveExtendedCP_5_3_Parameters(bool usebest, RideFileCac
model.paa_dec = -2;
if (model.ecp_del == 0)
model.ecp_del = -0.7;
model.ecp_del = -0.9;
if (model.tau_del == 0)
model.tau_del = -4.8;
@@ -1053,7 +1053,7 @@ ExtendedCriticalPower::deriveExtendedCP_5_3_Parameters(bool usebest, RideFileCac
model.paa = paa_min;
double _avg_paa = 0.0;
count=1;
for (i = 1; i <= 8; i++) {
for (i = 2; i <= 8; i++) {
double paan = (bests->meanMaxArray(series)[i] - model.ecp * (1-exp(model.tau_del*i/60.0)) * (1-exp(model.ecp_del*i/60.0)) * (1+model.ecp_dec*exp(model.ecp_dec_del/(i/60.0))) * ( 1 + model.etau/(i/60.0))) / exp(model.paa_dec*(i/60.0)) / (1.20-0.20*exp(-1*(i/60.0)));
_avg_paa = (double)((count-1)*_avg_paa+paan)/count;
@@ -1127,7 +1127,7 @@ ExtendedCriticalPower::getPlotCurveForExtendedCP_5_3(Model_eCP model)
QwtPlotCurve *extendedCPCurve2 = new QwtPlotCurve("eCP_5_3");
if (appsettings->value(NULL, GC_ANTIALIAS, false).toBool() == true)
extendedCPCurve2->setRenderHint(QwtPlotItem::RenderAntialiased);
QPen e2pen(GColor(CHEARTRATE));
QPen e2pen(GColor(CCP)); // Qt::cyan
e2pen.setWidth(1);
e2pen.setStyle(Qt::DashLine);
extendedCPCurve2->setPen(e2pen);
@@ -1136,31 +1136,33 @@ ExtendedCriticalPower::getPlotCurveForExtendedCP_5_3(Model_eCP model)
return extendedCPCurve2;
}
QwtPlotCurve*
ExtendedCriticalPower::getPlotCurveForExtendedCP_5_3_WSecond(Model_eCP model)
QwtPlotIntervalCurve*
ExtendedCriticalPower::getPlotCurveForExtendedCP_5_3_WSecond(Model_eCP model, bool stacked)
{
const int extendedCurve2_points = 1000;
QVector<double> extended_cp_curve2_power(extendedCurve2_points);
QVector<double> extended_cp_curve2_time(extendedCurve2_points);
QVector<QwtIntervalSample> extended_cp_curve_power(extendedCurve2_points);
double tmin = 1.0/60;
double tmax = 600;
for (int i = 0; i < extendedCurve2_points; i ++) {
double x = (double) i / (extendedCurve2_points - 1);
double t = pow(tmax, x) * pow(tmin, 1-x);
extended_cp_curve2_time[i] = t;
extended_cp_curve2_power[i] = model.paa*(1.20-0.20*exp(-1*t))*exp(model.paa_dec*(t));
double power_wsecond = model.paa*(1.20-0.20*exp(-1*t))*exp(model.paa_dec*(t));
extended_cp_curve_power[i] = QwtIntervalSample(t, 0, power_wsecond);
}
QwtPlotCurve *extendedCPCurve2 = new QwtPlotCurve("eCP_5_3_WSecond");
QwtPlotIntervalCurve *extendedCPCurve = new QwtPlotIntervalCurve("eCP_5_3_WSecond");
if (appsettings->value(NULL, GC_ANTIALIAS, false).toBool() == true)
extendedCPCurve2->setRenderHint(QwtPlotItem::RenderAntialiased);
extendedCPCurve->setRenderHint(QwtPlotItem::RenderAntialiased);
QPen e2pen(GColor(CCADENCE));
e2pen.setWidth(1);
e2pen.setStyle(Qt::DashLine);
extendedCPCurve2->setPen(e2pen);
extendedCPCurve->setPen(e2pen);
QColor color1 = GColor(CCADENCE);
color1.setAlpha(64);
@@ -1169,44 +1171,41 @@ ExtendedCriticalPower::getPlotCurveForExtendedCP_5_3_WSecond(Model_eCP model)
linearGradient.setColorAt(0.0, color1);
linearGradient.setColorAt(1.0, color2);
linearGradient.setSpread(QGradient::PadSpread);
extendedCPCurve2->setBrush(linearGradient); // fill below the line
extendedCPCurve->setBrush(linearGradient); // fill below the line
extendedCPCurve2->setSamples(extended_cp_curve2_time.data(), extended_cp_curve2_power.data(), extendedCurve2_points);
extendedCPCurve->setSamples(new QwtIntervalSeriesData(extended_cp_curve_power));
return extendedCPCurve2;
return extendedCPCurve;
}
QwtPlotIntervalCurve*
ExtendedCriticalPower::getPlotCurveForExtendedCP_5_3_WPrime(Model_eCP model)
ExtendedCriticalPower::getPlotCurveForExtendedCP_5_3_WPrime(Model_eCP model, bool stacked)
{
const int extendedCurve2_points = 1000;
QVector<double> extended_cp_curve2_power_wsecond(extendedCurve2_points);
QVector<double> extended_cp_curve2_power_wprime(extendedCurve2_points);
QVector<QwtIntervalSample> extended_cp_curve_power(extendedCurve2_points);
QVector<QwtIntervalSample> extended_cp_curve2_power(extendedCurve2_points);
QVector<double> extended_cp_curve2_time(extendedCurve2_points);
double tmin = 1.0/60;
double tmax = 600;
for (int i = 0; i < extendedCurve2_points; i ++) {
double x = (double) i / (extendedCurve2_points - 1);
double t = pow(tmax, x) * pow(tmin, 1-x);
extended_cp_curve2_time[i] = t;
extended_cp_curve2_power_wsecond[i] = model.paa*(1.20-0.20*exp(-1*t))*exp(model.paa_dec*(t));
extended_cp_curve2_power_wprime[i] = model.ecp * (1-exp(model.tau_del*t)) * (1-exp(model.ecp_del*t)) * (1+model.ecp_dec*exp(model.ecp_dec_del/t)) * ( model.etau/(t) );
extended_cp_curve2_power[i] = QwtIntervalSample(t, extended_cp_curve2_power_wsecond[i], extended_cp_curve2_power_wprime[i] + extended_cp_curve2_power_wsecond[i]);
double power_wsecond = model.paa*(1.20-0.20*exp(-1*t))*exp(model.paa_dec*(t));
double power_wprime = model.ecp * (1-exp(model.tau_del*t)) * (1-exp(model.ecp_del*t)) * (1+model.ecp_dec*exp(model.ecp_dec_del/t)) * ( model.etau/(t) );
extended_cp_curve_power[i] = QwtIntervalSample(t, (stacked?power_wsecond:0), (stacked?power_wprime + power_wsecond:power_wprime));
}
//QwtPlotCurve *extendedCPCurve2 = new QwtPlotCurve("eCP_5_3_WPrime");
QwtPlotIntervalCurve *extendedCPCurve2 = new QwtPlotIntervalCurve("eCP_5_3_WPrime");
QwtPlotIntervalCurve *extendedCPCurve = new QwtPlotIntervalCurve("eCP_5_3_WPrime");
if (appsettings->value(NULL, GC_ANTIALIAS, false).toBool() == true)
extendedCPCurve2->setRenderHint(QwtPlotItem::RenderAntialiased);
extendedCPCurve->setRenderHint(QwtPlotItem::RenderAntialiased);
QPen e2pen(GColor(CPOWER));
e2pen.setWidth(1);
e2pen.setStyle(Qt::DashLine);
extendedCPCurve2->setPen(e2pen);
extendedCPCurve->setPen(e2pen);
QColor color1 = GColor(CPOWER);
color1.setAlpha(64);
@@ -1215,40 +1214,43 @@ ExtendedCriticalPower::getPlotCurveForExtendedCP_5_3_WPrime(Model_eCP model)
linearGradient.setColorAt(0.0, color1);
linearGradient.setColorAt(1.0, color2);
linearGradient.setSpread(QGradient::PadSpread);
extendedCPCurve2->setBrush(linearGradient); // fill below the line
extendedCPCurve->setBrush(linearGradient); // fill below the line
//extendedCPCurve2->setSamples(extended_cp_curve2_time.data(), extended_cp_curve2_power.data(), extendedCurve2_points);
extendedCPCurve2->setSamples(new QwtIntervalSeriesData(extended_cp_curve2_power));
extendedCPCurve->setSamples(new QwtIntervalSeriesData(extended_cp_curve_power));
return extendedCPCurve2;
return extendedCPCurve;
}
QwtPlotCurve*
ExtendedCriticalPower::getPlotCurveForExtendedCP_5_3_CP(Model_eCP model)
QwtPlotIntervalCurve*
ExtendedCriticalPower::getPlotCurveForExtendedCP_5_3_CP(Model_eCP model, bool stacked)
{
const int extendedCurve2_points = 1000;
QVector<double> extended_cp_curve2_power(extendedCurve2_points);
QVector<double> extended_cp_curve2_time(extendedCurve2_points);
QVector<QwtIntervalSample> extended_cp_curve_power(extendedCurve2_points);
double tmin = 1.0/60;
double tmax = 600;
for (int i = 0; i < extendedCurve2_points; i ++) {
double x = (double) i / (extendedCurve2_points - 1);
double t = pow(tmax, x) * pow(tmin, 1-x);
extended_cp_curve2_time[i] = t;
extended_cp_curve2_power[i] = model.ecp * (1-exp(model.tau_del*t)) * (1-exp(model.ecp_del*t)) * (1+model.ecp_dec*exp(model.ecp_dec_del/t)) * ( 1 );
double power_wsecond = model.paa*(1.20-0.20*exp(-1*t))*exp(model.paa_dec*(t));
double power_wprime = model.ecp * (1-exp(model.tau_del*t)) * (1-exp(model.ecp_del*t)) * (1+model.ecp_dec*exp(model.ecp_dec_del/t)) * ( model.etau/(t) );
double power_cp = model.ecp * (1-exp(model.tau_del*t)) * (1-exp(model.ecp_del*t)) * (1+model.ecp_dec*exp(model.ecp_dec_del/t)) * ( 1 );
extended_cp_curve_power[i] = QwtIntervalSample(t, (stacked?power_wprime + power_wsecond:0), (stacked?power_wprime + power_wsecond + power_cp:power_cp));
}
QwtPlotCurve *extendedCPCurve2 = new QwtPlotCurve("eCP_5_3_CP");
QwtPlotIntervalCurve *extendedCPCurve = new QwtPlotIntervalCurve("eCP_5_3_CP");
if (appsettings->value(NULL, GC_ANTIALIAS, false).toBool() == true)
extendedCPCurve2->setRenderHint(QwtPlotItem::RenderAntialiased);
extendedCPCurve->setRenderHint(QwtPlotItem::RenderAntialiased);
QPen e2pen(GColor(CHEARTRATE));
e2pen.setWidth(1);
e2pen.setStyle(Qt::DashLine);
extendedCPCurve2->setPen(e2pen);
extendedCPCurve->setPen(e2pen);
QColor color1 = GColor(CHEARTRATE);
color1.setAlpha(64);
@@ -1257,40 +1259,11 @@ ExtendedCriticalPower::getPlotCurveForExtendedCP_5_3_CP(Model_eCP model)
linearGradient.setColorAt(0.0, color1);
linearGradient.setColorAt(1.0, color2);
linearGradient.setSpread(QGradient::PadSpread);
extendedCPCurve2->setBrush(linearGradient); // fill below the line
extendedCPCurve->setBrush(linearGradient); // fill below the line
extendedCPCurve2->setSamples(extended_cp_curve2_time.data(), extended_cp_curve2_power.data(), extendedCurve2_points);
extendedCPCurve->setSamples(new QwtIntervalSeriesData(extended_cp_curve_power));
return extendedCPCurve2;
}
QwtPlotCurve*
ExtendedCriticalPower::getPlotCurveForExtendedCP_5_3_WPrime_CP(Model_eCP model)
{
const int extendedCurve2_points = 1000;
QVector<double> extended_cp_curve2_power(extendedCurve2_points);
QVector<double> extended_cp_curve2_time(extendedCurve2_points);
double tmin = 1.0/60;
double tmax = 600;
for (int i = 0; i < extendedCurve2_points; i ++) {
double x = (double) i / (extendedCurve2_points - 1);
double t = pow(tmax, x) * pow(tmin, 1-x);
extended_cp_curve2_time[i] = t;
extended_cp_curve2_power[i] = model.ecp * (1-exp(model.tau_del*t)) * (1-exp(model.ecp_del*t)) * (1+model.ecp_dec*exp(model.ecp_dec_del/t)) * ( 1 + model.etau/(t));
}
QwtPlotCurve *extendedCPCurve2 = new QwtPlotCurve("eCP_5_3_WPrime_CP");
if (appsettings->value(NULL, GC_ANTIALIAS, false).toBool() == true)
extendedCPCurve2->setRenderHint(QwtPlotItem::RenderAntialiased);
QPen e2pen(GColor(CCP));
e2pen.setWidth(1);
e2pen.setStyle(Qt::DashLine);
extendedCPCurve2->setPen(e2pen);
extendedCPCurve2->setSamples(extended_cp_curve2_time.data(), extended_cp_curve2_power.data(), extendedCurve2_points);
return extendedCPCurve2;
return extendedCPCurve;
}
Model_eCP
@@ -1568,7 +1541,7 @@ ExtendedCriticalPower::getPlotCurveForExtendedCP_6_3(Model_eCP model)
QwtPlotCurve *extendedCPCurve2 = new QwtPlotCurve("eCP_6_3");
if (appsettings->value(NULL, GC_ANTIALIAS, false).toBool() == true)
extendedCPCurve2->setRenderHint(QwtPlotItem::RenderAntialiased);
QPen e2pen(GColor(CCP));
QPen e2pen(Qt::cyan);
e2pen.setWidth(1);
e2pen.setStyle(Qt::DashLine);
extendedCPCurve2->setPen(e2pen);

View File

@@ -124,24 +124,27 @@ class ExtendedCriticalPower
QwtPlotCurve* getPlotCurveForExtendedCP_4_3_CP(Model_eCP athleteModeleCP2);
QwtPlotCurve* getPlotCurveForExtendedCP_4_3_WPrime_CP(Model_eCP athleteModeleCP2);
// Extended CP Model version 5
Model_eCP deriveExtendedCP_5_3_Parameters(bool usebest, RideFileCache *bests, RideFile::SeriesType series, double sanI1, double sanI2, double anI1, double anI2, double aeI1, double aeI2, double laeI1, double laeI2);
QwtPlotCurve* getPlotCurveForExtendedCP_5_3(Model_eCP athleteModeleCP2);
QwtPlotCurve* getPlotCurveForExtendedCP_5_3_WSecond(Model_eCP athleteModeleCP2);
QwtPlotIntervalCurve* getPlotCurveForExtendedCP_5_3_WPrime(Model_eCP athleteModeleCP2);
QwtPlotCurve* getPlotCurveForExtendedCP_5_3_CP(Model_eCP athleteModeleCP2);
QwtPlotCurve* getPlotCurveForExtendedCP_5_3_WPrime_CP(Model_eCP athleteModeleCP2);
// Contributions
QwtPlotIntervalCurve* getPlotCurveForExtendedCP_5_3_WSecond(Model_eCP athleteModeleCP2, bool stacked);
QwtPlotIntervalCurve* getPlotCurveForExtendedCP_5_3_WPrime(Model_eCP athleteModeleCP2, bool stacked);
QwtPlotIntervalCurve* getPlotCurveForExtendedCP_5_3_CP(Model_eCP athleteModeleCP2, bool stacked);
Model_eCP deriveExtendedCP_6_3_Parameters(bool usebest, RideFileCache *bests, RideFile::SeriesType series, double sanI1, double sanI2, double anI1, double anI2, double aeI1, double aeI2, double laeI1, double laeI2);
QwtPlotMarker* getPlotMarkerForExtendedCP(Model_eCP athleteModeleCP2);
// Extended CP Model version 6
Model_eCP deriveExtendedCP_6_3_Parameters(bool usebest, RideFileCache *bests, RideFile::SeriesType series, double sanI1, double sanI2, double anI1, double anI2, double aeI1, double aeI2, double laeI1, double laeI2);
QwtPlotCurve* getPlotCurveForExtendedCP_6_3(Model_eCP athleteModeleCP2);
// Contributions
QwtPlotIntervalCurve* getPlotCurveForExtendedCP_6_3_WSecond(Model_eCP athleteModeleCP2, bool stacked);
QwtPlotIntervalCurve* getPlotCurveForExtendedCP_6_3_WPrime(Model_eCP athleteModeleCP2, bool stacked);
QwtPlotIntervalCurve* getPlotCurveForExtendedCP_6_3_CP(Model_eCP athleteModeleCP2, bool stacked);
// Marker for Model
QwtPlotMarker* getPlotMarkerForExtendedCP(Model_eCP athleteModeleCP2);
private:
Context *context;
};