Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
5 / 3 / 4
Регистрация: 14.12.2016
Сообщений: 49

Решение системы уравнений двумя методами

07.05.2018, 07:44. Показов 2076. Ответов 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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace MetodGayssa
{
    class Program
    {
        static void Main(string[] args)
            
        {
            Console.WriteLine("Введите количество строк матрицы:\n");
            int str = int.Parse(Console.ReadLine());                   /*Считываем введенное значение, преобразуем его из строкового значение (Parse) в число со знаком*/
            Console.WriteLine("Введите количество столбцов матрицы:\n");
            int stl = int.Parse(Console.ReadLine());
 
            double[,] matrix = new double[str, stl];  /* объявляем двумерный массив, количество строк и столбцов определям значениями переменных*/
 
           
            Console.WriteLine("Введите матрицу:\n");
 
            for (int i = 0; i < str; i++)
            {
                Console.Write("->");
                double[] znach = Console.ReadLine().Split().Select(x => double.Parse(x)).ToArray();
 
                for (int j = 0; j < stl; j++)
                {
                    matrix[i, j] = znach[j]; /* присваиваем элементу matrix с i номером строки и с j номером столбца значение элемента с j номером массива row*/
                }
            }
 
            double[] koficent = new double[str];
            int p = 1;
 
            for (int i = 0; i < str; i++)
            {
                Console.WriteLine("Введите свободный коэффицент " + p + ":\n");
                koficent[i] = double.Parse(Console.ReadLine()); /*кладем введенные коэффиценты в одномерный массив*/
                p++;
 
            }
 
            Console.WriteLine("\nВведенная матрица: \n");
 
            for (int i = 0; i < str; i++)   /*вывод матрицы на экран*/
            {
 
                for (int j = 0; j < stl; j++)
                {
                    Console.Write(matrix[i, j] + " "); /*выводим элементы столбцов построчно, после каждого элемента пробел " "*/
                }
 
                Console.WriteLine(); /*переход на следующую строку*/
            }
 
            Console.WriteLine("\nВведенные коэффиценты: \n");
 
            for (int i = 0; i < str; i++)
            {
                Console.WriteLine(koficent[i] + " ");
 
            }
 
            Console.WriteLine("Что сделать дальше?:\n");
            Console.WriteLine("Введите 1, чтоб решить систему методом Гаусса.\n" +
                              "Введите 2, чтоб определить сходимость ряда методом Простых итераций.\n");
            int menu = int.Parse(Console.ReadLine());
 
            switch (menu)
            {
                case 1:     
 
                    /*сами вычисления по гауссу*/
 
                    for (int k = 0; k < str - 1; k++)
                    {
                        for (int i = k + 1; i < str; i++)
                        {
                            for (int j = k + 1; j < stl; j++)
                            {
                                matrix[i, j] = matrix[i, j] - matrix[k, j] * (matrix[i, k] / matrix[k, k]);
                            }
                            koficent[i] = koficent[i] - koficent[k] * matrix[i, k] / matrix[k, k];
                        }
                    }
 
                    double s;
                    double[] korni = new double[str];
 
                    for (int k = str - 1; k >= 0; k--)
                    {
                        s = 0;
 
                        for (int j = k + 1; j < stl; j++)
                        {
                            s += matrix[k, j] + korni[j];
                            korni[k] = (koficent[k] - s) / matrix[k, k];
                        }
 
                    }
 
                    Console.WriteLine("Система имеет следующие корни:\n");
                    int c = 1;
 
                    for (int i = 0; i < str; i++)
                    {
                        Console.WriteLine("X" + c + " = {0:0.##}\n", korni[i]);
                        c++;
                    }
 
                    break;
 
                case 2:
                    /* проверка сходимости ряда методом простых итераций*/
                    double summ = 0;
 
                    for (int i = 0; i < str; i++)   
                    {
 
                        for (int j = 0; j < stl; j++)
                        {
                             summ = summ + matrix [i, j]; 
                        }
 
                      
                    }
 
                    int h = 0;
                    int g = str * stl;
                    for (int i = 0; i < str; i++)
                    {
 
                        for (int j = 0; j < stl; j++)
                        {
                            
                            if (Math.Abs(summ) < Math.Abs(matrix [i, j]))
                            {
                                h++;                                
                            }
 
                        }
                        
                    }
 
                    if(h != g)
                    {
                        Console.WriteLine("Cумма элементов (по модулю) = " + Math.Abs(summ) +
                                          "\nРяд расходится!\n");
                    }
 
                    else
                    {
                        Console.WriteLine("Cумма элементов (по модулю) = " + Math.Abs(summ) +
                                          "\nРяд сходится!\n");
                    }
                    
                    break;
 
            }
            
            Console.ReadKey();
        }
    }
}
Вот так я пытался сделать чтение матрицы из файла:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int size = 10;
 
string[] lines = File.ReadAllLines("C:\temp\in.txt");
 
int[,] arr = new int[size, size];
 
for (int i = 0; i < size; i++)
{
    int[] row = lines[i].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Select(Int32.Parse).ToArray();
    for (int j = 0; j < size; j++)
    {
        arr[i, j] = row[j];
    }
}
Вставлять этот фрагмент не стал - программа не компилируется.
И ошибка:
Миниатюры
Решение системы уравнений двумя методами  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.05.2018, 07:44
Ответы с готовыми решениями:

Решение систем линейных уравнений методами Гаусса и Крамера
Вот само задание: Написать программу, осуществляющую решение систем линейных уравнений методами Гаусса и Крамера. Программа должна...

Решение системы уравнений
Исходными данными для расчета состава цепи являются: подвижность - W, число общих связей, наложенных на систему - m, максимально допустимая...

Решение системы уравнений
Всем доброго времени суток! Помогите, пожалуйста, есть уравнение x=(x*A+C) Mod M, M = 1 000 000, массив x известен, как найти A и C? ...

1
5 / 3 / 4
Регистрация: 14.12.2016
Сообщений: 49
08.05.2018, 06:12  [ТС]
Переделал код, почему-то теперь при выборе расчета методом гаусса программа зависает.

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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace MetodGayssa
{
    class Program
    {
        static void Main(string[] args)
            
        {
            Console.WriteLine("Введите количество строк матрицы:\n");
            int str = int.Parse(Console.ReadLine());                   /*Считываем введенное значение, преобразуем его из строкового значение (Parse) в число со знаком*/
            Console.WriteLine("Введите количество столбцов матрицы:\n");
            int stl = int.Parse(Console.ReadLine());
 
            double[,] matrix = new double[str, stl];  /* объявляем двумерный массив, количество строк и столбцов определям значениями переменных*/
 
           
            Console.WriteLine("Введите матрицу:\n");
 
            for (int i = 0; i < str; i++)
            {
                Console.Write("->");
                double[] znach = Console.ReadLine().Split().Select(x => double.Parse(x)).ToArray();
 
                for (int j = 0; j < stl; j++)
                {
                    matrix[i, j] = znach[j]; /* присваиваем элементу matrix с i номером строки и с j номером столбца значение элемента с j номером массива row*/
                }
            }
 
            double[] koficent = new double[str];
            int p = 1;
 
            for (int i = 0; i < str; i++)
            {
                Console.WriteLine("Введите свободный коэффицент " + p + ":\n");
                koficent[i] = double.Parse(Console.ReadLine()); /*кладем введенные коэффиценты в одномерный массив*/
                p++;
 
            }
 
            Console.WriteLine("\nВведенная матрица: \n");
 
            for (int i = 0; i < str; i++)   /*вывод матрицы на экран*/
            {
 
                for (int j = 0; j < stl; j++)
                {
                    Console.Write(matrix[i, j] + " "); /*выводим элементы столбцов построчно, после каждого элемента пробел " "*/
                }
 
                Console.WriteLine(); /*переход на следующую строку*/
            }
 
            Console.WriteLine("\nВведенные коэффиценты: \n");
 
            for (int i = 0; i < str; i++)
            {
                Console.WriteLine(koficent[i] + " ");
 
            }
 
            Console.WriteLine("Что сделать дальше?\n");
            Console.WriteLine("Введите 1, чтоб решить систему методом Гаусса.\n" +
                              "Введите 2, чтоб определить сходимость ряда методом Простых итераций.\n");
            int menu = int.Parse(Console.ReadLine());
 
            double[] korni = new double[str];
 
            switch (menu)
            {
                case 1:
 
                    /*сами вычисления по гауссу*/
 
                    for(int i = 0; i < str; i++)
                    {
                        for (int j = 0; j < stl; j++)
                        {
                            
                            if (i == j)
                             {
                                /*преобразование чисел ниже диагонали к нулям*/
                                int t = 0;
                                
                                for (int e = 0; e < stl; e++)
                                {
                                    matrix[i, e] = matrix[i, e] - matrix[i, 0];
                                    if (t <= str)
                                    {
                                        koficent[t] = koficent[t] - matrix[i, e];
                                        t++;
                                    }
 
                                }
 
                                /*преобразование диагонали к единичкам*/
                                matrix[i, j] = matrix[i, j] / matrix[i, j];
                                int q = 0;
                                if (q <= str)
                                {
                                    koficent[q] = koficent[q] / matrix[i, j];
                                    q++;
                                }
                                
                                for (int e = 0; e < stl; e++)
                                {
                                    matrix[i, e] = matrix[i, e] / matrix[i, j];
 
                                }
                             }
 
                        }
 
                        for (int k = 0; k < str; k--)
                        {
                           
 
                            for (int j = 0; j < stl; j++)
                            {
                                if (k == j)
                                {
                                    korni[k] = koficent[k] - matrix[k, j] * koficent[k];
                                    
                                }
                                
                            }
 
                        }
                    } 
 
                    
 
                    Console.WriteLine("Система имеет следующие корни:\n");
                    int c = 1;
 
                    for (int i = 0; i < str; i++)
                    {
                        Console.WriteLine("X" + c + " = {0:0.##}\n", korni[i]);
                        c++;
                    }
 
                    break;
 
                case 2:
                    /* проверка сходимости ряда методом простых итераций*/
                    double summ = 0;
 
                    for (int i = 0; i < str; i++)   
                    {
 
                        for (int j = 0; j < stl; j++)
                        {
                             summ = summ + matrix [i, j]; 
                        }
 
                      
                    }
 
                    int h = 0;
                    int g = str * stl;
                    for (int i = 0; i < str; i++)
                    {
 
                        for (int j = 0; j < stl; j++)
                        {
                            
                            if (Math.Abs(summ) < Math.Abs(matrix [i, j]))
                            {
                                h++;                                
                            }
 
                        }
                        
                    }
 
                    if(h != g)
                    {
                        Console.WriteLine("Cумма элементов (по модулю) = " + Math.Abs(summ) +
                                          "\nРяд расходится!\n");
                    }
 
                    else
                    {
                        Console.WriteLine("Cумма элементов (по модулю) = " + Math.Abs(summ) +
                                          "\nРяд сходится!\n");
                    }
                    
                    break;
 
            }
            
            Console.ReadKey();
        }
    }
}
Добавлено через 20 часов 4 минуты
все, метод гаусса заработал, вот код, мб помогу кому-нибудь
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace MetodGayssa
{
    class Program
    {
        static void Main(string[] args)
            
        {
            Console.WriteLine("Введите количество строк матрицы:\n");
            int str = int.Parse(Console.ReadLine());                   /*Считываем введенное значение, преобразуем его из строкового значение (Parse) в число со знаком*/
            Console.WriteLine("Введите количество столбцов матрицы:\n");
            int stl = int.Parse(Console.ReadLine());
 
            double[,] matrix = new double[str, stl];  /* объявляем двумерный массив, количество строк и столбцов определям значениями переменных*/
 
           
            Console.WriteLine("Введите матрицу:\n");
 
            for (int i = 0; i < str; i++)
            {
                Console.Write("->");
                double[] znach = Console.ReadLine().Split().Select(x => double.Parse(x)).ToArray();
 
                for (int j = 0; j < stl; j++)
                {
                    matrix[i, j] = znach[j]; /* присваиваем элементу matrix с i номером строки и с j номером столбца значение элемента с j номером массива row*/
                }
            }
 
            double[] koficent = new double[str];
            int p = 1;
 
            for (int i = 0; i < str; i++)
            {
                Console.WriteLine("Введите свободный коэффицент " + p + ":\n");
                koficent[i] = double.Parse(Console.ReadLine()); /*кладем введенные коэффиценты в одномерный массив*/
                p++;
 
            }
 
            Console.WriteLine("\nВведенная матрица: \n");
 
            for (int i = 0; i < str; i++)   /*вывод матрицы на экран*/
            {
 
                for (int j = 0; j < stl; j++)
                {
                    Console.Write(matrix[i, j] + " "); /*выводим элементы столбцов построчно, после каждого элемента пробел " "*/
                }
 
                Console.WriteLine(); /*переход на следующую строку*/
            }
 
            Console.WriteLine("\nВведенные коэффиценты: \n");
 
            for (int i = 0; i < str; i++)
            {
                Console.WriteLine(koficent[i] + " ");
 
            }
 
            Console.WriteLine("Что сделать дальше?\n");
            Console.WriteLine("Введите 1, чтоб решить систему методом Гаусса.\n" +
                              "Введите 2, чтоб определить сходимость ряда методом Простых итераций.\n");
            int menu = int.Parse(Console.ReadLine());
 
            double[] korni = new double[str];
 
            switch (menu)
            {
                case 1:
 
                    /*сами вычисления по гауссу*/
                    double s;
 
                    for (int k = 0; k < str - 1; k++)
                    {
                        for (int i = k + 1; i < str; i++)
                        {
                            for (int j = k + 1; j < stl; j++)
                            {
                                matrix[i, j] = matrix[i, j] - matrix[k, j] * (matrix[i, k] / matrix[k, k]);
                            }
                            koficent[i] = koficent[i] - koficent[k] * matrix[i, k] / matrix[k, k];
                        }
                    }
                    for (int k = str - 1; k >= 0; k--)
                    {
                        s = 0;
                        for (int j = k + 1; j < str; j++)
                            s = s + matrix[k, j] * korni[j];
                        korni[k] = (koficent[k] - s) / matrix[k, k];
                    }
 
                    Console.WriteLine("Система имеет следующие корни:\n");
                    int c = 1;
 
                    for (int i = 0; i < str; i++)
                    {
                        Console.WriteLine("X" + c + " = {0:0.##}\n", korni[i]);
                        c++;
                    }
 
                    break;
 
                case 2:
                    /* проверка сходимости ряда методом простых итераций*/
                    double summ = 0;
 
                    for (int i = 0; i < str; i++)   
                    {
 
                        for (int j = 0; j < stl; j++)
                        {
                             summ = summ + matrix [i, j]; 
                        }
 
                      
                    }
 
                    int h = 0;
                    int g = str * stl;
                    for (int i = 0; i < str; i++)
                    {
 
                        for (int j = 0; j < stl; j++)
                        {
                            
                            if (Math.Abs(summ) < Math.Abs(matrix [i, j]))
                            {
                                h++;                                
                            }
 
                        }
                        
                    }
 
                    if(h != g)
                    {
                        Console.WriteLine("Cумма элементов (по модулю) = " + Math.Abs(summ) +
                                          "\nРяд расходится!\n");
                    }
 
                    else
                    {
                        Console.WriteLine("Cумма элементов (по модулю) = " + Math.Abs(summ) +
                                          "\nРяд сходится!\n");
                    }
                    
                    break;
 
            }
            
            Console.ReadKey();
        }
 
    }
}
Добавлено через 46 минут
Не могу реализовать здесь чтение матрицы из файла
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.05.2018, 06:12
Помогаю со студенческими работами здесь

Решение системы нелинейных уравнений
Всем доброго времени суток! Сталкивался ли кто с проблемой решения системы нелинейных уравнений? Возможно есть какие то либы в которых это...

Решение системы сильно нелинейных уравнений
Здравствуйте! Необходимо написать программу на С# для решения системы сильно нелинейных уравнений. Численные методы с расчетом частных...

Найти решение системы линейных уравнений
Даны действительные числа a1, b1, c1, a2, b2, c2. Выяснить, верно ли, что |a1*b2-a2*b1|&gt;0.0001, и если верно, то найти решение системы...

Решение системы линейных диф уравнений
Помогите написать программу на c#, которая решала бы систему линейных дифференциальных уравнений, характеристическим методом

Решение системы линейных и дифференциальных уравнений
Всем доброго времени суток. Очень прошу помощи, ибо уже совсем отчаялся. Необходимо решить систему из 12 уравнений - трёх...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru