JSFiddle - React, Tailwind, and code Playground
HTML
<button id="psk">Посчитать пск!</button>
JavaScript
document.getElementById('psk').onclick = function () {
var bp = 30;
var values = [];
values[0] = {
Date: new Date(2014, 8, 01),
Flow: -100000
};
values[1] = {
Date: new Date(2014, 9, 01),
Flow: 34002.21
};
values[2] = {
Date: new Date(2014, 10, 01),
Flow: 34002.21
};
values[3] = {
Date: new Date(2014, 11, 01),
Flow: 34002.21
};
var x0 = 0;
var x1 = 0.0;
var err = 1000000000000;
var tol = 0.00001;
var f_x = function (p, dt, dt0, x) {
var pow = Math.floor(((dt - dt0) / (24 * 60 * 60 * 1000)) / bp);
var ek = (((dt - dt0) / (24 * 60 * 60 * 1000)) % bp) / bp;
return p / ((1.0 + ek * x) * Math.pow((1.0 + x), pow));
};
var df_x = function (p, dt, dt0, x) {
var pow = Math.floor(((dt - dt0) / (24 * 60 * 60 * 1000)) / bp);
var ek = (((dt - dt0) / (24 * 60 * 60 * 1000)) % bp) / bp;
var r = p * (1.0 / Math.pow(1.0 + x, pow)) * (-ek / Math.pow(1.0 + ek * x, 2)) + p * (1.0 / (1.0 + ek * x)) * (-pow / Math.pow(1.0 + x, pow + 1.0));
return r;
};
var total_f_x = function (values, x) {
var resf = 0.0;
for (var i = 0; i < values.length; i++) {
var r = f_x(values[i].Flow, values[i].Date, values[0].Date, x);
resf = resf + r;
}
return resf;
}
var total_df_x = function (values, x) {
var resf = 0.0;
for (var i = 0; i < values.length; i++) {
var r = df_x(values[i].Flow, values[i].Date, values[0].Date, x);
resf = resf + r;
}
return resf;
}
while (err > tol) {
x1 = x0 - total_f_x(values, x0) / total_df_x(values, x0);
err = Math.abs(x1 - x0);
x0 = x1;
}
var cbp = Math.round(365 / bp);
//считаем ПСК
var psk = Math.floor(x0 * cbp * 100 * 1000) / 1000;
//выводим ПСК
alert("ПСК = " + psk + " %");
}