Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 15.10.2016
Сообщений: 12
1

Метод бисопряженных градиентов для решения СЛАУ

05.03.2018, 11:00. Показов 1203. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, никак не могу понять почему метод бисопряженных градиентов дает неточный результат. Может ошибка в алгоритме?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
            double eps = 0.0001;
            int Rows = grid1.RowDefinitions.Count;
            int m1columns_m1rows = comboBox.SelectedIndex + 2;
            double[] Xk = new double[m1columns_m1rows];//Корни
            double[] Rk = new double[m1columns_m1rows];//вектор невязки. Отличие полученных свободных членов от требуемых
            double[] Sz = new double[m1columns_m1rows];
            double[] Zk = new double[m1columns_m1rows];//Вектор спуска
            double[] Pk = new double[m1columns_m1rows];
            double[] St = new double[m1columns_m1rows];
            double[,] t = Transpose(matrix_left); 
            double[] Sk = new double[m1columns_m1rows];
            double alpha, beta, mf;
            double Spr, Spr1, Spz;
            int i, j;
            double tmp,a,b,c;
            double[] prev_x = new double[m1columns_m1rows];
 
            /* Вычисляем сумму квадратов элементов вектора right_matrix(правой части)*/
            for (mf = 0, i = 0; i < Rows; i++)
            {
                mf += matrix_right[0, i]* matrix_right[0, i];
            }
 
            /* Задаем начальное приближение корней. В Хk хранятся значения корней
            * к-й итерации. */
            for (i = 0; i < Rows; i++)
            {
                Xk[i] = 0;
            }
 
            /* Задаем начальное значение r0 и z0. */
            for (i = 0; i < Rows; i++)
            {
                for (Sz[i] = 0, j = 0; j < Rows; j++)
                {
                    Sz[i] += matrix_left[i, j] * Xk[j];
                }
                Rk[i] = matrix_right[0, i] - Sz[i];
                Zk[i] = Rk[i];
                Sk[i] = Rk[i];
                Pk[i] = Rk[i];
            }
            do
            {
                /* Вычисляем числитель и знаменатель для коэффициента
                * alpha = (pk-1,rk-1)/(Azk-1,sk-1) */
                Spz = 0;
                Spr = 0;
 
                for (i = 0; i < Rows; i++)
                {
                    for (Sz[i] = 0,St[i] = 0, j = 0; j < Rows; j++)
                    {
                        Sz[i] += matrix_left[i, j] * Zk[j];
                        St[i] += t[i, j] * Sk[j];
                    }
                    Spz += Sz[i] * Sk[i];
                    Spr += Pk[i] * Rk[i];
                }
                alpha = Spr / Spz;             /*  alpha    */ //величина смещения
 
 
                /* Вычисляем вектор решения: xk = xk-1+ alpha * zk-1,
                вектор невязки: rk = rk-1 - alpha * A * zk-1 и числитель для beta равный (rk,rk) */
                Spr1 = 0;
                a = 0;
                b = 0;
                for (i = 0; i < Rows; i++)
                {
                    Xk[i] += alpha * Zk[i];
                    Rk[i] -= alpha * Sz[i];
                    Pk[i] -= alpha * St[i];
                    Spr1 += Pk[i] * Rk[i];
                }
 
                /* Вычисляем  beta  beta = (pk * rk)/(pk-1 * rk-1) (*/
                beta = Spr1 / Spr;
 
                /* Вычисляем вектор спуска: zk = rk+ beta * zk-1 */
                for (i = 0; i < Rows; i++)
                {
                    Zk[i] = Rk[i] + beta * Zk[i];
                    Sk[i] = Pk[i] + beta * Sk[i];
                }
 
            }
            /* Проверяем условие выхода из итерационного цикла  */
            while (Spr1/mf > eps);
            int R;
            for (i = 0; i < Rows; i++)
            {
                R = i + 1;
                textBox3.Text += "x[" + (i + 1) + "]= " + Xk[i].ToString() + "\n";
            }
Транспонирование матрицы
C#
1
2
3
4
5
6
7
8
9
   public static double[,] Transpose(double[,] m)
        {
            double[,] t = new double[m.GetLength(1), m.GetLength(0)];
            for (int i = 0; i < m.GetLength(0); i++)
                for (int j = 0; j < m.GetLength(1); j++)
                    t[j, i] = m[i, j];
 
            return t;
        }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.03.2018, 11:00
Ответы с готовыми решениями:

Метод бисопряженных градиентов для решения СЛАУ
Добрый день, никак не могу понять почему метод бисопряженных градиентов дает неточный результат....

Метод сопряженных градиентов для решения СЛАУ
Пишу прогу для решения СЛАУ методом сопряженных градиентов. Есть СЛАУ, Ax=B, заданная матрицами ...

Метод простых итераций и метод Зейделя для решения СЛАУ
1. Методом простых итераций и методом Зейделя решить СЛАУ вида Bx=с B=\begin{pmatrix}21 &amp; 3 &amp; 1...

Метод для решения СЛАУ
Вообщем есть такая система на картинке. Нужно ее решить каким-либо способом, не важно. Пробовал...

0
05.03.2018, 11:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.03.2018, 11:00
Помогаю со студенческими работами здесь

Метод Холецкого для решения Слау
Ты не мог бы выложить программу?

Метод Гаусса для решения СЛАУ
Здравствуйте! У меня есть алгоритм решения СЛАУ методом Гаусса, но почему-то он не работает((( Я...

Метод Гаусса для решения СЛАУ
Господа, начну с того, что у меня есть программа (основу, т.е. метод я брал здесь, моя работа...

Метод Зейделя для решения слау
Пытаюсь реализовать метод Зейделя, подсмотрев реализацию в Википедии, написала функцию Itera(). Она...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru