Статья по теме:
Демо JavaScript:
Для интерполяции заданной функции необходимо выбрать узлы, через которые будет проходить многочлен Нютона. Необходимо выбрать минимум 3 точки, нажав на левую кнопку мыши (не обязательно нажимать на сам график функции), и нажать кнопку "Старт".
var canvas = document.getElementById('canvas'); var ctx = canvas.getContext('2d'); var imageData; let x = new Array(canvas.width); let fx = new Array(canvas.height); // Массив, через точки которого будет построен ногочлен Ньютона let xMouse = []; // Сдвиг координат let offset = 300; // Получить (x,y) кордианты курсора, в момент нажатия function getCursorPosition(canvas, event) { const rect = canvas.getBoundingClientRect(); let tmp = (event.clientX - rect.left) | 0; xMouse.push(tmp); } // Интерполируем функцию по заданным точкам function Newton() { let yMouse = []; let n = xMouse.length; if (n <= 2) { alert("Недостаточно узлов интерполяции"); return; } // Точки, через которые должен пройти многочлен for (let i = 0; i < n; i++) { yMouse[i] = fx[xMouse[i]]; } for (let i = 0; i < n; i++) { ctx.fillStyle = "purple"; ctx.fillRect(xMouse[i] - 4, yMouse[i] - 4, 8, 8); } // Массив для раздленымх разностей let fi = new Array(n); for (let i = 0; i < n; i++) { fi[i] = new Array(n).fill(0); } // Находим разделеные разности let k = 0; for (let a = 0; a < n; a++) { for (let b = 0; b < n; b++) { fi[a].shift(); } } for (let j = 0; j < n; j++) { for (let i = 0; i < n - j; i++) { if (j == 0) { fi[i].push(yMouse[i]); } else { fi[i].push((fi[i + 1][j - 1] - fi[i][j - 1]) / (xMouse[i + k] - xMouse[i])); } } k++; } // Строим полином Ньютона let P = []; for (let k = 0; k < canvas.width; k++) { let Pi = []; for (let i = 0; i < n; i++) { if (i == 0) { Pi.push(fi[0][0]); } else { let tmp = 1; for (let j = 0; j < i; j++) { tmp = tmp * (x[k] + offset - xMouse[j]); } Pi.push(tmp * fi[0][i]); } } let tmp = 0; for (let q = 0; q < n; q++) { tmp += Pi[q]; } P.push(tmp); } // Рисуем полином ctx.beginPath(); ctx.lineWidth = 3 ctx.strokeStyle = "red"; for (let i = 0; i < canvas.width; i++) { if (i == 0) { ctx.moveTo(i, P[i]); } ctx.lineTo(i, P[i]); } ctx.stroke(); ctx.closePath(); } function start() { // Красим канвас ctx.fillStyle = "#ccc"; ctx.fillRect(0, 0, 600, 600); // Рисуем Координатную плоскость ctx.beginPath(); ctx.moveTo(300, 0); ctx.lineTo(300, 600); ctx.moveTo(0, 300); ctx.lineTo(600, 300); ctx.stroke(); ctx.closePath(); ctx.beginPath(); // Рисуем функцию ctx.lineWidth = 3; for (let i = 0; i < canvas.width; i += 1) { x[i] = i - offset; fx[i] = -Math.abs(x[i] * x[i] / 60 + 2 * x[i] - 70) + offset; if (i == 0) { ctx.moveTo(x[i] + offset, fx[i]); } ctx.lineTo(x[i] + offset, fx[i]); } ctx.stroke(); ctx.closePath(); // Клик мыши canvas.addEventListener('mousedown', function (e) { getCursorPosition(canvas, e) }) } start();