Спецификация функций.
Имя функции |
Назначение |
Входные параметры |
Возвращаемое значение |
main |
Главная функция в программе |
|
|
f |
Вычисляет значение функции в заданной точке одной из функций |
vec x |
double |
dif |
Нахождение производной по направлению |
vecx, vec p |
double
|
grad |
Вычисление градиента в точке |
vec x |
vec
|
gs1
|
Метод золотого сечения 1 |
vecx– начальная точка vecp– направление поиска минимума doublee– точность вычислений |
double Значение шага «а»: x2=x+a*p, гдеx2 значение минимума |
Input |
Функция для ввода начальной точки и выбора функции |
|
|
minimum |
Метод поиска Хука-Дживса |
vecx– начальная точка doublee– точность вычислений int M– количество итераций |
vec значение минимума |
IP1 |
Исследующий поиск |
vecx-начальная точка doublee– точность boola– индикатор удачности поиска |
vec – пробная точка |
uslovie |
Проверка принадлежности точки заданной области |
vec x |
true, false |
mod |
Вычисление нормы вектора |
vecp– вектор, норму которого необходимо вычислить |
double
|
mul |
Произведение векторов |
vecx1, vec x2 |
matrix – значение произведения |
mulvec |
Поэлементное произведение векторов |
vec x1, vec x2 |
vec |
svenn4 |
Метод Свенна 4 |
vecx-начальная точкаvecp-направлениеdoublealpha- шаг |
массив al, заполненный значениямиakиak-1 |
Результаты тестирования программы.
(1; 0) |
Начальная точка (5,5)
Точность 0,0001
Минимум (1,0)
Число итераций 3
Начальная точка (10,15)
Точность 0,0001
Минимум (1,0)
Число итераций 3
Начальная точка (-5,1)
Точность 0,0001
Минимум: Начальная точка не принадлежит заданной области.
Ответы на контрольные вопросы.
1) Сформулировать необходимые и достаточные условия условного минимума.
Необходимое условие экстремума:
Пусть x* -точка экстремума. Тогда найдутся числаa0,a1,a2… не равные одновременно 0 и такие, что выполняется условия:
-условие стационарности обобщенной функции Лагранжа по x:
-условие допустимости решения:
gi(x)=0
Достаточное условие экстремума:
Пусть имеется точка (x*,a*). Если в этой точкедля всех ненулевыхdxтаких, что
, то точка х* является точкой локального минимуму (иначе максимума)
2)Составить математическую модель задачи оптимизации методом Ньютона для тестовой функции (45).
8 |
0 |
2 |
0 |
2 |
-1 |
2 |
-1 |
0 |
∆ x1 |
∆ x2 |
a |
-8*x1-4 |
-2*x2+8 |
-2*x1+x2+6 |
3) Решить аналитически задачу нелинейного программирования y(x) = (x1 + x2) min при g1(x) = x12 – x2 ≤ 0; g2(x) = –x1 ≤ 0 методом внутренних штрафных функций.
Целевая функция имеет вид
В точке x(r) безусловного минимума по х функцииF(x,r) ее частные производные поx1 и х2 должны быть равны 0:
Неотрицательными решениями этих уравнений будут
Если устремить rк 0, то получимx1=0,x2=0-минимум функции.
4) Привести пример формирования вспомогательной функции в методе внешних штрафов.
В соответствии с методом внешней точки штрафы Wk(x/E) строят так , чтобыWk(x/E)=0для всех х. Вспомогательная функция будет иметь вид
Пример: рассмотрим задачу Возьмем штрафную функцию
Вспомогательная функция
5) Дать характеристику методу барьерных функций.
Метод барьерных функций является одним из наиболее распространенных методов решения задач нелинейного программирования. Основная идея заключается в сведении задачи с ограничениями к последовательности задач безусловной минимизации подобранных специальным образом вспомогательных целевых функций. При этом решение задачи нелинейного программирования получается в результате предельного перехода к последовательности решения задач безусловной оптимизации.
6) В чем различие между методами Бокса и Нелдера–Мида?
Существует два отличия метода Бокса от метода Нелдера-Мида:
1) Симплекс строят на N=2nточках
2) Предполагается выбрать начальную точку из допустимой области, а остальные точки сгенерировать датчиком случайных чисел.
7) Пояснить конструирование возможного направления в методе проекции градиента.
Возможное конструирование вектора направления определяется из условия проекции вектора
на аппроксимирующую плоскость, задаваемую уравнением
Текст программы
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include "Matrix.h"
int num;
int fun;
int iter=100;
double al[3]={0,0,0};
time_t t;
double f(vec l)
{
switch(fun)
{
case 2: return (l.x[0]+1)*(l.x[0]+1)*(l.x[0]+1)*1/3+l.x[1]; break;
}
return 0;
}
bool uslovie(vec x){
if (x.x[0]-1>=0 && x.x[1]>=0)
return true;
else
return false;
}
vec grad(vec x)
{
vec q;
matrix E;
int i;
double h=0.000001;
for(i=0;i<num;i++)
E.M[i].x[i]=1;
for(i=0;i<num;i++)
q.x[i]=(f(x+E.M[i]*h)-f(x-E.M[i]*h))/(2*h);
return q;
}
double mod(vec x)
{
int i;
double m=0;
for(i=0;i<num;i++)
m+=pow(x.x[i],2);
return sqrt(m);
}
matrix mul(vec x,vec y)
{
matrix A(num);
for(int i=0;i<num;i++)
for(int j=0;j<5;j++)
A.M[i].x[j]=x.x[i]*y.x[j];
return A;
}
vec mulvec(vec x, vec y)
{
vec res(num);
for (int i=0; i<num; i++)
res.x[i]=x.x[i]*y.x[i];
return res;
}
double dif(vec x, vec p)
{
double h=0.001;
return((f(x+p*h)-f(x))/h);
}
void svenn4(vec x,vec p,double alpha)
{
vec x1;
if(dif(x,p)>0) alpha=-alpha;
x1=x;
al[1]=0;
al[2]=0;
al[0]=0;
do
{
al[0]+=alpha;
x1=x1+p*alpha;
alpha*=2;
}
while(dif(x,p)*dif(x1,p)>0);
al[2]=alpha/2;
al[0]-=alpha/2;
}
double gs1 (vec x, vec p, double e)
{
double x1,x2;
int kk=1;
al[1]=al[0]+al[2];
x1=al[0]+0.618*fabs(-al[0]+al[1]);
x2=al[0]+0.382*fabs(-al[0]+al[1]);
while(fabs(al[1]-al[0])>e)
{
if(f(x+p*x1)>f(x+p*x2))
{
al[1]=x1;
x1=x2;
x2=al[0]+0.382*fabs(al[1]-al[0]);
}
else
{
al[0]=x2;
x2=x1;
x1=al[0]+0.618*fabs(al[1]-al[0]);
}
kk++;
}
return ((al[0]+al[1])/2);
}
vec IP1(vec x, bool &a, double h){
vec x2(num);
vec x3(num);
vec e1(num);
vec e2(num);
e1.x[0]=1;
e1.x[1]=0;
e2.x[0]=0;
e2.x[1]=1;
x2 = x+e1*h;
a=true;
if (f(x2)<f(x)&& uslovie(x2)){
x3=x2+e2*h;
if(f(x3)<f(x2) && uslovie(x3))
return x3;
else{
x3=x2-e2*h;
if(f(x3)<f(x2) && uslovie(x3))
return x3;
}
return x2;
}
x2=x-e1*h;
if (f(x2)<f(x)&& uslovie(x2)){
x3=x2+e2*h;
if(f(x3)<f(x2)&& uslovie(x3))
return x3;
else{
x3=x2-e2*h;
if(f(x3)<f(x2)&& uslovie(x3))
return x3;
}
return x2;
}
x2=x+e2*h;
if(f(x2)<f(x) && uslovie(x2))
return x2;
x2=x-e2*h;
if (f(x2)<f(x)&& uslovie(x2) )
return x2;
a=false;
return x;
}
vec IP2(vec x, vec x1,bool &a, double h){
vec x2(num);
vec x3(num);
vec e1(num);
vec e2(num);
e1.x[0]=1;
e1.x[1]=0;
e2.x[0]=0;
e2.x[1]=1;
a=true;
x2 = x + e1*h;
if (f(x2)<f(x1) && uslovie(x2)){
x3=x2+e2*h;
if(f(x3)<f(x2)&& uslovie(x3) )
return x3;
else{
x3=x2-e2*h;
if(f(x3)<f(x2)&& uslovie(x3))
return x3;
}
return x2;
}
x2=x-e1*h;
if (f(x2)<f(x1)&& uslovie(x2)){
x3=x2+e2*h;
if(f(x3)<f(x2)&& uslovie(x3))
return x3;
else{
x3=x2-e2*h;
if(f(x3)<f(x2) && uslovie(x3))
return x3;
}
return x2;
}
x2=x+e2*h;
if(f(x2)<f(x1)&& uslovie(x2))
return x2;
x2=x-e2*h;
if (f(x2)<f(x1)&& uslovie(x2) )
return x2;
a=false;
return x;
}
vec minimum (vec x, double e){
double b=2;
vec x2(num);
vec x3(num);
vec x4(num);
bool a;
double q=1;
x2=x;
double h=2;
while (1){
a=false;
while (!a){
h=h*0.5;
x2=IP1(x,a,h);
if (h<e) return x2;
}
a=true;
while (a)
{
x3 = x2+(x2-x)*q;
while (!uslovie(x3))
{
q = q*0.5;
x3 = x2+(x2-x)*q;
}
q=1;
x=x2;
x4=IP2(x3,x,a,h);
if (a){
x2=x4;
}
}
}
return x;
}
void Input()
{
int i=0;
fun=2;
num=2;
vec X(num);
double x;
cout<<"Vvedite X0 :"<<endl;
while (i<num)
{
cin>>x;
X.x[i]=x;
i++;
}
double eps = 0.01;
X=minimum(X, eps);
cout<<"Minimumm: ";
i=0;
while (i<num)
{
cout<<X.x[i]<<" ";
i++;
}
}
main(){
system("cls");
char ch=0;
while (ch!=27){
cout<<"1) 1/3*(x1+1)^3+x2"<<endl;
Input();
cout<<"Press <esc> for exit.";
cout<<endl;
ch = getch();
system("cls");
}
return 0;
}