Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ аппроксимации ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Π½Π°ΠΈΠΌΠ΅Π½ΡŒΡˆΠΈΡ… ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² (МНК) для ΠΏΠΎΠ»ΠΈΠ½ΠΎΠΌΠ° 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;
};

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ измСнСния:

  1. Π£Π½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ: Код ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ†ΠΈΠΊΠ»Ρ‹ для построСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹, Ρ‡Ρ‚ΠΎ позволяСт Π»Π΅Π³ΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ ΠΏΠΎΠ»ΠΈΠ½ΠΎΠΌΠ° Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ (просто ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² n).
  2. ΠœΠ΅Ρ‚ΠΎΠ΄ Гаусса: Π ΡƒΡ‡Π½ΠΎΠΉ расчСт Ρ„ΠΎΡ€ΠΌΡƒΠ» (ΠΊΠ°ΠΊ k1, k2, l Π² вашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅) для 5-ΠΉ стСпСни занял Π±Ρ‹ сотни строк ΠΊΠΎΠ΄Π° ΠΈ Π±Ρ‹Π» Π±Ρ‹ ΠΊΡ€Π°ΠΉΠ½Π΅ нСстабилСн.
  3. ИмСнованиС: БоблюдСно вашС ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ имСнования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΠŸΠΎΠ»ΠΈΠ½ΠΎΠΌΡ‹ высоких стСпСнСй (Π²Ρ‹ΡˆΠ΅ 3-4) ΠΎΡ‡Π΅Π½ΡŒ Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ ΠΊ точности Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ вСсти сСбя нСпрСдсказуСмо ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ (эффСкт Π ΡƒΠ½Π³Π΅). Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Ρƒ вас достаточно Π΄Π°Π½Π½Ρ‹Ρ… (ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ 6 Ρ‚ΠΎΡ‡Π΅ΠΊ) для построСния Ρ‚Π°ΠΊΠΎΠΉ ΠΊΡ€ΠΈΠ²ΠΎΠΉ.