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

gradient

.js
Скачиваний:
11
Добавлен:
31.03.2021
Размер:
2.91 Кб
Скачать
// Точность вывода на экран
const PRECISION = 6

//14 вариант
const a = 14
const b = -0.1
const c = 1.69
const d = 0.24

// Заданная точность решения
const eps = 0.0001

// Заданная функция f(x,y)=ax+by+e^(cx^2 + dy^2)
function f(x, y) {
    return a*x + b*y + Math.exp(c*x**2 + d*y**2)
}

// Производная f по x: a + 2cxe^(cx^2 + dy^2)
function derivativeX(x, y) {
    return a + 2*c*x * Math.exp(c*x**2 + d*y**2)
}

// Производная f по y: b + 2dye^(cx^2 + dy^2)
function derivativeY(x, y) {
    return b + 2*d*y * Math.exp(c*x**2 + d*y**2)
}

// Градиент по заданной функции
function gradientF(x, y) {
    return {
        x: derivativeX(x, y),
        y: derivativeY(x, y)
    }
}

// длина шага
let alpha = 1

// Вычисление следующей точки
function nextPoint(x, y) {
    const grad = gradientF(x, y)
    return {
        x: x - alpha * grad.x,
        y: y - alpha * grad.y
    }
}

// Длина градиента
function lengthGradient(grad) {
    return Math.sqrt(grad.x**2 + grad.y**2)
}

// Точка входа в программу
function main() {
    console.log(`a: ${a}`)
    console.log(`b: ${b}`)
    console.log(`c: ${c}`)
    console.log(`d: ${d}`)

    // Начальная точка
    let x = 0
    let y = 0

    console.log(`Пусть начальная точка: (${x}, ${y})`)

    // результирующая таблица
    const table = []

    let grad = gradientF(x, y)
    
    // Пока длина градиента больше заданной точности
    while (lengthGradient(grad) >= eps) {
        const next = nextPoint(x, y)
        const currentValue = f(x,y)

        // Если шаг слишком длинный, то укорачиваем шаг
        if ( f(next.x, next.y) > currentValue ) {
            alpha = alpha / 2
            grad = gradientF(x, y)
        } else {
            // Добавляем в таблицу результатов
            table.push({
                x: x.toFixed(PRECISION),
                y: y.toFixed(PRECISION),
                'f(x,y)': currentValue.toFixed(PRECISION),
                'dF/dx': grad.x.toFixed(PRECISION),
                'dF/dy': grad.y.toFixed(PRECISION),
                'alpha': alpha.toFixed(PRECISION)
            });
            
            // Запоминаем следующую точку 
            ({x, y} = nextPoint(x, y))

            // Вычисляем градиент
            grad = gradientF(x, y)
        }
    }

    // Выводим результаты
    console.table(table)
    console.log(`f min = f(${x}, ${y}) = ${f(x,y)}`)
}

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