Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

extrapolation

.js
Скачиваний:
4
Добавлен:
25.11.2022
Размер:
2.92 Кб
Скачать
// точность вывода на экран
const signs = 2

// заданное альфа
const a = 1.1

// Для уменьшения объема расчетов величина Q обычно выбирается равной 2 
// как наименьшему натуральному числу, большему 1
const q = 2

/**
 * Частичная сумма ряда
 * @param {number} n - кол-во элементов ряда
 */
function z(n) {
    let sum = 0
    for (let i = 1; i <= n; i++) {
        sum += i ** (-a)
    }
    return sum
}

/**
 * Экстраполяция по правилу Ричардсона
 * @param {Function} z - функция получения частичной суммы ряда
 * @param {number} n - кол-во элементов ряда
 * @param {number} k - порядок точности
 * @returns {number}
 */


function extrapolation(z, n, k) {
    zn = z(n)
    return zn + (zn - z(n / q)) / (q ** k - 1) //формула 2.6
}

// Метод Ромберга, повторная экстраполяция
function extrapolation2(z, n) {
    const first = (n1) => extrapolation(z, n1, a - 1)
    return extrapolation(first, n, a)
}


function main() {
    const zExact = 10.5844484649508098 // точное значение суммы ряда z
    const result = []
    for (let n = 2; n <= 65536; n *= 2) {
        const delta = (extrapolation(z, n, a - 1) - zExact) / (z(n) - zExact)
        const delta2 = (extrapolation2(z, n) - zExact) / (extrapolation(z, n, a - 1) - zExact)
        result.push({
            // заданное разбиение
            n,

            "z*": (extrapolation(z, n, a - 1)).toFixed(signs),

            // абслютная погрешность
            "z(n) - z": (z(n) - zExact).toFixed(signs),

            // Правило Рунге, погрешности приближенного значения zn
            "z(n) - z*": (z(n) - extrapolation(z, n, a - 1)).toExponential(signs),

            // Разница между экстрап. по Ричардсону и точной
            "z* - z": (extrapolation(z, n, a - 1) - zExact).toExponential(signs),

            // оценка погрешности z(n), (z*-z)/(zn-z)
            "delta": delta.toExponential(signs),

            // дважды и точная
            "z** - z": n > 2 ? (extrapolation2(z, n) - zExact).toExponential(signs) : '-',

            // оценка погрешности дважды экстраполированного значения z*
            // отношение размытости между экстраполяциями
            // (z**-z)/(z*-z)
            "delta*": n > 2 ? delta2.toExponential(signs) : '-',
        })
    }

    console.table(result)
}

main()
Соседние файлы в предмете Методы вычислений