JSFiddle - React, Tailwind, and code Playground
by fxi
JavaScript
var data = {
"power": 100,
"rweight": 70,
"bweight": 8,
"tire": .005,
"aero": .4,
"cvinput": .9,
"grade": 0,
"headwind": 0,
"distance": 0.1,
"temperature": 25,
"elevation": 100,
"trans": 95
}
function newton(aero, hw, tr, tran, p) { /* Newton's method */
var vel = 20; // Initial guess
var MAX = 10; // maximum iterations
var TOL = 0.05; // tolerance
for (var i = 1; i < MAX; i++) {
var tv = vel + hw;
var f = vel * (aero * tv * tv + tr) - tran * p; // the function
var fp = aero * (3.0 * vel + hw) * tv + tr; // the derivative
var vNew = vel - f / fp;
if (Math.abs(vNew - vel) < TOL) return vNew; // success
vel = vNew;
}
return 0.0; // failed to converge
}
function update(d) {
/* Left panel */
powerv = d.power;
rweightv = d.rweight;
bweightv = d.bweight;
rollingRes = d.tire;
frontalArea = d.aero;
cv = d.cvinput;
gradev = d.grade * 0.01;
headwindv = d.headwind / 3.6; // converted to m/s
distancev = d.distance;
temperaturev = d.temperature;
elevationv = d.elevation;
transv = d.trans * 0.01;
/* Left Calculation */
density = (1.293 - 0.00426 * temperaturev) * Math.exp(-elevationv / 7000.0);
twt = 9.8 * (rweightv + bweightv); // total weight in newtons
A2 = 0.5 * frontalArea * cv * density; // full air resistance parameter
tres = twt * (gradev + rollingRes); // gravity and rolling resistance
v = newton(A2, headwindv, tres, transv, powerv) * 3.6; // convert to km/h
if (v > 0.0) t = 60.0 * distancev / v;
else t = 0.0; // don't want any div by zero errors
c = t / 60.0 * (powerv * 4.0) / 1.163;
/* 1.163 is for converting watt-hours to kilocalories */
/* energy conversion eff = 0.25 */
wl = c / 7716;
console.log("speed kmh: "+v);
console.log("time m:" + t);
console.log("calories " + c);
console.log("weigtloss" + wl);
console.log("---")
}
update(data);