Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*Класс, производящий многомерную оптимизацию*/
- class MultiDimensionalOptimization
- {
- public:
- /*ЦПС с ускоряющим шагом*/
- static Point CPS(double(*f) (Point), Point x0, int & k, double eps = 0.00001, int maxK = 10000)
- {
- func = f;
- k = 0;//Счетчик итераций
- Point x = x0;//Текущая точка
- Point prevX = x0;//Предыдущая точка
- Vector p(x.ComponentsNumber);//Направление поиска
- Vector d(x.ComponentsNumber);//Направление ускоряющего шага
- double minAlpha = 0;
- do
- {
- prevX = x;
- for (int i = 0; i < x.ComponentsNumber; i++)
- {
- p.Components[i] = 1;
- beginPoint = x;
- searchDirection = p;
- minAlpha = OneDimensionalOptimization::Search(FuncByAlpha);
- x = x + minAlpha * p;
- p.Components[i] = 0;
- }
- for (int i = 0; i < x.ComponentsNumber; i++) d.Components[i] = x.Components[i] - prevX.Components[i];
- if (!d.IsZero())
- {
- Vector normalizedVector = d;
- normalizedVector.Normalize();
- beginPoint = x;
- searchDirection = normalizedVector;
- minAlpha = OneDimensionalOptimization::Search(FuncByAlpha);
- x = x + minAlpha * normalizedVector;
- }
- k++;
- } while (d.GetNorm() > eps && k < maxK);
- return x;
- }
- private:
- /*Тестируемая функция, зависящая от одного аргумента (alpha).Возвращает
- значения функции вдоль заданного направления*/
- static double FuncByAlpha(double alpha)
- {
- Point newPoint = beginPoint + alpha * searchDirection;
- return func(newPoint);
- }
- static double(*func) (Point);//Тестируемая функция
- static Point beginPoint;//Текущая точка
- static Vector searchDirection;//Текущее направление поиска
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement