Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
Министерство образования и науки РФ
Федеральное государственное бюджетное общеобразовательное учреждение
высшего профессионального образования
"Уфимский государственный авиационный технический университет"
Кафедра АПрИС
Отчет
по лабораторной работе №4
по дисциплине "Методы оптимизации"
Вариант №2
Выполнил: ст.гр. ИВТ-203
Арсланова А.
Проверил: доцент кафедры
Хасанов А.Ю.
Уфа-2013
Тема: Безусловная многомерная оптимизация
Цель работы: знакомство с методами многомерной безусловной оптимизации нулевого порядка.
Задание: решить задачу оптимизации следующим методом многомерной безусловной оптимизации:
- метод с оптимальным шагом(наискорейший спуск).
F(x1,x2)=129x12-256x1x2+129x22-51x1-149x2-27;
x1=49.904669
x2=50.095331
y=-5031.671206
График функции:
Блок-схема программы:
Листинг программы:
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include<iomanip>
using namespace std;
const int N = 10000;
long double fx(long double x1, long double x2)
{
long double f;
f = 129 * x1*x1 - 256 * x1*x2 + 129 * x2*x2 - 51 * x1 - 149 * x2 - 27;
return(f);
}
long double fz1(long double x1, long double x2)
{
long double f;
f = 258 * x1 - 256 * x2 - 51;
return(f);
}
long double fz2(long double x1, long double x2)
{
long double f;
f = -256 * x1 + 258 * x2 - 149;
return(f);
}
double perebor(double ax1, double ax2, double az1, double az2, double aa, double ab)
{
int i, l;
double min, yr, a, b, L;
double *x, *y;
int N;
N = 51;
x = new double[N];
y = new double[N];
a = aa; b = ab;
for (i = 1; i <= N; i++)
{
x[i] = a + i*((b - a) / (N + 1));
y[i] = fx(ax1 - x[i] * az1, ax2 - x[i] * az2);
}
min = y[1];
l = 1;
for (i = 1; i <= N; i++)
{
if (y[i] <= min) {
min = y[i];
l = i;
}
}
L = x[l];
yr = y[l];
return L;
}
void GaussZeiden()
{
double *x1, *x2, e, xr1, xr2, yr, z1, z2, L, d, h, a1, b1, a2, b2, L1, L2;
int mm, mm1, mm0, k;
x1 = new double[100000];
x2 = new double[100000];
if (x1 == NULL) { cout << "Нетдинамическойпамяти\n"; _getch(); return; }
if (x2 == NULL) { cout << "Нетдинамическойпамяти\n"; _getch(); return; }
cout << "e= "; cin >> e;
h=0.361;
mm1 = 0; k = 0; mm0 = 0;
x1[0] = 1;
x2[0] = 1;
do{
z1 = fz1(x1[k], x2[k]);
z2 = fz2(x1[k], x2[k]);
mm1 = mm1 + 1;
find(x1[k], x2[k], z1, z2, h, a1, b1, mm0);
L1 = perebor(x1[k], x2[k], z1, z2, a1, b1);
x1[k + 1] = x1[k] - L1*z1;
x2[k + 1] = x2[k];
z1 = fz1(x1[k + 1], x2[k + 1]);
z2 = fz2(x1[k + 1], x2[k + 1]);
mm1 = mm1 + 1;
find(x1[k + 1], x2[k + 1], z1, z2, h, a2, b2, mm0);
L2 = perebor(x1[k + 1], x2[k + 1], z1, z2, a2, b2);
x1[k + 2] = x1[k + 1];
x2[k + 2] = x2[k + 1] - L2*z2;
d = sqrt(pow(x1[k + 2] - x1[k], 2) + pow(x2[k + 2] - x2[k], 2));
k = k + 2;
} while (d>e);
xr1 = x1[k];
xr2 = x2[k];
yr = fx(xr1, xr2);
mm = mm1 + mm0;
cout << "x1= " << xr1 << endl;
cout << "x2= " << xr2 << endl;
cout << "y= " << yr << endl;
cout << "mm0= " << mm0 << endl;
cout << "mm1= " << mm1 << endl;
cout << "mm= " << mm << endl;
cout << "k= " << k << endl;
delete[]x1;
delete[]x2;
_getch();
}
void GrPostShag()
{
long double *x1, *x2, e, xr1, xr2, yr, z1, z2, L;
int mm, k, h;
x1 = new long double[100000];
x2 = new long double[100000];
if (x1 == NULL) { cout << "Нетдинамическойпамяти\n"; _getch(); return; }
if (x2 == NULL) { cout << "Нетдинамическойпамяти\n"; _getch(); return; }
cout << "e= "; cin >> e;
L = 0.0005;
x1[0] = 1;
x2[0] = 1;
z1 = fz1(x1[0], x2[0]);
z2 = fz2(x1[0], x2[0]);
mm = 2; k = 0;
poka:
x1[k + 1] = x1[k] - L*z1;
x2[k + 1] = x2[k] - L*z2;
z1 = fz1(x1[k + 1], x2[k + 1]);
z2 = fz2(x1[k + 1], x2[k + 1]);
//out<<x1[k+1]<<endl;
//out<<x2[k+1]<<endl;
mm = mm + 2;
if (sqrt(pow(z1, 2) + pow(z2, 2))>e) {
k = k + 1;
goto poka;
}
else{
xr1 = x1[k + 1];
xr2 = x2[k + 1];
yr = fx(xr1, xr2);
}
cout << "xr1= " << x1 << endl;
cout << "xr2= " << x2 << endl;
cout << "yr= " << y << endl;
cout << "mm= " << mm << endl;
cout << "k= " << k << endl;
delete[]x1;
delete[]x2;
_getch();
}
void main()
{
int i;
setlocale(LC_ALL, "Russian");
while (1)
{
system("cls");
cout << "1. Градиентный метод с оптимальным шагом.\n";
cout << "2. Градиентный метод с дроблением шага.\n";
cout << "3. Покоординатный метод с постоянным шагом.\n";
cout << "4. Метод покоординатного спуска с оптимальным шагом.\n";
cout << "5. Градиентный метод с постоянным шагом.\n";
cout << "6. Выход из программы.\n";
cout << " \n";
cout << "Ваш выбор:(1-6) \n"; cin >> i;
switch (i)
{
case 1: GrOptimShag(); break;
case 2: GrDroblShaga(); break;
case 3: PokoordPostShag(); break;
case 4: GaussZeiden(); break;
case 5: GrPostShag(); break;
case 6: cout << "Конец работы.\n";
_getch();
exit(0);
default: cout << i << " - нет такого пункта. \n";
cout << "Повторите: \n";
_getch(); break;
}
}
}
Результаты вычислений:
Покоординатный метод с оптимальным шагом:
точность E |
x1' |
x2' |
y' |
mm |
mm1 |
mm2 |
k |
E |
0,1 |
49.775814 |
50.099902 |
-5031.571318 |
108 |
54 |
162 |
52 |
0.012898 |
0,01 |
49.908973 |
50.099982 |
-5031.670474 |
132 |
66 |
198 |
66 |
0.006337 |
0,001 |
49.906654 |
50.097041 |
-5031.67119 |
172 |
86 |
258 |
86 |
0.002619 |
0,0001 |
49.904676 |
50.095404 |
-5031.671206 |
204 |
102 |
306 |
102 |
0.000073 |
0,00001 |
49.90465 |
50.095309 |
-5031.671206 |
224 |
112 |
336 |
112 |
0.0000029 |
Градиентный метод с постоянным шагом:
точность E |
x1' |
x2' |
y' |
mm |
k |
E |
0,1 |
49.869331 |
50.059993 |
-5031.668709 |
14464 |
7230 |
0.035513 |
0,01 |
49.901134 |
50.091795 |
-5031.671181 |
19066 |
9531 |
0.004999 |
0,001 |
49.904316 |
50.094977 |
-5031.671206 |
23670 |
11833 |
0.000473 |
0,0001 |
49.904634 |
50.095295 |
-5031.671206 |
28272 |
14134 |
0.000036 |
0,00001 |
49.904666 |
50.095327 |
-5031.671206 |
32876 |
16436 |
0.0000039 |
Траектории точек:
Вывод: В ходе проделанной работы я ознакомилась с методами многомерной безусловной оптимизации нулевого порядка.