Commit 5c59a8bd authored by Jean-Benoist Leger's avatar Jean-Benoist Leger

separation between root3 and cst_power_biking

parent d31b3a5f
...@@ -89,23 +89,8 @@ void rv_do_walk( ...@@ -89,23 +89,8 @@ void rv_do_walk(
velocityB = distance_AB / time; velocityB = distance_AB / time;
} }
double rv_constant_power_biking( void order3_poly(double & a, double & b, double & c, double & d, double & root3)
parameters_t & parameters,
double & velocityA,
double & delta_elevation,
double & distance_AB)
{ {
double velocityB;
double delta_gravitational_potential_energy = parameters.mass * RV_G * delta_elevation;
double work_of_rolling_resistance = parameters.mass * RV_G * parameters.Cr * distance_AB;
// we write a poly a*vB^3+b*vB^2+c*vB+d
// the root is the answer
double a = (RV_RHO_AIR*parameters.SCx*distance_AB+2*parameters.mass)/4;
double b = a*velocityA;
double c = (4*work_of_rolling_resistance+(RV_RHO_AIR*parameters.SCx*distance_AB-2*parameters.mass)*velocityA*velocityA+4*delta_gravitational_potential_energy)/4;
double d = c*velocityA - 2*distance_AB*parameters.power;
double p = (3*a*c-b*b)/(3*a*a); // velocity^2 double p = (3*a*c-b*b)/(3*a*a); // velocity^2
double q = (2*b*b*b-9*a*b*c+27*a*a*d)/(27*a*a*a); // velocity^3 double q = (2*b*b*b-9*a*b*c+27*a*a*d)/(27*a*a*a); // velocity^3
double e = -b/(3*a); // velocity double e = -b/(3*a); // velocity
...@@ -122,20 +107,40 @@ double rv_constant_power_biking( ...@@ -122,20 +107,40 @@ double rv_constant_power_biking(
// computation without using imagnary computation // computation without using imagnary computation
double three_power_ = std::pow(3.0,3.0/2.0); double three_power_ = std::pow(3.0,3.0/2.0);
double two_power_ = std::pow(2.0,1.0/3.0); double two_power_ = std::pow(2.0,1.0/3.0);
velocityB = (cos(atan2(0,(sqrt(discri)-three_power_*q)/(2*three_power_))/3)*std::pow(sqrt(discri)-three_power_*q,2.0/3.0)-two_power_*two_power_*cos(atan2(0,(sqrt(discri)-three_power_*q)/(2*three_power_))/3)*p)/(two_power_*sqrt(3)*std::pow(abs(sqrt(discri)-three_power_*q),1.0/3.0)); root3 = (cos(atan2(0,(sqrt(discri)-three_power_*q)/(2*three_power_))/3)*std::pow(sqrt(discri)-three_power_*q,2.0/3.0)-two_power_*two_power_*cos(atan2(0,(sqrt(discri)-three_power_*q)/(2*three_power_))/3)*p)/(two_power_*sqrt(3)*std::pow(abs(sqrt(discri)-three_power_*q),1.0/3.0));
} }
else else
{ {
// idem but we assume <0 // idem but we assume <0
double three_power_ = std::pow(3.0,3.0/2.0); double three_power_ = std::pow(3.0,3.0/2.0);
velocityB = -(2*p*cos(atan2(sqrt(-discri)/(2*three_power_),-q/2)/3))/(sqrt(-3*p)); root3 = -(2*p*cos(atan2(sqrt(-discri)/(2*three_power_),-q/2)/3))/(sqrt(-3*p));
} }
velocityB+=e; root3+=e;
if(velocityB<0) if(root3<0)
velocityB=0; root3=0;
if(isnan(velocityB)) if(isnan(root3))
velocityB=0; root3=0;
}
double rv_constant_power_biking(
parameters_t & parameters,
double & velocityA,
double & delta_elevation,
double & distance_AB)
{
double velocityB;
double delta_gravitational_potential_energy = parameters.mass * RV_G * delta_elevation;
double work_of_rolling_resistance = parameters.mass * RV_G * parameters.Cr * distance_AB;
// we write a poly a*vB^3+b*vB^2+c*vB+d
// the root is the answer
double a = (RV_RHO_AIR*parameters.SCx*distance_AB+2*parameters.mass)/4;
double b = a*velocityA;
double c = (4*work_of_rolling_resistance+(RV_RHO_AIR*parameters.SCx*distance_AB-2*parameters.mass)*velocityA*velocityA+4*delta_gravitational_potential_energy)/4;
double d = c*velocityA - 2*distance_AB*parameters.power;
order3_poly(a,b,c,d,velocityB);
// Now hack // Now hack
// To avoid oscillation starting from 0, we choose the speed half of old and // To avoid oscillation starting from 0, we choose the speed half of old and
......
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