Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
9
Добавлен:
01.05.2014
Размер:
172.03 Кб
Скачать

Спецификация функций.

Имя функции

Назначение

Входные параметры

Возвращаемое значение

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;

}

Соседние файлы в папке Лабораторная работа №111