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

extrapolation

.js
Скачиваний:
13
Добавлен:
31.03.2021
Размер:
2.94 Кб
Скачать
// точность вывода на экран
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)
}

// Метод Ромберга, повторная экстраполяция
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()
Соседние файлы в предмете Методы вычислений