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