Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Различные алгоритмы минимизации, реализованные в С++ / all / Laba2
.cpp#include <iostream.h>
#include <math.h>
#include <conio.h>
#include <stdio.h>
double A,B;
double f (double x)
{
return (2*x*x+16/x);
};
double lk (double a, double b, double d)
{
return ((a+b-d)/2);
};
double mk (double a, double b, double d)
{
return ((a+b+d)/2);
};
double f1 (double x)
{
return (4*x-16/(x*x));
};
void swenn (double x0, double h)
{
double x1,a,b;
int k=1;
if(f(x0)<f(x0+h))
h=-h;
x1=x0+h;
double fx0,fx1;
fx0=f(x0);
fx1=f(x0+h);
while(fx0>=fx1)
{
k++;
x0=x1;
h=2*h;
x1=x1+h;
fx0=f(x0);
fx1=f(x1);
}
printf("kolichestvo iteracij = %d\n",k);
a=x1;
b=x0-h/2;
if (a>b)
{
B=a;
A=b;
}
else
{
B=b;
A=a;
};
}
/////////////////////////////////////////////////////////
double dihotom(double a, double b, double e, double d)
{
double l,m,x;
int k=1;
while (fabs(b-a)>e)
{
l=lk(a,b,d);
m=mk(a,b,d);
if (f(l)<f(m))
b=mk(a,b,d);
else
a=lk(a,b,d);
k++;
};
x=(a+b)/2;
printf ("kolichestvo iteracij = %d\n",k);
return(x);
};
///////////////////////////////////////////////////////////////////
double kubint (double e, double h, double x0)
{
double x1,xk,xmin,a=A,b=B,z,w,gamma;
int k=1;
while ((fabs(f1(xk))>e))
{
z=f1(a)+f1(b)+3*(f(a)-f(b))/b;
w=sqrt(z*z-f1(a)*f1(b));
gamma=(z-f1(a)+w)/(f1(b)-f1(a)+2*w);
if ((gamma<1)&&(gamma>0))
{
xk=a+gamma*(b-a);
}
else
{
if (gamma<0)
{
xk=a;
}
if (gamma>1)
{
xk=b;
}
}
if (f1(xk)>0)
{
b=xk;
}
else
{
a=xk;
}
k++;
}
xmin=xk;
printf("kolichestvo iteracij = %d\n",k);
return (xmin);
};
///////////////////////////////////////////////////////////////////
void main()
{
double x=1,min;
double e=0.000001,d=0.00000001;
double h=0.01;
clrscr();
printf("Metod swenna:\n");
swenn (x,h);
printf("a=%.5f (levyj kraj intervala)\n",A);
printf("b=%.5f (pravyj kraj intrvala)\n",B);
printf("\nMetod dihotomii:\n");
min = dihotom(A,B,e,d);
printf("Min = %.5f \n",min);
printf("\nMetod Kubicheskoj interpoliacii:\n");
min = kubint(e,h,x);
printf("Min = %.5f \n",min);
}
Соседние файлы в папке all