Безусловная одномерная оптимизация

Автор работы: Пользователь скрыл имя, 13 Сентября 2012 в 21:14, лабораторная работа

Краткое описание

Цель работы: знакомство с оптимизационными задачами, изучение различных методов одномерной оптимизации и сравнение эффективности их применения для конкретных целевых функций.

Условие задачи:


Целевая функция
Отрезок [a,b]
Точность  или число экспериментов N
7
[0,2]
=5*10-3

Содержание работы

1. Цель работы………………………………………………………………………………….3
2. Условие задачи………………………………………………………………………………3
3. График функции……………………………………………………………………………..3
4.1. Пассивный оптимальный алгоритм………………………………………………………..4
4.2. Алгоритм блочного равномерного поиска………………………………………………...7
4.3. Алгоритм деления интервала пополам…………………………………………………...11
4.4. Метод дихотомии…………………………………………………………………………..13
4.5. Метод золотого сечения…………………………………………………………………...15
4.6. Метод Фибоначчи………………………………………………………………………….17
4.7. Метод касательных………………………………………………………………………...20
4.8. Метод парабол……………………………………………………………………………...22
4.9. Таблица результатов сравнения рассмотренных методов………………………………26
4.10. Вывод……………………………………………………………………………………...26

Содержимое работы - 1 файл

лаба 1.doc

— 1.70 Мб (Скачать файл)

        getch();

}

 

Блок-схема:

 

 

 

 

 

Метод Фибоначчи

 

Листинг функции:

void FibMet(double a,double b,double E)

{

        double d=E/100;

        double fib[3];

        double x[2],y[2],xw,yw;

        fib[0]=1;

        fib[1]=1;

        fib[2]=2;

        int N=2;

        do

        {

                fib[0]=fib[1];

                fib[1]=fib[2];

                fib[2]=fib[0]+fib[1];

                N++;

        }

        while(fib[2]<=(b-a)/(2*E));

        x[0]=a+((b-a)/fib[2])*fib[0];

        x[1]=a+((b-a)/fib[2])*fib[1];

        y[0]=F(x[0]);

        y[1]=F(x[1]);

        for(int i=3;i<N;i++)

        {

                if(y[0]<y[1])

                {

                        b=x[1];

                        x[1]=x[0];

                        y[1]=y[0];

                        x[0]=a+b-x[1];

                        y[0]=F(x[0]);

                }

                else

                {

                        a=x[0];

                        x[0]=x[1];

                        y[0]=y[1];

                        x[1]=a+b-x[0];

                        y[1]=F(x[1]);

                }

        }

        if(y[0]<y[1])

        {

                b=x[1];

                x[1]=x[0];

                y[1]=y[0];

        }

        else

                a=x[0];

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

        y[0]=F(x[0]);

        if(y[0]<y[1])

                b=x[1];

        else

                a=x[0];

        xw=(a+b)/2;

        yw=F(xw);

        cout<<"Metod chisel Fibbonachi:\nx'="<<xw<<"\ny'="<<yw<<"\nN="<<N<<"\nPress any key\n";

        getch();

}

 

Блок-схема:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Метод касательных

 

Листинг функции:

void KasMet(double a,double b,double E)

{

        double z[2],y[2],s,yr,zr,xw,yw;

        cout<<"funkciya vipuklaya na vsem intervale, => metod primenim\n";

        y[0]=F(a);

        z[0]=Fp(a);

        y[1]=F(b);

        z[1]=Fp(b);

        int N=4;

        do

        {

                s=((z[1]*b-z[0]*a)-(y[1]-y[0]))/(z[1]-z[0]);

                yr=F(s);

                zr=Fp(s);

                if(zr==0)

                {

                        xw=s;

                        yw=yr;

                        break;

                }

                if(zr>0)

                {

                        b=s;

                        y[1]=yr;

                        z[1]=zr;

                }

                else

                {

                        a=s;

                        y[0]=yr;

                        z[0]=zr;

                }

                N+=2;

        }

        while(b-a>2*E);

        if(zr!=0)

        {

                xw=(a+b)/2;

                yw=F(xw);

        }

        cout<<"Metod kasatelnih:\nx'="<<xw<<"\ny'="<<yw<<"\nN="<<N<<"\nPress any key\n";

        getch();

}

 

Блок-схема:

 

 

 

 

 

 

 

 

Метод парабол

 

Листинг функции:

void ParMet(double a,double b,double E)

{

              int N;

              double c=1.361;

              double ya,yb,yc,xw,yw,s,t,yt;

              ya=F(a);

              yb=F(b);

              yc=F(c);

              N=3;

              do

              {

                            s=c+0.5*(pow((b-c),2)*(ya-yc)-pow((c-a),2)*(yb-yc))/((b-c)*(ya-yc)+(c-a)*(yb-yc));             

                            if(s!=c)

                                          t=s;

                            else

                                          t=(a+c)/2;

                            yt=F(t);

                            N++;

                            if(t<c)

                            {

                                          if(yt<yc)

                                          {

                                                        b=c;

                                                        yb=yc;

                                                        c=t;

                                                        yc=yt;

                                          }

                        else

                        {

                                                  if(yt>yc)

                                                  {

                                                                a=t;

                                                                ya=yt;

                                                  }

                                                  else

                                                  {

                                                                a=t;

                                                                ya=yt;

                                                                b=c;

                                                                yb=yc;

                                                                c=(a+b)/2;

                                                                yc=F(c);

                                                                N++;

                                                  }

                        }

                            }

                            if(t>c)

                            {

                                          if(yt<yc)

                                          {

                                                        a=c;

                                                        ya=yc;

                                                        c=t;

                                                        yc=yt;

                                          }

                        else

                        {

                                                  if(yt>yc)

                                                  {

                                                                b=t;

                                                                yb=yt;

                                                  }

                                                  else

                                                  {

                                                                a=c;

                                                                ya=yc;

                                                                b=t;

                                                                yb=yt;

                                                                c=(a+b)/2;

                                                                yc=F(c);

                                                                N++;

                                                  }

                        }

                            }

 

              }

              while(b-a>2*E);

              xw=(a+b)/2;

              yw=F(xw);

              cout<<"Metod parabol:\nx'="<<xw<<"\ny'="<<yw<<"\nN="<<N<<"\nPress any key\n";

              getch();

}

Блок-схема:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Таблица результатов сравнения рассмотренных методов:

 

Название метода

x’

y'

N

пассивный оптимальный алгоритм (N нечетное)

1.665

3.72894

399

пассивный оптимальный алгоритм (N четное)

1.66662

3.72895

400

алгоритм блочного равномерного поиска

Размер блока

 

 

 

2

1,66003

3,7895

16

4

1,66644

3,7894

20

6

1,66002

3,7895

24

8

1,66233

3,7894

32

10

1,66201

3,7894

30

3

1,66406

3,7895

17

5

1,66189

3,7897

21

7

1,66406

3,7895

25

9

1,6656

3,7894

33

11

1,6713

3,7898

31

алгоритм деления интервала пополам

1.66406

3.72894

17

метод дихотомии

1.66012

3.72895

16

метод золотого сечения

1.66253

3.72894

13

метод Фибоначчи

1.66094

3.72894

12

метод касательных

1.66651

3.72895

22

метод парабол

1.66353

3.72894

17

 

Вывод: как видно из таблицы результатов все методы выдали в итоге почти одинаковые значения и . Следует отметить, что заметно существенное отличие в количестве экспериментов между пассивным оптимальным алгоритмом, алгоритмом блочного равномерного поиска, алгоритм деления интервала пополам, методами дихотомии, золотого сечения, Фибоначчи, касательных, парабол и пассивным методом. В ходе выполнения работы получили, что метод Фибоначчи является самым эффективным среди этих восьми методов. Пассивный метод плох тем, что для достижения того же результата, при той же точности искомого решения, необходимо выполнить намного большее количество экспериментов.

 

26

 



Информация о работе Безусловная одномерная оптимизация