Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №1 (Хасанов А.Ю.).doc
Скачиваний:
89
Добавлен:
02.05.2014
Размер:
902.14 Кб
Скачать

Министерство общего и профессионального образования Российской Федерации

Уфимский государственный авиационный технический университет

Кафедра ТК

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

Вариант 12.

Выполнила: студентка гр. ИВТ – 324

Данилина А.О.

Проверил: доцент каф. ТК

Хасанов А.Ю.

Уфа

2007

Содержание

  1. Постановка задачи ………………………………..… …3

  2. Пассивный оптимальный метод …………………... ….4

  3. Алгоритм блочного равномерного поиска…………….7

  4. Алгоритм деления интервала пополам……………….12

  5. Метод дихотомии………………………………………16

  6. Метод золотого сечения…………………………….....18

  7. Метод Фибоначчи………………………………………21

  8. Метод касательных……………………………………..25

  9. Метод парабол…………………………………………..28

  10. Результаты………………………………………………32

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

f(x) = x­­3 – x + ex —> min на [0, 1] c точностью ε = 10–5.

График функции:

  1. Пассивный оптимальный метод

2.1. Расчет количества экспериментальных точек.

По условию задана точность. Определим количество точек следующим образом:

Если N – нечетное, то:

Если N – нечетное, то:

Следовательно, N = 99999.

2.2. Текст программы на С++:

#include<iostream.h>

#include<math.h>

#include<conio.h>

void main()

{

long N=99999;//kol-vo tochek pri tochnosti e=0.00001;

long double x, y, yl, xl, a=0, b=1;

long i;

clrscr();

cout<<"Passivnyi optimalnyi algorytm"<<endl;

cout<<endl<<"Kol-vo tochek = "<<N<<" dlya tochnosti 0,00001"<<endl;

for (i=1; i<N+1; i++) //schet nachin. s 1 ^^

{

x=a+i*(b-a)/(N+1); //vychislenie koordinaty ocherednoy tochki

y=pow(x, 3)-x+exp(-x); //eksperiment y=f(x)

if ((i==1) || (yl>y)) {xl=x; yl=y;} //poisk minimuma

}

cout<<endl<<"y = "<<yl<<endl<<"x = "<<xl;

getch();

}

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

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

3.1. Текст программы на С++:

#include<iostream.h>

#include<math.h>

#include<conio.h>

#include<stdio.h>

double f(double x)

{double f;

f=pow(x, 3)-x+exp(-x);

return f;

}

void main()

{double a=0, b=1, x[1000], y[1000], xl, yl;

const double e=0.00001, d = e/10; //pogreshnost i delta

long i, j, n, N, k, l; //n - razmer bloka, N - chislo eksperimentov

clrscr();

cout<<"Vv. razmer bloka n ";

cin>>n;

N=0; //schetchik experimentov

if (n%2==0)

/*razmer bloka - chetnoe chislo*/

{k=n/2;

while (b-a> 2*e)

{for (j=1; j<k+1; j++) //chet nachin. c 1 ^^

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

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

}

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

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

x[0]=a;

x[n+1]=b;

N+=n; //chetchik experimentov

yl=y[1]; l=1;xl=x[1]; /*blok-shemu prodolj otsuda!!!*/

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

if (y[i]<yl) {yl=y[i]; xl=x[i]; l=i;}//opred. t.minimuma

a=x[l-1];//izmenenie otrezka neopred

b=x[l+1];

}

xl=(a+b)/2;

yl=f(xl);

}

/*razmer bloka - nechetnoe chislo*/

else

{

k=(n+1)/2; //nomer "sredney" tochki

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

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

N=1;

while (b-a>2*e)

{

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

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

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

}

x[0]=a;

x[n+1]=b;

N+=n-1;

yl=y[1]; xl=x[1]; l=1;

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

if (y[i]<yl) {yl=y[i]; xl=x[i]; l=i;} //poisk minimuma

a=x[l-1]; //izmenenie otrezka neopredelennosty

b=x[l+1];

x[k]=xl; y[k]=yl; //srednyja tochka

}

}

printf("x = %.5f \n", xl);

printf("y = %.5f \n", yl);

cout<<"Chislo experimentov: "<<N;

getch();

}