Лабораторная работа - многомерная безусловная оптимизация. Вариант 5 - файл n1.docx
Лабораторная работа - многомерная безусловная оптимизация. Вариант 5скачать (118.5 kb.)
Доступные файлы (1):
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="<
m1:
x[2*k+1][1]=x[2*k][1]-alpha*dFx1(x[2*k][1],x[2*k][2]); N1++;
cout<<"\nx[1][1]="<
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="<
cout<<"N="<
getch();
}
}
Графики
В) метод наискорейшего спуска

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 |
Г) метод покоординатного спуска

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 |
|
Оптимальное решение достигается в методе наискорейшего спуска за наименьшее количество экспериментов.