Лабораторная работа - многомерная безусловная оптимизация. Вариант 5 - файл n1.docx

Лабораторная работа - многомерная безусловная оптимизация. Вариант 5
скачать (118.5 kb.)
Доступные файлы (1):
n1.docx119kb.06.07.2012 23:03скачать

n1.docx

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

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

По дисциплине «Методы оптимизации»

Многомерная безусловная оптимизация (методы первого и нулевого порядков)

Проверил:

Хасанов А.Ю.

Уфа 2009

Цель работы: знакомство с методами многомерной безусловной оптимизации первого и нулевого порядка и их освоение, сравнение эффективности применения этих методов конкретных целевых функций.
Задание.
найти точку минимума целевой функции f(x)=f(x(1), x(2))= a*x(1)+b*x(2)+ e c*(x ) +d*(x )


варианта

Целевая функция

Начальное приближение

Точность решения

a

b

c

d

5

3

-1,2

0,02

1,3

(0;-1)

0,00005


Методы многомерной безусловной оптимизации:
в) метод наискорейшего спуска (с использованием метода золотого сечения);

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

е) эвристический алгоритм;

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

Блоксхемы программ
В)Метод наискорейшего спуска

Подпрограмма метода золотого сечения:



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

Е) эвристический алгоритм





























































Л) Симплекс-метод


































































Тексты программ.
В) метод наискорейшего спуска( с использованием метода золотого сечения)
#include

#include

#include

#include
double f(double x1, double x2)

{ double f;

f=3*x1-1.2*x2+exp(0.02*x1*x1+1.3*x2*x2);

return(f);

}

double df1(double x1, double x2)

{double f1;

f1=3+0.04*x1*exp(0.02*x1*x1+1.3*x2*x2);

return(f1);

}

double df2(double x1, double x2)

{double f2;

f2=-1.2+2.6*x2*exp(0.02*x1*x1+1.3*x2*x2);

return(f2);

}
double zsech(double a,double b,double x1k,double x2k,double z1,double z2)

{

double eps=0.00005;

double x1,x2,y1,y2,t;

t=(1+sqrt(5))/2;

x1=a+(b-a)/(t*t);

y1=f(x1k-x1*z1,x2k-x1*z2);

x2=a+ (b-a)/t;

y2=f(x1k-x2*z1,x2k-x2*z2);

while((b-a)/t>2*eps){

if(y1
else { a=x1; x1=x2; y1=y2; x2=a+b-x1; y2=f(x1k-x2*z1,x2k-x2*z2);}

}

if(y1
else a=x1;

return ((a+b)/2);

}

void main ()

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

double a,b,d,ymin,xmin1,xmin2,e2,dalph;

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

clrscr();

x[0][1]=0;

x[0][2]=-1;

e2=0.00005;

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

int m;


cout<<"Metod naiskor. spuska"<
k=0; N0=0; N1=0;

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

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

N1=N1+2;

dalph=2.2;

mm1:

m = 0;

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

metka:

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

N0++;

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

else

{ b=(m+1)*dalph;

if (m==0)

{a=0;}

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

}


alpmin=zsech(a,b,x[k][1],x[k][2],z1,z2);

cout<<"\nk="<
x[k+1][1]=x[k][1]-alpmin*z1; cout<<"\nx[1][1]="<
x[k+1][2]=x[k][2]-alpmin*z2; cout<<"\nx[1][2]="<
z1=df1(x[k+1][1],x[k+1][2]);

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

N1=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=f(xmin1,xmin2);

cout<<"x1="<
x[2*k+1][2]=x[2*k][2];

cout<<"\nx[1][2]="<
x[2*k+2][1]=x[2*k+1][1];

x[2*k+2][2]=x[2*k+1][2]-alpha*dFx2(x[2*k+1][1],x[2*k+1][2]);N1++;
d=pow ((pow(x[2*k+2][1]-x[2*k][1],2)+ pow(x[2*k+2][2]-x[2*k][2],2)),0.5);

if (d>e0) {k++; cout<<"\nk="<
else {xmin1=x[2*k+2][1];xmin2=x[2*k+2][2];ymin=f(xmin1,xmin2);cout<<"\nx1="<
cout<<"x1 = "<
cin>>file1;

cout<<"imya dlya x2";cin>>file2;

fout.open(file1);

if (fout==NULL){cout<
getch();exit(1);}

out.open(file2);

if (out==NULL){cout<
getch();exit(1);}

*/ cout<<"Metod simplex"<
long double **x = new long double *[2];

for(int p=1;p<3;p++)

x[p]=new long double[200];

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

long double r=2.5,e=0.00005;

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;
cout<<"\nx11="<
// cout<<""<
}

else { for(int i=0;i<3;i++)

if(i!=l1)

{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]);

// fout<<" "<
cout<<""<
}

r=r/2;

} goto metka;

}

else{ long double minx1,minx2,minf;

minx1=x[1][l1];

minx2=x[2][l1];

minf=y[l1];

cout<<"X1min="<

X1

X2

0,000000

-1,000000

-0,428995

0,535827

-5,065700

-0,759228

-5,375934

0,351561

-8,023413

-0,389036

-8,178027

0,163624

-9,251548

-0,136674

-9,316736

0,096362

-9,726535

-0,017606

-9,752071

0,074222

-9,917522

0,030986

-9,917522

0,066358

-9,977144

0,049868

-9,980896

0,063435

-10,003650

0,057158

X1

X2

-10,013676

0,059948

-10,014224

0,061919

-10,017524

0,061004

-10,017733

0,061760

-10,018999

0,061410

-10,019079

0,061699

-10,019560

0,061565

-10,019591

0,061675

-10,019775

0,061624

-10,019787

0,061667

-10,019858

0,061647

-10,019862

0,061663

-10,019889

0,061656

-10,019891

0,061662


Г) метод покоординатного спуска

graph2.ashx.png


X1

X2

-0.09

-1

-0,1798

-0,67775

-0,26949

-0,54564

-0,35907

-0,44687

-0,44855

-0,36557

-0,53795

-0,29551

-1,60244

0,176279

-2,04023

0,261465

-2,38747

0,300108

-2,90296

0,325256

-3,4116

0,327247

-4,32407

0,304421

-5,43879

0,257795

-6,55253

0,203429

-7,54601

0,154673

-8,563

0,110008

-9,38858

0,080183

-9,65846

0,071817

-9,83643

0,066669

-10,012

0,06187

-10,0186

0,061696

-10,0189

0,061689


Е) эвристический алгоритм




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



Вывод
В результате проделанной работы было найдено оптимальное решение путем применения следующих методов:


Метод

X1min

X2min

f(X1,X2)

N

k

Метод наискорейшего спуска

-10,019891

0,061662

-22,648621

118

29

Метод покоординатного спуска

-10,018853

0,061688

-22,64862

562

281

Эвристический метод

-10,019879

0,061662

-22,648621

578

2

Симплекс-метод


-10,01915

0,061707

-22,648621

283






Оптимальное решение достигается в методе наискорейшего спуска за наименьшее количество экспериментов.

Учебный материал
© nashaucheba.ru
При копировании укажите ссылку.
обратиться к администрации