Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- template <typename T, int M>
- int MaxNev (T (&A)[M]) {
- T Max = abs(A[0]);
- int j = 0;
- for (int i = 1; i < M; i++)
- {
- if (abs(A[i]) > Max)
- {
- Max = abs(A[i]);
- j = i;
- }
- }
- return j;
- }
- /*Функция по реализации метода Ретаксации.
- Принимает двумерный массив, приведенный в итерационному виду*/
- template <typename T, int N, int M>
- void Relax (T (&A)[N][M]) {
- float epsilon = 0.000000001; // точность
- double Truth;
- int iter = 0;
- int Max;
- double X[N], rezX[N], Nevyaz[N], B[N];
- for (size_t j = 0; j < N; j++)
- {
- B[j] = A[j][M - 1];
- }
- for (size_t i = 0; i < N; i++)
- {
- X[i] = 0;
- Nevyaz[i] = B[i]/A[i][i];
- for (int j = 0; j < N; j++)
- {
- rezX[i] = 0;
- }
- }
- Max = MaxNev (Nevyaz); // Функция, для поиска наибольшей невязки
- do
- {
- for (size_t i = 0; i < N; i++)
- {
- X[i] = 0;
- }
- X[Max] = Nevyaz[Max];
- for (int i = 0; i < N; i++) {
- for (int g = 0; g < N; g++) {
- // <-- if (i != g)
- Nevyaz[i] -= (A[i][g] * X[g])/ abs(A[i][i]);
- }
- //Nevyaz[i] /= A[i][i];
- }//uel
- for (int h = 0; h < N; h++) {
- rezX[h] = rezX[h] + X[h];
- }
- iter++;
- Max = MaxNev (Nevyaz);
- } while (abs(Nevyaz[Max]) > epsilon);
- for (size_t r = 0; r < N; r++)
- {
- cout << "X[" << r << "] = " << rezX[r] << endl;
- }
- cout << endl << "Колличество итераций методом релаксации: " << iter << endl << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement