
Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Различные алгоритмы минимизации, реализованные в С++ / all / KOSHI
.CPP#include <conio.h>
#include "vector.h"
vector p,x0;
double a,b;
double f(double t)
{
vector x = x0 + t*p;
return 100 * pow( x.y - pow( x.x ,2 ), 2 ) + pow( 1 - x.x, 2 );
}
double df(double t)
{
vector x = x0 + t*p;
return ( 400*( pow( x.x, 3 ) - x.x * x.y ) - 2 + 2*x.x )*p.x + 200*( x.y - pow( x.x, 2 ) ) * p.y;
}
void napr()
{
p.x = 1; //400 * x0.x * x0.y - 400 * pow( x0.x ,3 ) + 2 - 2*x0.x;
p.y = 5; //-200 * x0.x + 200 * pow( x0.x, 2 );
}
double norma(vector x1)
{
return sqrt( pow( x1.x - x0.x, 2 ) + pow( x1.y - x0.y, 2 ) );
}
void Swann4()
{
double t = fabs( (f(0) - df(0)) / df(0) );
if( t > 1 ) t = 1;
if( df(0) > 0 ) p = -p;
double s = 0;
do
{
s = s + t;
t = 2*t;
}
while( df(0) * df(s) > 0 );
a = s - t/2;
b = s;
}
//
double gam()
{
double z = df(a) + df(b) + 3*(f(a) - f(b)) / b;
double w = sqrt( z*z - df(a)*df(b) );
return a + ( ( z - df(a) + w ) / ( df(b) - df(a) + 2*w ) ) * ( b - a );
}
//
double Davidon(double e)
{
double c;
Swann4();
do
{
c = gam();
if( df(c) < 0 )
{
a = c;
}
else
{
b = c;
}
}
while( fabs( df(c) ) > e );
return c;
}
void KOSHI()
{
double al;
vector x1 = x0;
int g = 0;
do
{
g++;
x0 = x1;
napr();
al = Davidon(0.001);
x1 = x0 + al*p;
}
while( fabs(f(0) - f(al)) > 0.00001 );
x0 = x1;
cout << "\n\t************************************";
cout << "\n\n\tЉ®«ЁзҐбвў® ЁвҐа жЁ© " << g;
}
void Koshi()
{
clrscr();
vector x01(-1,0);
int k;
x0 = x01;
KOSHI();
cout << "\n\n\tЋ’‚…’ : ";
cout << "\t{ " << x0.x << " ; " << x0.y << " }";
getch();
}
Соседние файлы в папке all