Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №2. Безусловная многомерная оптимизация.doc
Скачиваний:
86
Добавлен:
02.05.2014
Размер:
364.54 Кб
Скачать

Отчет по лабораторной работе №2

по предмету «Методы оптимизации»

на тему: Безусловная многомерная оптимизация

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

Проверил: Хасанов А.Ю.

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

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

Задание: найти точку минимума целевой функции

f(x1, x2) = 20·x1 + 0.4·x2 + exp(0.3·x12 + 0.3·x22), если начальное приближение [0,-1] при заданной точности =10-4.

Используемые методы: в) метод наискорейшего спуска (с использованием метода дихотомии);

г) метод покоординатного спуска с постоянным шагом;

л) метод симплекса;

н) метод поиска по образцу.

Блок-схема метода наискорейшего спуска (с использованием метода дихотомии)

Блок-схема метода покоординатного спуска с постоянным шагом

Блок-схема симплекс-метода

x[1][1]=x[1][0]+r; x[2][1]=x[2][0]; x[1][2]=x[1][0]; x[2][2]=x[2][0]+r; N=0;

y[0]=fx(x[1][0],x[2][0]);

y[1]=fx(x[1][1],x[2][1]);

y[2]=fx(x[1][2],x[2][2]); N=N+3;

l1=0,l2=0;

i=0

да

нет

l2=i

i++

i=2

i=0

да

нет

i=2

да

нет

c1=0,c2=0

X1min=x[1][l1]; X2min=x[2][l1]; fmin=y[l1];

i=0

c1+=x[1][i]; c2+=x[2][i];

да

нет

i++

i=2

c1/=2; c2/=2;

u1=2*c1-x[1][l2]; u2=2*c2-x[2][l2]; y[3]=fx(u1,u2); N++;

да нет

i=0

x[1][l2]=u1;

x[2][l2]=u2;

y[l2]=y[3];

x[1][i]=(x[1][i]+x[1][l1])/2; x[2][i]=(x[2][i]+x[2][l1])/2; y[i]=fx(x[1][i],x[2][i]); N++

да

нет

i++

i=2

r=r/2; N=N+2

Блок-схема поиска по образцу

y[0]=fx(x[1][0],x[2][0]), N=1; t=0

да

нет

да

нет

да

нет

да

нет

t=0; l=1

i=1

l=i

да

нет

i++

i=4

нет да

да

h=h/2;

нет

x[1][l-2]=x[1][0];

x[2][l-2]=x[2][0];

y[l-2]=y[0]; t=l-2;

x[1][l+2]=x[1][0];

x[2][l+2]=x[2][0];

y[l+2]=y[0]; t=l+2;

нет

да

minx1=x[1][0]; minx2=x[2][0]; minf=y[0];

x[1][0]=x[1][l];

x[2][0]=x[2][l];

y[0]=y[l];

Листинг программы метод наискорейшего спуска (с использованием метода дихотомии)

#include <stdio.h>

#include <math.h>

#include <iostream.h>

#include <conio.h>

double Ff(double x1, double x2)

{ double f;

f=20*x1+0.4*x2+exp(0.3*x1*x1+0.3*x2*x2);

return(f);

}

double Fx1(double x1, double x2)

{double f1;

f1=20+0.6*x1*exp(0.3*x1*x1+0.3*x2*x2);

return(f1);

}

double Fx2(double x1, double x2)

{double f2;

f2=0.4+0.6*x2*exp(0.3*x1*x1+0.3*x2*x2);

return(f2);

}

void main ()

{ int k,i,N,N0,N1,l1,l2;

double a,b,d,ymin,xmin1,xmin2,e0,alpha;

double x[3000][2]; double y[10];

x[0][1]=0;

x[0][2]=-1;

e0=0.0001;

double e2,z1,z2,y1,y2,e,p,alpmin,g1,g2;

int m;

e2=0.00025;

e=0.0002;

FILE*f=fopen("d:\\lab1.xls","w");

fprintf(f,"%Lf\t%Lf\n",x[0][1],x[0][2]);

cout<<"Metod naiskor. spuska"<<endl;

k=0; N0=0; N1=0;

z1=Fx1(x[0][1],x[0][2]);

z2=Fx2(x[0][1],x[0][2]);

N1+=2;

alpha=2.2;

mm1:

m = 0;

y1=Ff(x[k][1],x[k][2]);N0++;

metka:

y2=Ff(x[k][1]-(m+1)*alpha*z1,x[k][2]-(m+1)*alpha*z2);

N0++;

if (y2<y1)

{m++;y1=y2;goto metka;}

else

{ b=(m+1)*alpha;

if (m==0)

{a=0;}

else {a=(m-1)*alpha;}

}

do {

p=(a+b)/2;

g1=Ff(x[k][1]-(p-0.0001)*z1,x[k][2]-(p-0.0001)*z2);

N0++;

g2=Ff(x[k][1]-(p+0.0001)*z1,x[k][2]-(p+0.0001)*z2);

N0++;

if (g1<g2)

{b=p+0.0001;}

else {a=p-0.0001;}

} while ((b-a)/2>e);

alpmin=(a+b)/2;

cout<<"\nk="<<k+1<<endl;

x[k+1][1]=x[k][1]-alpmin*z1; cout<<"\nx[1][1]="<<x[k+1][1];

x[k+1][2]=x[k][2]-alpmin*z2; cout<<"\nx[1][2]="<<x[k+1][2]<<endl;

z1=Fx1(x[k+1][1],x[k+1][2]);

z2=Fx2(x[k+1][1],x[k+1][2]);

N1+=2;

d=pow(z1*z1+z2*z2,0.5);

if (d>e2)

{k++;goto mm1;}

else {xmin1=x[k+1][1];

xmin2=x[k+1][2];

ymin=Ff(xmin1,xmin2);

cout<<"x1="<<xmin1<<" x2="<<xmin2<<" ymin="<<ymin<<endl<<"N1="<<N1;

cout<<" N0="<<N0<<" k="<<k+1<<endl;

}

getch();

fclose(f);

}