Моделирование насос-форсунки EUI
Автор
# =============================================================================
# js_math.jl — JS: интерполяция (линейная + Акима)
# =============================================================================
function get_js_math_block()::String
return """
var currentMethod = 'cubic';
function computeLinearSpline(x_arr, y_arr) {
var fine_x = new Array(); var fine_y = new Array();
for (var cur_x = 0; cur_x <= 360; cur_x += 1.0) { fine_x.push(cur_x); }
fine_x.forEach(function(cx) {
var idx = x_arr.findIndex(v => v >= cx);
if (idx <= 0) idx = 1; if (idx >= x_arr.length) idx = x_arr.length - 1;
var x0 = x_arr[idx-1]; var x1 = x_arr[idx];
var y0 = y_arr[idx-1]; var y1 = y_arr[idx];
fine_y.push(y0 + (cx - x0) * (y1 - y0) / (x1 - x0));
});
return {fine_x: fine_x, fine_y: fine_y};
}
function computeAkimaSpline(x_arr, y_arr) {
var n = x_arr.length; var m = new Array();
x_arr.forEach(function(x_val, idx) {
if (idx === 0) return;
m.push((y_arr[idx] - y_arr[idx-1]) / (x_val - x_arr[idx-1]));
});
var M = new Array();
var last3 = m.slice(-2); M.push(last3[0]); M.push(last3[1]);
m.forEach(function(s) { M.push(s); });
var first2 = m.slice(0, 2); M.push(first2[0]); M.push(first2[1]);
var t = new Array();
x_arr.forEach(function(_, i) {
var sub = M.slice(i, i + 4);
var m1 = sub[0]; var m2 = sub[1]; var m3 = sub[2]; var m4 = sub[3];
var w1 = Math.abs(m4 - m3); var w2 = Math.abs(m2 - m1);
t.push((w1 + w2) === 0 ? 0.5 * (m2 + m3) : (w1 * m2 + w2 * m3) / (w1 + w2));
});
var fine_x = new Array(); var fine_y = new Array();
for (var cur_x = 0; cur_x <= 360; cur_x += 1.0) { fine_x.push(cur_x); }
fine_x.forEach(function(cur_x) {
var idx = x_arr.findIndex(v => v >= cur_x);
if (idx <= 0) idx = 1; if (idx >= n) idx = n - 1;
var i = idx - 1;
var xi = x_arr[i]; var xnext = x_arr[idx];
var yi = y_arr[i]; var ynext = y_arr[idx];
var ti = t[i]; var tnext = t[idx];
var h = xnext - xi; var dx = cur_x - xi;
var a2 = (3.0 * (ynext - yi) / h - 2.0 * ti - tnext) / h;
var a3 = (2.0 * (yi - ynext) / h + ti + tnext) / (h * h);
fine_y.push(yi + ti * dx + a2 * dx * dx + a3 * dx * dx * dx);
});
return {fine_x: fine_x, fine_y: fine_y};
}
"""
end