Вы находитесь на странице: 1из 6

Министерство науки и высшего образования Российской Федерации

ФГБОУ ВО
«Уфимский государственный авиационный технический университет»

Кафедра ТОЭ

Лабораторная работа
по дисциплине «Вычислительная математика»

«Лабораторная работа №1»

Выполнил:
студент гр.
Сергеев Д.С.

Проверил:
преподаватель
Шерыхалина Н. М.

Уфа 2021
Содержание
1 МЕТОД ГРАДИЕНТНОГО СПУСКА...........................................................................................3
1.1 Постановка задачи....................................................................................................................3
1.2 Решение задачи.........................................................................................................................3
1.3 Программный код.....................................................................................................................4
1.4 Тестирование............................................................................................................................6

Изм. Лист № докум. Подп. Дата

Разраб. Сергеев Д.С. Лит. Лист Листов

Пров. Шерыхалина Н.М. 2 3


У
Рецен. ФИО Лабораторная работа №1
Н.контр. ФИО УГАТУ СТС-209
Утв.. ФИО
1 МЕТОД ГРАДИЕНТНОГО СПУСКА

1.1 Постановка задачи


2
+dy2
Минимизировать функцию f (x , y )=ax+by+e cx методом
градиентного спуска с точностью до ee=10-4. Коэффициенты для тестирования:
1 1 -1.4 0.01 0.11
19 19 0.4 3.24 0.29
Представить два варианта расчета: с коэффициентами из верхней и нижней
частей таблицы. Объяснить разницу в работе алгоритма.

1.2 Решение задачи


Задача состоит в отыскании минимума функции двух переменных f(x,y). Для
нахождения точки возьму обратное направление градиента:

∂f ∂f
grad f ( x , y ) = ( ,
∂x ∂ y ) 1.1
Координаты точек пересчитываются по формулам

∂f (x k , y k )
xk+1=xk −α k ,
∂ x
∂f (x k , y k )
y k+1= y k −αk .
∂ y 1.2
, где aak – длина шага, которая будет уменьшаться по ходу цикла, чтобы
соответствовать нужной точности.
Критерием окончания счета приму неравенства:

∂f ε ∂f ε
| |< | |<
∂x 2 , ∂y 2 1.3
Для подсчета необходимо проинтегрировать следующую функцию:
2 2

f (x , y )=ax +by +e c x +d y 1.4


Дифференцирование по x:

3
Изм. № докум. Подп. Дата
∂f 2 2

=a+2 xc e c x +d y 1.5
∂x
Дифференцирование по y:
∂f 2 2

=b+2 yd ec x + d y 1.6
∂y

1.3 Программный код


С помощью вышеописанных теоретических данных напишу программу для
#include <iostream>
нахождения точки минимума:
#include <math.h>
using namespace std;

double f(double x, double y, double a, double b, double c, double d)


{
double func;
func = a*x + b*y +exp(c*pow(x, 2)+d*pow(y, 2));
return func;
}
Программа
double dfx(double x, ждет ввода
double a, b,a,c, double
y, double d дляb,подсчета
double c, функции
double d) и её производной.
{
Далееdouble
запускается
func; цикл нахождение минимума до тех пор, пока выполняется
func = a + 2*c*x*exp(c * pow(x, 2) + d * pow(y, 2));
условие
return, func; 1 .3. Внутри цикла подсчитывается точка по 1 .2, а также в случае
}
неточности
double dfy(doubleизменяется длина
x, double y, double шага.
a, double В b,каждой
double c,итерации
double d) цикла выводятся
{
промежуточные
double func; вычисления. В конце выводится конечный результат вычислений
func = b + 2*d*y*exp(c * pow(x, 2) + d * pow(y, 2));
return func;
}
В программном коде использовались следующие функции:
int main()
{ 1) f() - подсчет и вывод значения функции.
setlocale(LC_ALL, "Russian");
2) dfx()
double – подсчет
x = 0, и вывод
y = 0, alpha = 1; дифференциала функции по x.
double e = 0.00005;
3) dfy()
double – подсчет и вывод дифференциала функции по y.
x2, y2;
double a, b, c, d;
cout << "ax+by+e^(cx^2+dy^2)" << endl<< "Введите a: " ;
1.4 >> Тестирование
cin a;
cout << endl << "Введите b: " << endl;
Для>>тестирования
cin b; использую следующие варианты данных:
cout << endl << "Введите c: " << endl;
cin >> 1c; 1 -1.4 0.01 0.11
cout << endl << "Введите d: " << endl;
19
cin >> d;
19 0.4 3.24 0.29
Результаты
while тестирования
(abs(dfx(x, y, a, b, c, d))(Рисунок
> e or 1, Рисунокy,2):
abs(dfy(x, a, b, c, d)) > e)
{
x2 = x - alpha * dfx(x, y, a, b, c, d);
y2 = y - alpha * dfy(x, y, a, b, c, d);
cout << x << " " << y << " " << f(x, y, a, b, c, d) << " " << dfx(x, y, a, b, c,
d) << " " << dfy(x, y, a, b, c, d)<<endl;
if (f(x2, y2, a, b, c, d) > f(x, y, a, b, c, d))
{
alpha /= 2;
}
else
{
x = x2;
y = y2;
}
}
cout << " x y f(x) dx dy"<< endl;
cout <<"Точка минимума: "<< x << " " << y << " " << f(x, y, a, b, c, d) << " " << 3
Изм. dfx(x, № a, b, c, Подп.
y,докум. d) << "Дата
" << dfy(x, y, a, b, c, d) << endl;

}
Рисунок 1

Рисунок 2
Вывод:
В ходе выполненной работы я ознакомился с методами поиска экстремума
нелинейной выпуклой функции нескольких переменных и решением таких задач с
помощью ЭВМ.

3
Изм. № докум. Подп. Дата