ΠΠ»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π°ΠΏΠΏΡΠΎΠΊΡΠΈΠΌΠ°ΡΠΈΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ Π½Π°ΠΈΠΌΠ΅Π½ΡΡΠΈΡ ΠΊΠ²Π°Π΄ΡΠ°ΡΠΎΠ² (ΠΠΠ) Π΄Π»Ρ ΠΏΠΎΠ»ΠΈΠ½ΠΎΠΌΠ° 5-ΠΉ ΡΡΠ΅ΠΏΠ΅Π½ΠΈ, Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠ΅ΡΠΈΡΡ ΡΠΈΡΡΠ΅ΠΌΡ Π»ΠΈΠ½Π΅ΠΉΠ½ΡΡ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠΉ Π²ΠΈΠ΄Π°:
S x A = Y
ΠΠ΄Π΅: S β ΠΌΠ°ΡΡΠΈΡΠ° ΡΡΠΌΠΌ ΡΡΠ΅ΠΏΠ΅Π½Π΅ΠΉ x, A β Π²Π΅ΠΊΡΠΎΡ ΠΈΡΠΊΠΎΠΌΡΡ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΠΎΠ², Y β Π²Π΅ΠΊΡΠΎΡ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΡ ΡΠ»Π΅Π½ΠΎΠ² (ΡΡΠΌΠΌΡ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠΉ ΡΡΠ΅ΠΏΠ΅Π½Π΅ΠΉ x Π½Π° y).
ΠΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠΏΡΠ°Π²ΠΊΠ°
ΠΠ»Ρ ΠΏΠΎΠ»ΠΈΠ½ΠΎΠΌΠ° ΠΏΡΡΠΎΠΉ ΡΡΠ΅ΠΏΠ΅Π½ΠΈ Π½Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΌΠ°ΡΡΠΈΡΠ° ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ 6x6. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΡΠ½ΠΎΠ³ΠΎ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΠ΅Π»Π΅ΠΉ (ΠΊΠ°ΠΊ Π² Π²Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π΄Π»Ρ 2-ΠΉ ΡΡΠ΅ΠΏΠ΅Π½ΠΈ) Π΄Π»Ρ ΡΠ°ΠΊΠΎΠΉ ΡΠ°Π·ΠΌΠ΅ΡΠ½ΠΎΡΡΠΈ ΠΊΡΠ°ΠΉΠ½Π΅ Π½Π΅ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΠΈ ΡΡΠ΅Π²Π°ΡΠΎ ΠΎΡΠΈΠ±ΠΊΠ°ΠΌΠΈ. ΠΡΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ ΠΠ°ΡΡΡΠ°.
javascript
const byFifthDegreeLeastSquaresApproximation = (coordinatesArray) => {
const n = 6; // ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΠΎΠ² Π΄Π»Ρ 5-ΠΉ ΡΡΠ΅ΠΏΠ΅Π½ΠΈ
const size = coordinatesArray.length;
// Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠ°ΡΡΠΈΡΠ΅Π½Π½ΡΡ ΠΌΠ°ΡΡΠΈΡΡ (n ΡΡΡΠΎΠΊ Π½Π° n+1 ΡΡΠΎΠ»Π±ΡΠΎΠ²)
const matrix = Array.from({ length: n }, () => new Array(n + 1).fill(0));
// 1. ΠΠ°ΠΏΠΎΠ»Π½ΡΠ΅ΠΌ ΠΌΠ°ΡΡΠΈΡΡ ΡΡΠΌΠΌΠ°ΠΌΠΈ ΡΡΠ΅ΠΏΠ΅Π½Π΅ΠΉ x ΠΈ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠΉ x^k * y
for (let i = 0; i < size; i++) {
const { x, y } = coordinatesArray[i];
for (let row = 0; row < n; row++) {
// ΠΠ°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΠΎΠ² ΡΠΈΡΡΠ΅ΠΌΡ
for (let col = 0; col < n; col++) {
// Π‘ΡΠ΅ΠΏΠ΅Π½Ρ x Π±ΡΠ΄Π΅Ρ ( (n-1-row) + (n-1-col) )
// ΠΠ΄Π΅ΠΌ ΠΎΡ x^10 Π΄ΠΎ x^0
matrix[row][col] += Math.pow(x, (n - 1 - row) + (n - 1 - col));
}
// ΠΠ°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠ°Π²ΠΎΠΉ ΡΠ°ΡΡΠΈ (ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΡ
ΡΠ»Π΅Π½ΠΎΠ²)
matrix[row][n] += Math.pow(x, n - 1 - row) * y;
}
}
// 2. Π Π΅ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ ΠΠ°ΡΡΡΠ° (ΠΏΡΡΠΌΠΎΠΉ ΠΈ ΠΎΠ±ΡΠ°ΡΠ½ΡΠΉ Ρ
ΠΎΠ΄)
for (let i = 0; i < n; i++) {
// ΠΠΎΠΈΡΠΊ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π² ΡΡΠΎΠ»Π±ΡΠ΅ (Π΄Π»Ρ ΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡΠΈ)
let max = i;
for (let k = i + 1; k < n; k++) {
if (Math.abs(matrix[k][i]) > Math.abs(matrix[max][i])) max = k;
}
[matrix[i], matrix[max]] = [matrix[max], matrix[i]];
// ΠΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΎΠΌΡ Π²ΠΈΠ΄Ρ
for (let k = i + 1; k < n; k++) {
const c = -matrix[k][i] / matrix[i][i];
for (let j = i; j <= n; j++) {
if (i === j) {
matrix[k][j] = 0;
} else {
matrix[k][j] += c * matrix[i][j];
}
}
}
}
// ΠΠ±ΡΠ°ΡΠ½ΡΠΉ Ρ
ΠΎΠ΄
const res = new Array(n).fill(0);
for (let i = n - 1; i >= 0; i--) {
res[i] = matrix[i][n] / matrix[i][i];
for (let k = i - 1; k >= 0; k--) {
matrix[k][n] -= matrix[k][i] * res[i];
}
}
// ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΡ ΠΎΡ x^5 Π΄ΠΎ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ»Π΅Π½Π°
return {
a: res[0], // x^5
b: res[1], // x^4
c: res[2], // x^3
d: res[3], // x^2
e: res[4], // x^1
f: res[5] // ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ°
};
};
const getFifthDegreeLineByLeastSquaresApproximation = (points) => {
const coeffs = byFifthDegreeLeastSquaresApproximation(points);
const { a, b, c, d, e, f } = coeffs;
return x =>
(a * Math.pow(x, 5)) +
(b * Math.pow(x, 4)) +
(c * Math.pow(x, 3)) +
(d * Math.pow(x, 2)) +
(e * x) + f;
};ΠΠ»ΡΡΠ΅Π²ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ:
- Π£Π½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΠΎΡΡΡ: ΠΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠΈΠΊΠ»Ρ Π΄Π»Ρ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ ΠΌΠ°ΡΡΠΈΡΡ, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π»Π΅Π³ΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΡΠ΅ΠΏΠ΅Π½Ρ ΠΏΠΎΠ»ΠΈΠ½ΠΎΠΌΠ° Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ (ΠΏΡΠΎΡΡΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² n).
- ΠΠ΅ΡΠΎΠ΄ ΠΠ°ΡΡΡΠ°: Π ΡΡΠ½ΠΎΠΉ ΡΠ°ΡΡΠ΅Ρ ΡΠΎΡΠΌΡΠ» (ΠΊΠ°ΠΊ k1, k2, l Π² Π²Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅) Π΄Π»Ρ 5-ΠΉ ΡΡΠ΅ΠΏΠ΅Π½ΠΈ Π·Π°Π½ΡΠ» Π±Ρ ΡΠΎΡΠ½ΠΈ ΡΡΡΠΎΠΊ ΠΊΠΎΠ΄Π° ΠΈ Π±ΡΠ» Π±Ρ ΠΊΡΠ°ΠΉΠ½Π΅ Π½Π΅ΡΡΠ°Π±ΠΈΠ»Π΅Π½.
- ΠΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅: Π‘ΠΎΠ±Π»ΡΠ΄Π΅Π½ΠΎ Π²Π°ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ.
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΠΠΎΠ»ΠΈΠ½ΠΎΠΌΡ Π²ΡΡΠΎΠΊΠΈΡ ΡΡΠ΅ΠΏΠ΅Π½Π΅ΠΉ (Π²ΡΡΠ΅ 3-4) ΠΎΡΠ΅Π½Ρ ΡΡΠ²ΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½Ρ ΠΊ ΡΠΎΡΠ½ΠΎΡΡΠΈ Π΄Π°Π½Π½ΡΡ ΠΈ ΠΌΠΎΠ³ΡΡ Π²Π΅ΡΡΠΈ ΡΠ΅Π±Ρ Π½Π΅ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΠΎ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΎΡΠΊΠ°ΠΌΠΈ (ΡΡΡΠ΅ΠΊΡ Π ΡΠ½Π³Π΅). Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Ρ Π²Π°Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π΄Π°Π½Π½ΡΡ (ΠΌΠΈΠ½ΠΈΠΌΡΠΌ 6 ΡΠΎΡΠ΅ΠΊ) Π΄Π»Ρ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ ΡΠ°ΠΊΠΎΠΉ ΠΊΡΠΈΠ²ΠΎΠΉ.