Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод золотого сечения.doc
Скачиваний:
6
Добавлен:
29.07.2019
Размер:
264.7 Кб
Скачать

4. Исходный текст программы

#include <math.h>

#include <conio.h>

#include <iostream.h>

double q, a=0, b=2, m, c, e=0.0015;

double f(double x)

{

return -4*x+exp(fabs(x-0.2));

}

double df (double x)

{

return -4+((x-0.2)/fabs(x-0.2))*exp(fabs(x-0.2));

}

//------------------------------------ Passivnyi optimalnyi metod--------------------------------

void passive()

{

long N=1332;//kol-vo tochek pri tochnosti e=0.0015;

double x, y, yl, xl, a=0, b=2;

long i;

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

{

x=a+i*(b-a)/(N+1);

y=f(x);

if ((i==1) || (yl>y))

{

xl=x; yl=y;

}

}

cout<<"a) Passivnyi optimalnyi"<<"\t\t\t"<<xl<<"\t\t"<<yl<<"\t"<<N<<endl;

}

//------------------------------------ Methode Blochnogo poiska--------------------------------

void block()

{

double a, b, x[1000], y[1000], xl, yl;

long i, j, n, N, k, l;

cout<<"b) Blochnogo ravnomernogo poiska: -----------------------------------------"<<endl;

for (n=2; n<=m; n++)

{

a=0;

b=2;

if (n%2==0)

{

k=n/2;

N=0;

while (b-a>2*e)

{

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

{

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

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

}

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];

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);

}

else // dlya nechetnyh n

{

k=(n+1)/2;

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 neopredelennost

b=x[l+1];

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

}

}

cout<<" n="<<n<<"\t\t\t\t\t"<<xl<<"\t\t"<<yl<<"\t"<<N<<endl;

}

cout<<"---------------------------------------------------------------------------"<<endl;

}

//------------------------------------ Methode Popolam--------------------------------

void popolam()

{

double a=0, b=2;

double x[5], y[4], yl, xl;

int i, N, l;

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

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

N=1;

while (b-a>2*e)

{

x[0]=a;

x[4]=b;

x[1]=(a+x[2])/2;

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

x[3]=(x[2]+b)/2;

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

N+=2;

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

for (i=2; i<4; i++)

if (y[i]<y[l])

{

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

}

a=x[l-1];

b=x[l+1];

x[2]=xl;

y[2]=yl;

}

cout<<"c) Delenia intervala popolam"<<"\t\t"<<x[2]<<"\t\t"<<y[2]<<"\t"<<N<<endl;

}

//------------------------------------ Dihotomii --------------------------------

void dich()

{

double x,y,y1,y2,a=0,b=2;

int N;

x=(a+b)/2;

N=0;

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

{

y1=f(x-q);

y2=f(x+q);

N=N+2;

if (y1<=y2)

b=x+q;

else

a=x-q;

x=(a+b)/2;

}

y=f(x);

cout<<"d) Dihotomii"<<"\t\t\t\t"<<x<<"\t\t"<<y<<"\t"<<N<<endl;

}

//------------------------------------ Zolotoe sechenie --------------------------------

void zoloto()

{

const double t=0.5*(1+sqrt(5));

double a=0, b=2;

double x1,x2, y1, y2, x;

int N=0;

x1=a+(b-a)/(t*t);

y1=f(x1);

x2=a+(b-a)/t;

y2=f(x2);

N=2;

while ((b-a)/t>2*e)

if (y1<=y2)

{

b=x2;

x2=x1;

y2=y1;

x1=a+b-x2;

y1=f(x1); N++;

}

else

{

a=x1;

x1=x2;

y1=y2;

x2=a+b-x1;

y2=f(x2); N++;

}

if (y1<y2)

x=(a+x2)/2;

else x=(x1+b)/2;

y1=f(x);

cout<<"e) Zolotogo sechenia"<<"\t\t\t"<<x<<"\t\t"<<y1<<"\t"<<N<<endl;

}

//------------------------------------ Methode Fibonacchi--------------------------------

void fibo()

{

const long Fn=1000000;

int F1, F0, F, N; // F1=F[n-1], F0=F[n-2]

double x1,x2, y1,y2,x,y,a=0,b=2;

F0=1; F1=1;

F=0; N=0;

while (F<Fn)

{

F=F1+F0;

if (F<Fn)

{

F0=F1;

F1=F;

}

}

x1=a+F0*(b-a)/F;

x2=a+F1*(b-a)/F;

y1=f(x1);

y2=f(x2);

N=0;

do

{

if (y1<y2)

{

b=x2; x2=x1; y2=y1; x1=a+b-x2; y1=f(x1);

}

else

{

a=x1; x1=x2; y1=y2; x2=a+b-x1; y2=f(x2);

}

N++;

}

while (b-a>2*e);

if (y1<y2)

{

b=x2, x2=x1, y2=y1;

}

else a=x1;

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

cout<<"f) Fibonacchi"<<"\t\t\t\t"<<x<<"\t\t"<<y<<"\t"<<N<<endl;

}

//------------------------------------ Methode kasatelnyh--------------------------------

void kasat()

{

double a=0, b=2, y1,y2, z1, z2, s, z, y, x;

int N;

y1=f(a);

y2=f(b);

z1=df(a);

z2=df(b);

N=2;

do

{

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

y=f(s);

z=df(s);

N=N+2;

if (z==0)

{

x=s; break;

}

if (z>0)

{

b=s; y2=y; z2=z;

}

else

{

a=s; y1=y; z1=z;

}

}

while (b-a>2*e);

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

cout<<"g) Kasatelnyh"<<"\t\t\t\t"<<x<<"\t\t"<<y<<"\t"<<N<<endl;

}

//------------------------------------ Methode Parabol--------------------------------

void parabol()

{

double a=0, b=2, ya, yb, yc, t, s, yt, x, y;

int N;

if ((a>=c) || (b<=c) || (f(a)>=f(c)) || f(b)<=f(c))

ya=f(a);

yb=f(b);

yc=f(c);

N=3;

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;

else t=s;

yt=f(t); 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; yt=yc; c=(a+b)/2; yc=f(c); N++;}

}

else

{

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

}

}

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

cout<<"h) Parabol"<<"\t\t\t\t"<<x<<"\t\t"<<y<<"\t"<<N<<endl;

}

void main()

{

q=e/10;

cout<<"Variant: \t6"<<endl;

cout<<"Function: \t-4x+e^(|x-0.2|)"<<endl;

cout<<"Promezhutok: \t[0;2]"<<endl;

cout<<"Tochnost': \te=0.0015"<<endl;

cout<<"Vvedite znachenie c (dlya metoda parabol):\t";

cin>>c;

cout<<"Vvedite znachenie n (dlya blochnogo metoda):\t";

cin>>m;

cout<<"---------------------------------------------------------------------------"<<endl;

cout<<"Methode:"<<"\t\t\t\tX:"<<"\t\tY:"<<"\t\tN:"<<endl;

cout<<"---------------------------------------------------------------------------"<<endl;

passive();

block();

popolam();

dich ();

zoloto();

fibo();

kasat();

parabol();

cout<<"---------------------------------------------------------------------------"<<endl;

getch();

}