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

1.Цель работ

Разработка программы многомерной минимизации целевых функций на основе применения простых градиентных методов поиска.

В программе использовать метод циклического покоординатного спуска;

Функция 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

основной этап:

  1. Вычислить антиградиент с помощью функции 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.Контрольные вопросы

  1. Представить первую итерацию аналитического решения задачи Вашего варианта задания.

  2. Сравнить методы М4 – М7 с точки зрения организации поиска.

  3. Дана функция y(x) = x12 + x22 + x32 – 4x1 – 8x2 – 12x3 + 100. Исследовать характер стационарной точки.

  4. Аналитическим методом найти минимум функции y(x) = (x2 – – x1)2 + (1 – x1)2.

  5. Аналитическим методом найти точку экстремума функции y(x1х2x3) = x12 + 2x22 + 5x32 – 2x1x2 – 4x2x3 – 2x3.

Ответы на вопросы.

Соседние файлы в папке Lab_4