Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторные работы2 / MOLab1 / MOLab1 / stdafx
.cpp// stdafx.cpp : source file that includes just the standard includes
// MOLab1.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information
#include "stdafx.h"
double f(double x)
{
return 1.4 * x + exp( abs( x - 2 ) );
}
CDPoint find1(int k, int& nSteps)
{
ASSERT( 1 < k );
double a = X_LEFT;
double b = X_RIGHT;
int n = 2 * k - 1;
double* x = new double[ n + 3 ];
double* y = new double[ n + 3 ];
int j = 0;
double min_y = 0;
x[k] = ( b - a ) / 2;
y[k] = f( x[ k ] );
nSteps = 0;
while ( abs( b - a ) > 2 * X_EPS )
{
nSteps++;
min_y = y[k];
j = k;
for (int i = 0; i <= n + 1; i++)
{
if (i != k)
{
x[ i ] = a + i * ( b - a ) / ( n + 1 );
y[ i ] = f( x[ i ] );
if ( y[ i ] < min_y )
{
min_y = y[ i ];
j = i;
}
}
}
a = x[ j - 1 ];
b = x[ j + 1 ];
x[ k ] = x[ j ];
y[ k ] = y[ j ];
}
CDPoint pt(x[ k ], y[ k ]);
delete[] x;
delete[] y;
return pt;
};
CDPoint find2(int& nSteps, int n)
{
double a = X_LEFT;
double b = X_RIGHT;
int* fib = NULL;
if (0 == n)
{
fib = new int[ 3 ];
fib[ 0 ] = 0;
fib[ 1 ] = 1;
fib[ 2 ] = 1;
nSteps = (int)(a + b);
while ( abs( b - a ) / fib[ 2 ] > 2 * X_EPS )
{
fib[ 0 ] = fib[ 1 ];
fib[ 1 ] = fib[ 2 ];
fib[ 2 ] = fib[ 0 ] + fib[ 1 ];
n++;
}
delete[] fib;
}
fib = new int[ n + 3 ];
fib[ 0 ] = 0;
fib[ 1 ] = 1;
for (int i = 2; i <= n; i++)
fib[ i ] = fib[ i - 2 ] + fib[ i - 1 ];
double x1 = a + ( b - a ) * fib[ n - 2 ] / fib[ n ];
double x2 = a + ( b - a ) * fib[ n - 1 ] / fib[ n ];
double y1 = f( x1 );
double y2 = f( x2 );
for (int i = 0; i < n - 2; i++)
{
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 );
}
}
delete[] fib;
nSteps = n;
if ( y1 < y2 )
{
return CDPoint( x1, y1 );
}
else
{
return CDPoint(x2, y2 );
}
};
CDPoint find3(int& nSteps)
{
double a = X_LEFT;
double b = X_RIGHT;
double c = ( a + b ) / 2;
double ya = 0;
double yb = 0;
double yc = 0;
double t = 0;
double x = 0;
double y = 0;
ya = f ( a );
yb = f ( b );
yc = f ( c );
nSteps = 0;
while ( abs( b - a ) > X_EPS )
{
nSteps++;
t = c + 0.5 * ( ( b - c ) * ( b - c ) * ( ya - yc ) - ( c - a ) * ( c - a ) * ( yb - yc ) )
/ ( ( b - c ) * ( ya - yc ) + ( c - a ) * ( yb - yc ) );
if ( abs(t - c) < EPS )
x = ( a + c ) / 2;
else x = t;
y = f( x );
if ( x < c )
{
if ( abs( y - yc ) < EPS )
{
a = x;
b = c;
c = ( x + c ) / 2;
ya = y;
yb = yc;
yc = f ( c );
}
else if ( y < yc )
{
b = c;
c = x;
yb = yc;
yc = y;
}
else if ( y > yc)
{
a = x;
ya = y;
}
}
else if ( x > c )
{
if ( abs( y - yc ) < EPS )
{
a = c;
b = x;
c = ( x + c ) / 2;
ya = yc;
yb = y;
yc = f ( c );
}
else if ( y < yc )
{
a = c;
c = x;
ya = yc;
yc = y;
}
else if ( y > yc)
{
b = x;
yb = y;
}
}
else ASSERT( 0 );
}
return CDPoint( x, y );
};
Соседние файлы в папке MOLab1