Я тут много чего нахимичил, в связи своей неопытности, но думаю, что можно это все упростить в несколько раз.
-Вычисления.
-Построение графика.
-История вычислений, с сохранением и загрузкой файла.
let
x=[],y=[],i,h,j,xs,
a = document.getElementById("a"),
b = document.getElementById("b"),
step = document.getElementById("step"),
buff = document.getElementById("buf"),
ys = xs => "",
xw = document.getElementById("xw"),
tocn = document.getElementById("tocn"),
newton = document.getElementById("newton"),
nporg = document.getElementById("nporg"),
lagr = document.getElementById("lagr"),
lpogr = document.getElementById("lpogr"),
stocn = document.getElementById("stocn"),
snewton = document.getElementById("snewton"),
snporg = document.getElementById("snporg"),
slagr = document.getElementById("slagr"),
slpogr = document.getElementById("slpogr"),
c = document.querySelector("canvas"),
ctx = c.getContext("2d"),
z1 = document.getElementById("z");
a.focus();
/////////////////////////////////////////////
function fillmass() {
let a1 = parseFloat(a.value.replace(",", ".")),
b1 = parseFloat(b.value.replace(",", ".")),
step1 = parseFloat(step.value.replace(",", "."));
if(!a1 || !b1 || !step1) {
alert("не все данные введены!");
return;
}
h= (b1 - a1)/step1;
for(i =0; i<=step1;i++)
{
x[i]= parseFloat((a1+i*h).toFixed(4));
y[i]= parseFloat((((Math.pow(x[i],3)/2)+7) -0.6*(Math.exp(x[i]))).toFixed(4));
buff.value += "x["+ i +"] " +x [i]+" "+ "y["+ i +"] "+y[i]+"\n";
}
alert("Массив заполнен");
}
///////////////////////////////
function lininterpol(){
let xw1 = parseFloat(xw.value.replace(",", "."));
if(!xw1) {
alert("не все данные введены!");
return;
}
j=1;
while (xw1 > x[j]) {
j ++}
tocn.value = (((Math.pow(xw1, 3) / 2) + 7) - 0.6 * (Math.exp(xw1))).toFixed(4);
newton.value =(y[j - 1] + (y[j]-y[j - 1]) * (xw1-x[j - 1])/(x[j]-x[j - 1])).toFixed(4) ;
lagr.value =(y[j - 1]*(xw1-x[j])/(x[j - 1]-x[j])+y[j]*(xw1-x[j - 1])/(x[j]-x[j - 1])).toFixed(4);
nporg.value = (newton.value-tocn.value).toFixed(4);
lpogr.value =(lagr.value-tocn.value).toFixed(4) ;
buff.value += "Линейная\nТочный результат = "+ tocn.value+"\n"+
"По формуле Ньютона = "+ newton.value+"\n"+
"Абс. погрешность по формуле Ньютона = "+ nporg.value+"\n"+
"По формуле Лагранжа = "+ lagr.value+"\n"+
"Абс. погрешность по формуле Лагранжа = "+ lpogr.value +"\n"
;
}
//////////////////////
function kvinterpol(){
let xw1 = parseFloat(xw.value.replace(",", "."));
if(!xw1) {
alert("не все данные введены!");
return;
}
j=1;
while (xw1 > x[j]) {
j ++}
stocn.value = (((Math.pow(xw1, 3) / 2) + 7) - 0.6 * (Math.exp(xw1))).toFixed(4);
snewton.value = (y[j - 2] + ((y[j-1]-y[j-2])/h) *(xw1-x[j-2])+(1/(2*h*h))*(y[j-2]-2*y[j-1]+y[j])*(xw1-x[j-2])*(xw1-x[j-1])).toFixed(4);
slagr.value =(y[j-2]*((xw1-x[j-1])*(xw1-x[j]))/((x[j-2]-x[j-1])*(x[j-2]-x[j]))+y[j-1]*((xw1-x[j-2])*(xw1-x[j]))/((x[j-1]-x[j-2])*(x[j-1]-x[j]))+y[j]*((xw1-x[j-2])*(xw1-x[j-1]))/((x[j]-x[j-2])*(x[j]-x[j-1]))).toFixed(4);
snporg.value = (snewton.value-stocn.value).toFixed(4);
slpogr.value =(slagr.value-stocn.value).toFixed(4) ;
buff.value += "Квадратичная\nТочный результат = "+ stocn.value+"\n"+
"По формуле Ньютона = "+ snewton.value+"\n"+
"Абс. погрешность по формуле Ньютона = "+ snporg.value+"\n"+
"По формуле Лагранжа = "+ slagr.value+"\n"+
"Абс. погрешность по формуле Лагранжа = "+ slpogr.value +"\n"
;
}
ctx.translate(c.width/2, c.height/2);
function sizeGhraph(){
setInterval(function() {
let z = parseInt(z1.value),
r = parseFloat(b.value.replace(",", ".")),
l = parseFloat(a.value.replace(",", ".")),
sizes = z/2.5 +"pt";
ctx.clearRect(-c.height/2,-c.width/2,c.height,c.width);
//главные оси
ctx.strokeStyle = "#00a1ff";
ctx.lineWidth = 3;
ctx.setLineDash([0, 0]);
ctx.beginPath();
for (xs = 0; xs <1; xs ++ ) {
ctx.moveTo(xs * z, -c.height / 2);
ctx.lineTo(xs * z, c.height / 2);
ctx.moveTo(-c.width / 2, -xs * z);
ctx.lineTo(c.width / 2, -xs * z);
}
ctx.stroke();
//выделение границ
ctx.strokeStyle = "#04ff00";
ctx.lineWidth = 3;
ctx.beginPath();
for (xs = 0; xs <1; xs ++ ) {
ctx.moveTo(r*z, -c.height/2);
ctx.lineTo(r*z, c.height/2);
ctx.moveTo(l*z, -c.height/2);
ctx.lineTo(l*z, c.height/2);
}
ctx.stroke();
//cетка
ctx.strokeStyle = "rgba(0,0,0,0.4)";
ctx.lineWidth = 1;
ctx.setLineDash([8, 1]);
ctx.beginPath();
for (xs = -100; xs <= 100; xs ++ ) {
ctx.moveTo(xs*z, -c.height/2);
ctx.lineTo(xs*z, c.height/2);
ctx.moveTo(-c.width/2, xs*z);
ctx.lineTo(c.width/2, xs*z);
}
ctx.stroke();
// график функции
ctx.strokeStyle = '#' + (2342).toString(16);
ctx.setLineDash([0, 0]);
ctx.lineWidth = 4;
ctx.beginPath();
for (i = l; i <= r; i += 0.02) {
ctx[i ? "lineTo" : "moveTo"](i * z, -ys(i) * z);
}
ctx.stroke();
//подпись координат
ctx.fillStyle = "rgb(37,37,41)";
ctx.font = "italic 15pt Arial";
ctx.fillText("x", xs+120, 20);
ctx.fillText("y", -20, -xs-120);
ctx.fillStyle = "rgba(37,37,41,0.83)";
ctx.font = sizes +" Arial";
for (xs = -100; xs <= 100; xs ++ ) {
ctx.fillText(xs.toFixed(1), xs*z, -5);
ctx.fillText(xs.toFixed(1), 5, -xs*z);
}
}, 10)
}
////////////////////
//удаление функции
function clearGraph() {
ys = xs => '';
}
////////////////////////////
//cоздание функции
function createGraph() {
ys = xs => (((Math.pow(xs, 3) / 2) + 7) - 0.6 * (Math.exp(xs))).toFixed(4);// функция
}
/////////////////////////////////////////////////////////////////////////////////////////////////
function clear_buff() {
buff.value = "";
a.focus();
}
function download(data, filename, type) {
let file = new Blob([data], {type: type});
if (window.navigator.msSaveOrOpenBlob)
window.navigator.msSaveOrOpenBlob(file, filename);
else {
let a = document.createElement("a"),
url = URL.createObjectURL(file);
a.href = url;
a.download = filename;
document.body.appendChild(a);
a.click();
setTimeout(function() {
document.body.removeChild(a);
window.URL.revokeObjectURL(url);
}, 0);
}
}
let openFile = function(event) {
let input = event.target,
reader = new FileReader();
reader.onload = function(){
let text = reader.result;
buff.value += text;
};
reader.readAsText(input.files[0]);
};
function copy() {
buff.select();
document.execCommand("copy");
alert("Сохранен в буфер: " +"\n"+ buff.value);
}