Лабораторная работа №42 / Lab_4 / отчет4
.doc1.Цель работ
Разработка программы многомерной минимизации целевых функций на основе применения простых градиентных методов поиска.
В программе использовать метод циклического покоординатного спуска;
Функция f(x) |
Начальная точка x1 |
Значение минимума x* |
3(x1-4)^2 + 5(x2+3)^2 + 7(2x3+1)^2 |
( 2; -2; 2 ) ( 0; 0; 0 ) |
(4; -3; -0.5) |
2.Краткое описание методов
Метод Циклического покоординатного спуска
На каждой итерации находится минимум в данном направлении по каждой координате.
Начальный этап: задаем:
х 1 –начальная точка ( 2; -2; 2 )
е – погрешность вычисления е=10-3 - 10-7
основной этап:
-
Вычислить антиградиент с помощью функции antigrad().
2. Взять производную от функции в новой точке, где xn+1 = xn + Ln*pk и, приравняв к нулю, найти Ln
3. Перейти в новую точку xn+1 = xn + Ln*pk
4. Проверить критерий окончания поиска: Length( x1, x2 )>e2, где функция находит расстояние между двумя точками. Если условии выполняется, то минимум найден( х2 ), иначе перейти на шаг 1).
6.Текст программы с комментариями
#include <iostream.h>
#include <conio.h>
#include <math.h>
#include <stdio.h>
int i=1;
// структура для вектора
struct vect {
double x; //координата х
double y; //координата у
double z; //координата z
double norm() {return sqrt(x*x+y*y+z*z);} //норма вектора
};
// возвращаем значение функции у от вектора х
double y(vect &x)
{
return 3*(x.x-4)*(x.x-4)+5*(x.y+3)*(x.y+3)+7*(2*x.z+1)*(2*x.z+1);
}
// заданная функция
double y(double x, double y, double z)
{
return 3*(x-4)*(x-4)+5*(y+3)*(y+3)+7*(2*z+1)*(2*z+1);
}
//считаем длину вектора
double Length(vect &x1, vect &x2)
{
return sqrt((x1.x-x2.x)*(x1.x-x2.x)+(x1.y-x2.y)*(x1.y-x2.y)+(x1.z-x2.z)*(x1.z-x2.z));
}
//функция для прехода в новую точку
double f(double a, double x0, double p)
{
double x;
x = x0 + p * a;
return x;
}
inline vect antiGrad(vect &point,double e=0.000001)
{
vect px; px.x=point.x+e; px.y=point.y; px.z=point.z;
vect py; py.x=point.x; py.y=point.y+e; py.z=point.z;
vect pz; pz.x=point.x; pz.y=point.y; pz.z=point.z+e;
vect res;
res.x=-(y(px)-y(point))/e;
res.y=-(y(py)-y(point))/e;
res.z=-(y(pz)-y(point))/e;
return res;
}
//овражный метод
void CPS( vect &x1, double e2=0.0001 )
{
vect x2;
vect a, p;
int k=0;
printf("\nЦиклический покоординатный спуск:\n");
printf("\nШаг, x1 x2 \n");
do
{ //координаты вспомогательной точки
p = antiGrad(x1);
if( p.x != 0 )
a.x = (4-x1.x)/p.x;
if( p.y != 0 )
a.y = (-3-x1.y)/p.y;
if( p.z != 0)
a.z = (-0.5-x1.z)/p.z;
x2.x=f( a.x, x1.x, p.x );
x2.y=f( a.y, x1.y, p.y );
x2.z=f( a.z, x1.z, p.z );
printf("%d [%f %f %f] \t[%f %f %f]\n",i,x1.x,x1.y,x1.z,x2.x,x2.y,x2.z);
if( k=(Length(x1,x2)>e2))
{
x1.x = x2.x;
x1.y = x2.y;
x1.z = x2.z;
}
i++;
}
while(k);
printf("\n\tMinimum: [%f %f %f]", x2.x, x2.y, x2.z );
}
void main()
{
vect x0={2,-2,-2};
clrscr();
CPS(x0);
getch();
}
4.Спецификация программы
Имя переменной |
Тип переменной |
Значение переменной |
x , y, z |
double |
Координаты для векторов |
norm |
double |
Норма вектора |
р |
Struct vect |
Направление |
х1 |
Struct vect |
Начальная точка |
х2 |
Struct vect |
Вспомогательная точка |
a |
Struct vect |
Шаг для каждой точки |
е2 |
double |
погрешность |
к |
int |
Для проверки КОП |
i |
int |
Счетчик |
5.Таблица, иллюстрирующая вычислительный процесс и изменение ключевых переменных.
Циклический покоординатный спуск:
координаты начальных точек
x0 x0*
[ 2, -2, -2 ] [ 0, 0, 0 ]
основной цикл( для x0 )
x1 x2
1 [ 2, -2, -2 ] [ 4, -3, -0.5 ]
2 [ 4, -3, -0.5 ] [ 4, -3, -0.5 ]
Result: [ 4, -3, -0.5 ]
основной цикл( для x1 )
x1 x2
1 [ 0, 0, 0 ] [ 4, -3, -0.5 ]
2 [ 4, -3, -0.5 ] [ 4, -3, -0.5 ]
Result: [ 4, -3, -0.5 ]
8.Выводы
В данной работе были изучены простые градиентные методы поиска. минимума целевых функций. В работе был применен метод Циклического Покоординатного Спуска. В обоих случаях минимум находится за одну итерацию.
7.Контрольные вопросы
-
Представить первую итерацию аналитического решения задачи Вашего варианта задания.
-
Сравнить методы М4 – М7 с точки зрения организации поиска.
-
Дана функция y(x) = x12 + x22 + x32 – 4x1 – 8x2 – 12x3 + 100. Исследовать характер стационарной точки.
-
Аналитическим методом найти минимум функции y(x) = (x2 – – x1)2 + (1 – x1)2.
-
Аналитическим методом найти точку экстремума функции y(x1, х2, x3) = x12 + 2x22 + 5x32 – 2x1x2 – 4x2x3 – 2x3.
Ответы на вопросы.