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

MV_Lab1

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

//2 вариант
const a = 2
const b = -1.3
const c = 0.04
const d = 0.12

// Заданная точность решения
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 ) {//функция от след точек больше 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()
Соседние файлы в предмете Методы вычислений