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

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

Уфимский Государственный Авиационный Технический Университет

Лабораторная работа №3

МЕТОД ГРАДИЕНТНОГО СПУСКА

Выполнила студентка

группы ВМ-226 т:

Курамшина А.Р.

Проверил

преподаватель:

Шерыхалина Н.М.

Уфа 2006

1 Цель работы

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

2 Описание метода

Задача состоит в отыскании минимума функции двух переменных f(x,y) (следует отметить, что если необходимо найти максимум некоторой функции F(x,y), то эта задача сводится к поиску минимума функции f(x,y)=F(x,y) ).

Большинство численных методов состоит в отыскании некоторой последовательности (x0,y0), (x1,y1),..,(xk,yk), которая при k®¥ (или при k®kM) сходится к точке минимума (x*,y*). Если при этом выполняется f(x0,y0)>f(x1,y1)>..>f(xk,yk), то есть значения функции монотонно убывают при увеличении k, то такой метод называется методом спуска.

Известно, что вектор градиента функции

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

;

(5.1)

.

Выбор величины ak, с которой связана длина k-го шага, в общем случае является сложной задачей. Если ak мало, то движение будет слишком медленным и потребует значительного объема вычислений. Если ak велико, то существует возможность перескочить точку минимума и выйти на противоположный склон функции. При этом возможно нарушение требования монотонного убывания последовательности f(xk,yk) и появляется опасность зацикливания, то есть колебания последовательности (xk,yk) в некоторой окрестности точки минимума (x*,y*) без приближения к ней.

Существует несколько различных способов выбора ak. В данной работе рассматривается разновидность метода с дроблением шага. Для этого задается начальное приближение (x0,y0) и начальное значение a0 (например, x0=y0=0, 0=1). Вычисление x1,y1 и всех последующих xk+1,yk+1 производится по формуле (5.1). При этом если окажется, что f(xk+1,yk+1)>f(xk,yk), то величина ak уменьшается в два раза и вычисление xk+1,yk+1 повторяется от точки (xk,yk) с новым значением ak. Если же значение функции убывает, то величина ak=ak1.

Критерием окончания счета принимается неравенство

(5.2)

либо одновременное выполнение двух неравенств

, . (5.3)

Листинг программы

#include <iostream.h>

#include <stdio.h>

#include <math.h>

void main()

{

float a,b,c,d,e;

float x[9999],y[9999],fxy[9999],r[9999];

cout<<"VVedite dla uravnenia f(x,y)=ax+bx+e^(cx^2+dy^2) koeffizent a:"<<endl; cin>>a;

cout<<"b:"<<endl; cin>>b;

cout<<"c:"<<endl; cin>>c;

cout<<"d:"<<endl; cin>>d;

cout<<"vvedite to4nost' e:"; cin>>e;

int n=0;

power: n++;

x[0]=0;

y[0]=0;

r[0]=1;

fxy[0]=1;

x[n]=x[n-1]-r[n-1]*(a+2*c*x[n-1]*exp(c*x[n-1]*x[n-1]+d*y[n-1]*y[n-1]));

y[n]=y[n-1]-r[n-1]*(b+2*d*y[n-1]*exp(c*x[n-1]*x[n-1]+d*y[n-1]*y[n-1]));

fxy[n]=a*x[n]+b*y[n]+exp(c*x[n]*x[n]+d*y[n]*y[n]);

if(fxy[n]>fxy[n-1])

{

r[n]=r[n-1]/2;

}

else

{

r[n]=r[n-1];

} cout<<"f[n]"<<fxy[n]<<endl;

if(fabs(a+2*c*x[n-1]*exp(c*x[n-1]*x[n-1]+d*y[n-1]*y[n-1]))>=e/2 && fabs(b+2*d*y[n-1]*exp(c*x[n-1]*x[n-1]+d*y[n-1]*y[n-1]))>=e/2) goto power;

else

{

cout<<"r["<<n<<"]="<<r[n]<<endl;

cout<<"x["<<n<<"]="<<x[n]<<endl<<"y["<<n<<"]="<<y[n]<<endl<<"f(x,y)="<<fxy[n]<<endl;

};

}

пример

Рассмотим выполнение программы на примере функции , где

a

b

c

d

1

-1.4

0.01

0.11

2

-1.3

0.04

0.12

VVedite dla uravnenia f(x,y)=ax+bx+e^(cx^2+dy^2) koeffizent a:

1

b:

-1.4

c:

0.01

d:

0.11

vvedite to4nost' e:0.0001

f[1]=-1.70693

f[2]=-3.38065

f[3]=-4.24626

f[4]=-4.96938

f[5]=-5.61447

f[6]=-6.18591

f[7]=-6.68664

f[8]=-7.11966

f[9]=-7.48826

f[10]=-7.7964

f[11]=-8.04873

f[12]=-8.25068

f[13]=-8.40834

f[14]=-8.5282

f[15]=-8.61688

f[16]=-8.68071

f[17]=-8.72544

f[18]=-8.756

f[19]=-8.77641

f[20]=-8.78975

f[21]=-8.79831

f[22]=-8.80372

f[23]=-8.8071

f[24]=-8.80919

f[25]=-8.81046

f[26]=-8.81124

f[27]=-8.81171

f[28]=-8.81199

f[29]=-8.81216

f[30]=-8.81226

f[31]=-8.81232

f[32]=-8.81235

f[33]=-8.81237

f[34]=-8.81239

f[35]=-8.81239

f[36]=-8.8124

f[37]=-8.8124

f[38]=-8.8124

f[39]=-8.8124

f[40]=-8.8124

f[41]=-8.8124

f[42]=-8.81241

f[43]=-8.81241

f[44]=-8.81241

f[45]=-8.81241

f[46]=-8.81241

r[46]=1

x[46]=-11.2509

y[46]=1.43215

f(x,y)=-8.81241

Press any key to continue

VVedite dla uravnenia f(x,y)=ax+bx+e^(cx^2+dy^2) koeffizent a:

2

b:

-1.3

c:

0.04

d:

0.12

vvedite to4nost' e:0.001

f[1]=-4.25265

f[2]=-7.25985

f[3]=-8.23204

f[4]=-8.54052

f[5]=-8.59224

f[6]=-8.59782

f[7]=-8.59863

f[8]=-8.59875

f[9]=-8.59911

f[10]=-8.5992

f[11]=-8.59947

f[12]=-8.59955

f[13]=-8.59976

f[14]=-8.59984

f[15]=-8.6

f[16]=-8.60007

f[17]=-8.6002

f[18]=-8.60025

f[19]=-8.60035

f[20]=-8.6004

f[21]=-8.60048

f[22]=-8.60052

f[23]=-8.60058

f[24]=-8.60062

f[25]=-8.60067

f[26]=-8.60069

f[27]=-8.60073

f[28]=-8.60076

f[29]=-8.60079

f[30]=-8.60081

f[31]=-8.60083

f[32]=-8.60085

f[33]=-8.60087

f[34]=-8.60088

f[35]=-8.6009

f[36]=-8.60091

f[37]=-8.60092

f[38]=-8.60093

f[39]=-8.60094

f[40]=-8.60095

f[41]=-8.60096

f[42]=-8.60097

f[43]=-8.60097

f[44]=-8.60098

f[45]=-8.60098

f[46]=-8.60099

f[47]=-8.60099

f[48]=-8.601

f[49]=-8.601

f[50]=-8.601

f[51]=-8.601

f[52]=-8.60101

f[53]=-8.60101

f[54]=-8.60101

f[55]=-8.60101

f[56]=-8.60101

f[57]=-8.60102

f[58]=-8.60102

f[59]=-8.60102

f[60]=-8.60102

f[61]=-8.60102

f[62]=-8.60102

f[63]=-8.60102

f[64]=-8.60102

f[65]=-8.60102

f[66]=-8.60102

f[67]=-8.60102

f[68]=-8.60102

f[69]=-8.60102

f[70]=-8.60102

f[71]=-8.60103

f[72]=-8.60103

f[73]=-8.60103

f[74]=-8.60103

f[75]=-8.60103

f[76]=-8.60103

f[77]=-8.60103

f[78]=-8.60103

f[79]=-8.60103

f[80]=-8.60103

f[81]=-8.60103

f[82]=-8.60103

f[83]=-8.60103

f[84]=-8.60103

f[85]=-8.60103

f[86]=-8.60103

f[87]=-8.60103

f[88]=-8.60103

f[89]=-8.60103

f[90]=-8.60103

f[91]=-8.60103

f[92]=-8.60103

f[93]=-8.60103

f[94]=-8.60103

f[95]=-8.60103

f[96]=-8.60103

f[97]=-8.60103

f[98]=-8.60103

f[99]=-8.60103

f[100]=-8.60103

f[101]=-8.60103

r[101]=1

x[101]=-5.69418

y[101]=1.23396

f(x,y)=-8.60103

Press any key to continue

Соседние файлы в папке Лабораторные работы1