С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943

Решение СЛАУ - Системы линейных алгебраических уравнений

02.09.2017, 19:12. Показов 1749. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задачу почти закончил писать, матрицу приводит к ступенчатому виду, только не могу понять как сделать обратный проход и найти корни уравнений. Гарантируется что система невырожденная. Ещё не могу понять где использовать eps(точность вычислений выбрал 1e-6).

Работаю с файлом потому что так легче чем каждый раз задавать значения в консоль.
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
#include <fstream>
#include <vector>
#include <iomanip>
 
int main()
{
    std::ifstream in("c:\input.txt");
    std::ofstream out("c:\output.txt");
    const double eps = 0.000001;
    int n;
    in >> n;
 
    std::vector< std::vector<double> > matrix(n);
    for(int i = 0; i < n; ++i) matrix[i].resize(n + 1);
 
    for(int i = 0; i < n; ++i)
        for(int j = 0; j < n + 1; ++j) in >> matrix[i][j];
 
    for(int i = 0; i < n; ++i)
    {
        double max;
        int ind;
        max = matrix[i][i];
        ind = i;
        for(int j = i + 1; j < n; ++j)
        {
            if(matrix[j][i] > max)
            {
                max = matrix[j][i];
                ind = j;
            }
            //if(matrix[j][i] < eps) matrix[j][i] = 0;
        }
        if(ind != i)
        {
            for(int j = 0; j < n + 1; ++j)
                std::swap(matrix[ind][j], matrix[i][j]);
        }
 
        for(int j = i; j < n; ++j)
        {
            double val;
            val = matrix[j][i];
            for(int k = 0; k < n + 1; ++k) matrix[j][k] /= val;
        }
        for(int j = i + 1; j < n; ++j)
            for(int k = 0; k < n + 1; ++k) matrix[j][k] -= matrix[i][k];
 
    }
    
    // Вывод конечной матрицы
    for(int i = 0; i < n; ++i)
    {
        for(int j = 0; j < n + 1; ++j)
            out << std::setw(10) << matrix[i][j];
 
        out << std::endl;
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.09.2017, 19:12
Ответы с готовыми решениями:

Решение системы линейных алгебраических уравнений
Добрый вечер!!! Помогите, пожалуйста, написать программу для решения системы уравнений итерационным методом(метод А-минимальных...

Решение системы линейных алгебраических уравнений методом Гаусса
Решить систему n линейных алгебраических уравнений методом Гаусса. Использовать указатели.

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

7
11 / 11 / 6
Регистрация: 12.05.2016
Сообщений: 42
02.09.2017, 20:51
Когда-то писал это на delphi, делал я его (кажется) не совсем стандартно тогда по сему просто попробуйте перевести на свой может сработает, вот сам код (n-размерность матрицы)(если будет время сам вам его перепишу на С++, но пока что так):
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  //Прямой ход – исключение переменных
  for i:=1 to n-1 do
    for j:=i+1 to n do
    begin
      a[j,i]:=-a[j,i]/a[I,i];
      for k:=i+1 to n do  a[j,k]:=a[j,k]+a[j,i]*a[I,k];
        b[j]:=b[j]+a[j,i]*b[i]
    end;
    x[n]:=b[n]/a[n,n];
    //Обратный ход нахождение корней
    for i:=n-1 downto 1 do
    begin
      h:=b[i]; 
      for j:=i+1 to n do h:=h-x[j]*a[I,j];
      x[i]:=h/a[I,i]
    end;
1
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
03.09.2017, 09:10  [ТС]
Цитата Сообщение от Сисик Посмотреть сообщение
Delphi
1
a[j,i]:=-a[j,i]/a[I,i];
Может следует поставить проверку на то что является ли a[I,i] нулевым если да то заменить на другое число в в этом же столбце
0
11 / 11 / 6
Регистрация: 12.05.2016
Сообщений: 42
03.09.2017, 14:00
Цитата Сообщение от no swear Посмотреть сообщение
Может следует поставить проверку на то что является ли a[I,i] нулевым если да то заменить на другое число в в этом же столбце
Быть честным я уже и забыл как решаются СЛАУ, а этот код я писал еще когда в 10-ом классе был с помощью учителя по Алгебре. Но думаю будет логичным избавиться от такого момента, но как именно надо вспомнить.
1
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
03.09.2017, 14:18
Цитата Сообщение от no swear Посмотреть сообщение
c:\input.txt
c:\\input.txt
Цитата Сообщение от no swear Посмотреть сообщение
Ещё не могу понять где использовать eps
Для сравнения элемента с 0 скорее всего.
Цитата Сообщение от no swear Посмотреть сообщение
только не могу понять как сделать обратный проход и найти корни уравнений
Ты на бумажке решать умеешь? Не вижу никаких проблем в реализации.
1
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
03.09.2017, 17:52  [ТС]
Цитата Сообщение от shmkv Посмотреть сообщение
Для сравнения элемента с 0 скорее всего.
Перед выводом корней использовать это сравнение?
Цитата Сообщение от shmkv Посмотреть сообщение
Ты на бумажке решать умеешь?
Умею конечно. Что - то я затупил, щас попробую и выложу то что у меня получилось или завтра.
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
04.09.2017, 20:03
Цитата Сообщение от no swear Посмотреть сообщение
Перед выводом корней использовать это сравнение?
Нет, просто в матрице на каждой итерации могут появиться элементы близкие к 0, которые следует рассматривать как нулевые и делить на них нельзя.
1
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
05.09.2017, 21:37  [ТС]
Вот что получилось. Если кому интересно можете протестировать. Сейчас думаю как написать код для вырожденной системы
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
#include <fstream>
#include <vector>
#include <iomanip>
 
int main()
{
    std::ifstream in("c:\\input.txt");
    std::ofstream out("c:\\output.txt");
    const double eps = 0.000001;
    int n;
    in >> n;
 
    std::vector< std::vector<double> > matrix(n);
    for(int i = 0; i < n; ++i) matrix[i].resize(n + 1);
 
    for(int i = 0; i < n; ++i)
        for(int j = 0; j < n + 1; ++j) in >> matrix[i][j];
 
    for(int i = 0; i < n; ++i)
    {
        double max;
        int ind;
        max = matrix[i][i];
        ind = i;
        for(int j = i + 1; j < n; ++j)
        {
            if(matrix[j][i] > max)
            {
                max = matrix[j][i];
                ind = j;
            }
            //if(matrix[j][i] < eps) matrix[j][i] = 0;
        }
 
        if(ind != i)
        {
            for(int j = 0; j < n + 1; ++j)
                std::swap(matrix[ind][j], matrix[i][j]);
        }
 
        for(int j = i; j < n; ++j)
        {
            double val;
            val = matrix[j][i];
            for(int k = i; k < n + 1; ++k) matrix[j][k] /= val;
        }
 
        for(int j = i + 1; j < n; ++j)
            for(int k = i; k < n + 1; ++k) matrix[j][k] -= matrix[i][k];
    }
 
    double x[n];
 
    for(int i = n - 1; i >= 0; --i)
    {
        x[i] = matrix[i][n];
        for(int j = n - 1; j > i; --j)
            x[i] -= x[j] * matrix[i][j];
 
    }
 
    out << std::endl;
    for(int i = 0; i < n; ++i) out << x[i] << ' ';
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.09.2017, 21:37
Помогаю со студенческими работами здесь

Решение системы линейных алгебраических уравнений с использованием класса "Матрица"
Составить программу решения системы линейных алгебраических уравнений методом Гаусса. Максимальная размерность решаемой системы должна...

Плохо обусловленные системы линейных алгебраических уравнений
Добрый вечер! Ребят, может сталкивался кто с такими методами решения плохо обусловленных систем линейных алгебраических уравнений: --...

Написать программу решения системы линейных алгебраических уравнений
Всем привет! Прошу помочь разобраться. Нужно: Написать программу решения системы линейных алгебраических уравнений одним из следующих...

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

Решение систем линейных алгебраических уравнений методом Гаусса с выбором главного элемента
Помогите пожалуйста найти решение системы линейных уравнений с матричными элементами. Условия задания матрицы в файле.


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru