Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.90/40: Рейтинг темы: голосов - 40, средняя оценка - 4.90
ЦеЗарЬ
17 / 17 / 1
Регистрация: 16.09.2010
Сообщений: 91
1

Написать три алгоритма решения СЛАУ: Метод прогонки, метод квадратных корней, метод вращений

01.09.2012, 17:29. Просмотров 7756. Ответов 5
Метки нет (Все метки)

Начал писать курсовую. Нужно написать три алгоритма решения СЛАУ: прогонки, квадратных корней, вращений.
С методом прогонки более менее все ясно, хотя все равно столбец иксов не совпадает со столбцом решений по методу гаусса онлайн. Выкладываю то что уже написал. Прошу любой помощи, у меня тут или ошибки в коде или возможно в корне неправильный подход, потому что ответы не совпадают с решениями онлайн. Сами алгоритмы брал из википедии и книжки, но возможно неверно реализовал.
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
//прогонки
                //коэфф
                p[0] = -matrix[0, 1] / matrix[0, 0];
                q[0] = d[0] / matrix[0, 0];
                for (int i = 1; i < columns-1; i++)
                {
                    p[i] = -matrix[i, i + 1] / (matrix[i, i] + matrix[i, i - 1] * p[i - 1]);
                    q[i] = (d[i] - matrix[i, i - 1] * q[i - 1]) / (matrix[i, i] + matrix[i, i - 1] * p[i - 1]);
                }
                p[columns-1] = 0;
                q[columns - 1] = (d[columns - 1] - matrix[columns - 1, columns - 2] * q[columns - 2]) / (matrix[columns - 1, columns - 1] + matrix[columns - 1, columns - 2] * p[columns-2]);
                x[columns - 1] = q[columns-1];
                for (int i = columns-2; i >= 0; i--)
                {
                    x[i] = p[i] * x[i + 1] + q[i];
                }
                //NaN и бесконечность
                for (int i = 0; i < columns; i++)
                {
                    if (x[i] != x[i])
                    {
                        MessageBox.Show("Система не имеет решения! Было получено NaN - Not a Number!");
                        return;
                    }
                    if (x[i] == System.Double.NegativeInfinity || x[i] == System.Double.PositiveInfinity)
                    {
                        MessageBox.Show("Система не имеет решения! Было получено бесконечное число!");
                        return;
                    }
                }
                //
                //заполняем x в таблицу С
                for (int i = 0; i < columns; i++)
                    dataGridView3[0, i].Value = x[i];
                //невязка для прогонки
                dataGridView4[0, 0].Value = matrix[0, 0] * x[0] + matrix[0, 1] * x[1] - d[0];
                for (int i = 1; i < columns-1; i++)
                {
                    dataGridView4[0,i].Value = matrix[i, i - 1] * x[i - 1] + matrix[i, i] * x[i] + matrix[i, i + 1] * x[i + 1] - d[i];
                }
                dataGridView4[0, columns - 1].Value = matrix[columns - 1, columns - 2] * x[columns - 2] + matrix[columns - 1, columns - 1] * x[columns - 1] - d[columns-1];
                //
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
//метод квадратных корней
//находим L верхнетреугольную
                L[0, 0] = Math.Sqrt(matrix[0,0]);
                
                for (int i = 0; i < columns; ++i)
                    for (int j = 0; j < columns; ++j)
                    {
                        L[0, j] = matrix[0, j] / L[0, 0];
 
                        //если не отриц число
                        if (i > 0)
                        {
                            double buf_l = 0;
                            for (int l = 0; l < i - 1; ++l)
                                buf_l = L[l, i] * L[l, i];
 
                            if (matrix[i, i] - buf_l >= 0.0d)
                                L[i, i] = Math.Sqrt(matrix[i, i] - buf_l);
                            else
                            {
                                MessageBox.Show("Система не имеет решений, так как матрица не является положительно определенной!");
                                return;
                            }
                        }
 
 
 
                        if (j > i)
                        {
                            double buf_l2 = 0;
                            for (int l = 0; l < i - 1; ++l)
                                buf_l2 = L[l, i] * L[l, j];
                            L[i, j] = (matrix[i, j] - buf_l2) / L[i, i];
                        }
 
                        if (i > j)
                            L[i, j] = 0;
                    }
                //теперь получим транспонированную Lt (нижнетреугольная)
                double[,] Lt = trans(L);
 
                //Lt*y = b
                double[] y = triangle(Lt, d);
                //L*x = y
                double[] res = triangle(L, y);
 
                //
                //заполняем x в таблицу С
                for (int i = 0; i < columns; i++)
                    dataGridView3[0, i].Value = res[i];
                //невязка
 
                for (int i = 0; i < columns; i++)
                {
                    dataGridView4[0, i].Value = 0;
                    for (int j = 0; j < columns; j++)
                        dataGridView4[0, i].Value = double.Parse(dataGridView4[0, i].Value.ToString()) + matrix[i, j] * res[j];
                    dataGridView4[0, i].Value = double.Parse(dataGridView4[0, i].Value.ToString()) - d[i];
 
                }
        double[,] trans(double[,] mat)
        {
            int columns = trackBar1.Value;
            double[,] buf = new double[columns, columns];
            for (int i = 0; i < columns; ++i)
                for (int j = 0; j < columns; ++j)
                    buf[i, j] = mat[j, i];
 
            return buf;
        }
 
        double[] triangle(double[,] mat, double[] d)
        {
            int columns = trackBar1.Value;
            double[] res = new double[columns]; // решение
            double sum;
            int j;
 
            res[columns - 1] = d[columns - 1] / mat[columns - 1, columns - 1];
            sum = 0;
            for (int z = columns - 2; z >= 0; --z)
            {
                sum = 0;
                for (j = z + 1; j < columns; j++)
                {
                    sum = sum + mat[z, j] * res[j];
                    res[z] = (d[z] - sum) / mat[z, z];
                }
            }
            return res;
        }
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.09.2012, 17:29
Ответы с готовыми решениями:

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

Транспортная задача. Метод северо-западного угла и метод минимального элемента.
Метод северо-западного угла и метод минимального элемента. Задание: Найти...

В классе Student определите метод InitAr (Метод должен быть статическим)
Здравствуйте. Помогите пожалуйста разобраться в задании: a. В классе Student...

Как вызвать метод info в метод Main и с какими параметрами?
я новичок в C#, так что не судите строго.. Я не думаю что это кому-то покажется...

Переделать программу, использующую метод Гаусса в метод Барейса
Всем ДВС! подскажите пожалуйста, как переделать эту программу использующую...

5
Psilon
Master of Orion
Эксперт .NET
6021 / 4873 / 903
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
01.09.2012, 22:56 2
Есть код на дельфи, если поможет, могу выложить... (для прогонки, МПИ, вращения...)
0
ЦеЗарЬ
17 / 17 / 1
Регистрация: 16.09.2010
Сообщений: 91
02.09.2012, 18:00  [ТС] 3
Psilon, буду благодарен.
0
Psilon
Master of Orion
Эксперт .NET
6021 / 4873 / 903
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
02.09.2012, 19:18 4
Вот архив всех программы по ЧМ, которые писали. Якоби = Вращения
3
Вложения
Тип файла: rar Вычмат.rar (2.63 Мб, 818 просмотров)
Psilon
Master of Orion
Эксперт .NET
6021 / 4873 / 903
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
02.09.2012, 21:52 5
В блокнотике (а лучше в notepad++) открываете файлы с расширением .pas, там все есть.
1
densuper
0 / 0 / 0
Регистрация: 28.06.2016
Сообщений: 2
28.06.2016, 12:13 6
ЦеЗарЬ, здравствуйте, можете помочь?
0
28.06.2016, 12:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.06.2016, 12:13

Рекурсивный метод вычисления суммы корней
Есть задача написать рекурсивный метод возвращающий значение. Вот задание: ,...

Метод статистических испытаний (метод Монте-Карло)
Есть задание Вот функции Вот код: public double fx(double x) {...

Метод с generic параметром, реализующий метод интерфейса
Здравствуйте, подскажите почему ругается компилятор, что метод Add интерфейса...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru