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

Министерство образования РФ

Санкт-Петербургский государственный электротехнический

университет «ЛЭТИ»

Кафедра САПР

ЛАБОРАТОРНАЯ РАБОТА № 4

по учебной дисциплине «МЕТОДЫ ОПТИМИЗАЦИИ»

на тему «исследование градиентных методов»

Выполнила:

Студентка ___Никитина Т.И._______

Группа _________2375____________

Руководитель:

Алешкевич Павел Александрович

(должность, Ф.И.О.)

Санкт-Петербург

2004

#include <iostream.h>

#include <conio.h>

#include <math.h>

/*************************Global'nie peremennie******************************/

double p[2],x0[2],a,b;

/******************************Moya funkciya*********************************/

double f(double t)

{

double x[2];

for(int k=0;k<2;k++)

x[k]=x0[k]+t*p[k];

return (100*pow((x[1]-x[0]*x[0]),2)+pow((1-x[0]),2));

}

/**************************Proizvodnaya funkcii******************************/

double df(double t)

{

double x[2];

for(int k=0;k<2;k++)

x[k]=x0[k]+t*p[k];

return ((-400*(x[1]-x[0]*x[0])*x[0]-2*(1-x[0]))*p[0]+200*(x[1]-x[0]*x[0])*p[1]);

}

/**********************Antigradientnoe napravlenie***************************/

void napr()

{

p[0]=400*(x0[1]-x0[0]*x0[0])*x0[0]+2*(1-x0[0]);

p[1]=-200*(x0[1]-x0[0]*x0[0]);

}

/**********************************Norma*************************************/

double norma(double x1[])

{

return(sqrt(pow((x1[0]-x0[0]),2)+pow((x1[1]-x0[1]),2)));

}

/****************************Metod Svenna 4**********************************/

void Swann4(double t)

{

double s=0;

if(t>fabs((f(0)-df(0))/df(0)))

t=fabs((f(0)-df(0))/df(0));

if(df(0)>0)

for(int k=0;k<2;k++)

p[k]=-p[k];

do

{

s=s+t;

t=2*t;

}

while((df(0)*df(s))>0);

a=s-t/2;

b=s;

}

/***************************Ras4etnie formuli********************************/

double gam(double c)

{

double z,w;

z=df(a)+df(b)+3*(f(a)-f(b))/b;

w=sqrt(z*z-df(a)*df(b));

c=a+((z-df(a)+w)/(df(b)-df(a)+2*w))*(b-a);

return c;

}

/*****************************Metod Devidona*********************************/

double Davidon(double e)

{

double c;

Swann4(1);

do

{

c=gam(c);

if(df(c)<0)

a=c;

else

b=c;

}

while(fabs(df(c))>e);

return c;

}

/******************************Metod Koshi***********************************/

void KOSHI(double e)

{

double alfa,x1[2];

int k;

int g=0;

for(k=0;k<2;k++)

x1[k]=x0[k];

do

{

g++;

for(k=0;k<2;k++)

x0[k]=x1[k];

napr();

alfa=Davidon(e);

for(int k=0;k<2;k++)

x1[k]=x0[k]+alfa*p[k];

}

while((norma(x1)>e)||(fabs(f(0)-f(alfa))>e));

for(k=0;k<2;k++)

x0[k]=x1[k];

cout<<"\nKolli4estvo iteraciy: k = "<<g;

}

/***************************Osnovnaya programma******************************/

void main()

{

clrscr();

double x01[2]={-1.2,1};

// double x02[2]={1.5,2};

// double x03[2]={-2,-2};

double e;

int k;

cout<<"\n---Laboratornaya rabota 4. Issledovanie gradientnih metodov.---";

cout<<"\n-------------------------Variant 1-----------------------------";

cout<<"\n------------------------Metod Koshi----------------------------";

cout<<"\n-------------- Vipolnila: Nikitina T., gr. 2375 ---------------";

cout<<"\n\n\nCelevaya funkciya: 100(x2-x1^2)^2+(1-x1)^2";

cout<<"\nNa4al'naya to4ka poiska: Xo = ( -1.2 ; 1 )";

cout<<"\nVvedite to4nost' poiska: E = ";

cin>>e;

KOSHI(e);

cout<<"\nRezul'tat minimizacii: ";

cout<<"( "<<x0[0]<<" ; "<<x0[1]<<" )";

getch();

}

/*********************************The End************************************/

Соседние файлы в папке LABA4
  • #
    01.05.2014408.16 Кб4bcwdef.csm
  • #
    01.05.20143.34 Кб5LABA4.CPP
  • #
    01.05.201434.82 Кб7LABA4.DOC
  • #
    01.05.2014131.07 Кб4LABA4.ilc
  • #
    01.05.201465.54 Кб4LABA4.ild
  • #
    01.05.2014524.29 Кб4LABA4.ilf
  • #
    01.05.2014589.82 Кб4LABA4.ils
  • #
    01.05.201426.42 Кб4laba4.obj