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

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

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

8.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;

}

double df(double x)

{double f;

f=3*pow(x, 2)-1-exp(-x);

return f;

}

void main()

{

const double e=0.00001;

double y1,y2, z1, z2, s, z, y, xr, yr, x, a=0, b=1;

int i, N;

clrscr();

//N=0; //Schetchik experimentov

y1=f(a);

y2=f(b);

z1=df(a);

z2=df(b);

N=4;

do

{

s=((z2*b - z1*a)-(y2-y1))/(z2-z1);

y=f(s);

z=df(s);

N+=2;

if (z==0) {x=s; break;}//smthwrng

if (z>0) {b=s; y2=y; z2=z;}

else {a=s; y1=y; z1=z;}

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

if (z!=0) {x=(a+b)/2; y=f(x);}

printf("Metod kasatelnyh \n \n");

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

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

printf("Kol-vo experimentov: %i", N);

getch();

}

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

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

9.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, c, ya, yb, yc, s, t, yt, x, y;

const double e=0.00001;

int N;

clrscr();

cout<<"Method parabol "<<endl<<endl;

do

{cout<<"Vv. c ";

cin>>c;

}while ((a>=c) || (b<=c) || (f(a)<=f(c)) || f(b)<=f(c));

ya=f(a);

yb=f(b);

yc=f(c);

N=3;//kol-vo experimentov

while (b-a>2*e)

{

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

if (s==c) t=(a+c)/2; //see here

else t=s;

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++;}

}

else 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++; }

}

}

x=(a+b)/2; y=f(x);

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

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

cout<<"Kol-vo tochek: "<<N;

getch();

}

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

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

Метод

Результат

Кол-во экспериментов

Пассивный оптимальный

X=0.70564; y = 0.13951

99999

Блочный

X=0.70565; y = 0.13951 (n=2)

32

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

X=0.70564; y = 0.13951

33

Дихотомии

X=0.70564; y = 0.13951

32

Золотого сечения

X=0.70565; y = 0.13951

24

Фибоначчи

X=0.70564; y = 0.13951

25

Касательных

X=0.70565; y = 0.13951

36

Парабол

X=0.70564; y = 0.13951 (c=0.8)

15

Вывод

Как следует из таблицы, лучшим методом для решения заданной оптимизационной задачи является метод парабол.

33