Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Различные алгоритмы минимизации, реализованные в С++ / all / OPTIM_L2
.CPP#include <iostream.h>
#include <math.h>
#include <conio.h>
double function(double x) {
return (2*x*x+3*exp(-x));
}
double proizv(double x){
return (4*x-3*exp(-x));
}
double SWANN(double& a, double& b,double& c) {
double shag=0.001,np=1;
a=np;
b=np+shag;
if (function(a)<function(b)) { //dvigenie nalevo
shag=-shag;
while (function(a)<function(b)) {
shag=2*shag;
np=np+shag;
c=b;
b=a;
a=np;
};
} else
if (function(a)>function(b)) { //dvigenie napravo
while (function(b)<function(a)) {
shag=2*shag;
np=np+shag;
c=a;
a=b;
b=np;
if (function(a)<function(b)) {
a=c;
c=b;
};
};
} //if
return(0);
}
double dihotom(double& a,double& b){
double min;
double e=0.001;
double d=0.999*e;
int k=1;
while (fabs(b-a)>e) {
if (function(a+(b-a)/2-d/2)<function(a+(b-a)/2+d/2)) {
b=a+(b-a)/2+d/2;
}
else {
a=a+(b-a)/2-d/2;
}
k++;
}
return ((a+b)/2);
}
double cubinterpol(double &a,double &b){
double min,e,z,w,g;
e=0.01;
min=(a+b)/2;
while (fabs(proizv(min))>e){
z=proizv(a)+proizv(b)+3*(function(a)-function(b))/(a-b);
w= sqrt(z*z-proizv(a)*proizv(b));
g=(z-proizv(a)+w)/(proizv(b)-proizv(a)+2*w);
if ((0<g)&&(g<1)) min=a+g*(b-a);
else
if (g<=0) min=a;
else
if (g>=1) min=b;
if (fabs(proizv(min))>e) {
if (proizv(min)>0) b=min;
else
if (proizv(min)<0) a=min;
else cout<<"proizv=0";
}
}
return min;
}
main(){
double x,a,b,c;
clrscr();
SWANN(a,b,c);
cout<<"SWENN: "<<a<<"..."<<c<<"\n";
b=c;
dihotom(a,b);
cout<<"Dihotomii: "<<a<<"..."<<b<<"\n";
cout<<" Cubinterpol:\n";
cout<<"minimum: "<<cubinterpol(a,b)<<"\n";
return(0);
}
Соседние файлы в папке all