АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Блок-схемы алгоритмов

Читайте также:
  1. Составление алгоритмов.
  2. Способы описания алгоритмов.
  3. Типовые структуры алгоритмов.
  4. Эффективность и правильность алгоритмов.

Лабораторная работа №1.

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

Вариант 9.

 

Выполнил: студент гр. АСОИ-339

Буйлов А.А.

Проверил: Хасанов А.Ю.

 

Уфа 2011

1. Цель работы

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

Постановка задачи

Решить задачу оптимизации следующими методами одномерной безусловной оптимизации:

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

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

 

 

Целевая функция Отрезок [a,b] Точность e или число экспериментов N
  |х| + e10x [-1,0] e =10-3

 

 

График функции. Диапазон: x [-10,1], y [-2,10]

 

График функции. Диапазон: x [-2,2], y [0,1000000]

Блок-схемы алгоритмов.

2.1. Меню

 

2.2. Метод параболы

2.3. Блочный метод равномерного поиска;

 

3. Листинг программы.

#include <iostream.h>

#include <fstream.h>

#include <string.h>

#include <conio.h>

#include <stdlib.h>

#include <iomanip.h>

#include <windows.h>

#include <math.h>

const int Color = system("color 70");

class metod

{private:

;

public:

void Block ();

void Parabol ();

double f(double x);

};

void Block ();

void Parabol ();

double f(double x);

 

int main() //Меню. Выбор метода

{ int i,f,j,y(0);

char h[200];

SetConsoleCP(1251);

SetConsoleOutputCP(1251);

while (1)

{ ri:system("cls");

cout<<setw(65)<<"Лабараторная работа №1. АСОИ-339. Буйлов Алексей\n";

cout<<"1. Блочный метод.\n";

cout<<"2. Метод парабол.\n";

cout<<"3. Выход.\n";

cout<<"\nВаш выбор: ";

cin >>h;

f=strlen(h);

for (i=0;i<f;i++) if ((h[i]<'0')||(h[i]>'9'))y=1;

if (y==0) j=atoi(h);

else

{cout<<"Введите целое число. \n";

getch();

y=0;

goto ri;}

switch (j)

{

case 1: Block (); break;

case 2: Parabol (); break;

case 3: exit(0);

default: for(i=0;i<80;i++) cout<<"-";

cout <<"Нет такого пункта. Повторите. \n"; getch(); break;

}

}

}

 

 

double f(double x) //Заданная функция

{double f;

f=fabs(x)+exp(10*x);

return f;

}

 

void Parabol() //Метод парабол

{ double ya,yb,yc,yt,y,x,a,b,c,e,s,t;

int i,N(0);

cout<<"\nВведите a: ";cin>>a;

cout<<"Введите b: ";cin>>b;

cout<<"Введите c: ";cin>>c;

cout<<"Введите e: ";cin>>e;

ya=f(a);

yb=f(b);

yc=f(c);

do

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

if (s!=c) t=s;

else t=(a+c)*0.5;

yt=f(t);

N=N+1;

if (t<c)

{

{

if (yt>yc)

{a=t;ya=yt;}

else

{b=c; yb=yc;

c=t; yc=yt;}

}

continue;

}

if (t>c)

{

if (yt<yc)

{a=c; ya=yc; c=t; yc=yt;}

else

{b=t;yb=yt;}

}

}

while ((b-a)>=2*e);

x=(a+b)*0.5;

y=fabs(x)+ exp (10*x);

cout<<"\nN="<<N;

cout<<"\nx="<<x;

cout<<"\ny="<<y;

getch();

 

}

 

void Block () //Блочный метод

{ double a,b,c,e,x[1000],y[1000],xx,yy,u;

int j,i,l,N(0),n,k;

cout<<"\nВведите a: ";cin>>a;

cout<<"Введите b: ";cin>>b;

cout<<"Введите c: ";cin>>c;

cout<<"Введите e: ";cin>>e;

cout<<"Введите размер блока n: ";cin>>n;

if (n%2==0)

{

k=n/2;

u=e*0.1;

while (b-a>2*e)

{

for(j=1;j<=k;j++)

{

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

x[2*j-1]=x[2*j]-u;

}

N=N+1;

for(i=1;i<=n;i++)

{

y[i]=f(x[i]);

if (i==1) l=i;

else if (y[l]>y[i]) l=i;

}

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

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

}

xx=(x[l-1]+x[l+1])/2;

yy=f(xx);

}

else if (n%2==1)

{

k=(n+1)/2;

x[k]=(a+b)/2;

y[k]=f(x[k]);

while (b-a>2*e)

{

N=N+1;

for(i=1;i<=n;i++)

{

if (i==k) continue;

x[i]=a+i*(b-a)/(n+1);

y[i]=f(x[i]);

if (i==1) l=i;

else if (y[l]>y[i]) l=i;

}

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

x[k]=x[l]; y[k]=y[l];

}

xx=x[k];

yy=y[k];

}

else if ((n<=0)&&((n%10)!=0)) cout<<"Введите натуральное число число";

cout<<"\nN="<<N;

cout<<"\nx="<<xx;

cout<<"\ny="<<yy;

getch();

}

 

 


Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.011 сек.)