Менеджмент - это управление организацией, функционирующей в условиях рыночной экономики.
Метод сопряженных градиентов
Преимущества:
· Простота реализации.
· Высокая скорость работы
· Не требует явного вычисления производных
Недостатки:
· При попадании в локальный минимум невозможен дальнейший поиск глобального минимума.
Для сравнения скорости работы этих методов была выбрана задача поиска решения системы ![]()
.Ниже представлено количество операций для решения системы заданного размера для каждого из методов.
|
|
Метод покоординатного спуска |
Метод сопряженных градиентов |
|
2 |
1111 |
2 |
|
5 |
8218 |
5 |
|
20 |
3432 |
21 |
|
50 |
6630 |
64 |
|
75 |
5235 |
102 |
Решение задачи
Для решения нашей задачи выберем метод сопряженных градиентов ввиду простоты его реализации и высокой скорости работы.
#include <vector>
#include <cstdio>
#include <iostream>
#include <algorith>
#include <ctime>
#include <cmath>namespace std;
#define sz size()
#define all(x) (x).begin(), (x).end()
#define pb push_back
#define mp make_pair
#define X first
#define Y second
#define sqr(x) ((x)*(x))
const double EPS = 1e-7;
// скалярное произведение
double inner_prod (vector<double> a, vector<double> b) {ans = 0;(int i = 0; i < a.sz; i++) {+= a[i] * b[i];
}ans;
}
// вычисление градиента<double> grad (vector<vector<double> > A, vector<double> B, vector<double> X) {<double> ans (B.sz, 0);(int i = 0; i < X.sz; i++) {(int j = 0; j < X.sz; j++) {[i] += A[j] [i] * X[j];
}
}(int i = 0; i < ans.sz; i++) {[i] = B[i] - ans[i];
}ans;
}conv (vector<double> g) {inner_prod (g, g);
}
// приближение ответа<double> nextApp (vector<double> prev, double len, vector<double> dir) {<double> ans = prev;(int i = 0; i < prev.sz; i++) {[i] += dir[i] * len;
}ans;
}
// вычисление направление движения<double> direction (vector<double> dir, vector<double> prev, vector<double> now) {a = inner_prod (prev, prev), b = inner_prod (now, now);(int i = 0; i < dir.sz; i++) {[i] *= (b / a);[i] -= now[i];
}dir;
}
// длина шага в заданном направлении
double length (vector<double> dir, vector<double> grad, vector<vector<double> > A) {a = 0;<double> B (dir.sz, 0);(int i = 0; i < grad.sz; i++) {+= grad[i] * dir[i];
}(int i = 0; i < dir.sz; i++) {(int j = 0; j < A[i].sz; j++) {[i] += dir[j] * A[j] [i];
}
}a / inner_prod (B, dir);
}
// метод сопряженных градиентовConGrad (vector<vector<double> > A, vector<double> B, vector<double> &X) {<double> gP = B, d (B.sz, 0), gN = B, c;s;(conv(gN) > EPS) {= grad (A, B, X);(conv(gN) < EPS) break;= direction (d, gP, gN);= length (d, gN, A);= nextApp (X, s, d);= gN;
}
}main() {n;>> n;<vector<double> > A(n);<double> B(n), X(n);(int i = 0; i < n; i++) {(int j = 0; j < n; j++) {>> A[i] [j];
}
}(int i = 0; i < n; i++) {>> B[i];
}(A, B, X);(int i = 0; i < n; i++) {(«%.4lf\n», X[i]);
}0;
}
Получили следующий ответ: 
, он и является ответом на поставленную задачу.
1 2
