Форум программистов, компьютерный форум CyberForum.ru

Решение систем алгебраических уравнений - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
Relaxory
0 / 0 / 0
Регистрация: 30.06.2014
Сообщений: 9
30.06.2014, 08:53     Решение систем алгебраических уравнений #1
Всех приветствую и желаю доброго дня!
Нуждаюсь в помощи по разработке алгоритма задания на языке С++
Необходимо написать программу для решения алгебраических уравнений и нахождения корней системы уравнения следующего вида:
a11+a12+a13=b14
a21+a22+a23=b24
a31+a32+a33=a34
Вот такая система, надеюсь на вашу помощь спасибо за внимание !
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Relaxory
0 / 0 / 0
Регистрация: 30.06.2014
Сообщений: 9
30.06.2014, 12:38  [ТС]     Решение систем алгебраических уравнений #21
именно так
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gru74ik
Модератор
 Аватар для gru74ik
3116 / 1342 / 167
Регистрация: 20.02.2013
Сообщений: 3,809
Записей в блоге: 17
30.06.2014, 12:41     Решение систем алгебраических уравнений #22
Цитата Сообщение от Relaxory Посмотреть сообщение
вот само задание
У Вас в учебнике не система линейных уравнений, а какая-то бредятина. Сами почитайте, да хоть в википедии.
Систему из трёх линейных уравнений я вам написал в корректной записи.
Насчёт кода - тут сложнее, я сам в С++ новичок. Мучайте поиск.
S_el
1906 / 1501 / 295
Регистрация: 15.12.2013
Сообщений: 5,914
30.06.2014, 12:47     Решение систем алгебраических уравнений #23
Relaxory, тогда читайте учебники по C++ для начинающих,или возьмите тему с форума и сделайте по аналогии.
gru74ik
Модератор
 Аватар для gru74ik
3116 / 1342 / 167
Регистрация: 20.02.2013
Сообщений: 3,809
Записей в блоге: 17
30.06.2014, 13:04     Решение систем алгебраических уравнений #24
Вот нашёл код. Автор кода говорит, что рабочий. Проверяйте, разбирайтесь.
Кликните здесь для просмотра всего текста

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
#include<iostream>
#include <math.h>
#include <stdlib.h>
#include <windows.h>
using namespace std;
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    int i, j, n, m;
    //создаем массив
    cout << "Введите число уравнений: ";
    cin >> n;
    cout << "Введите число неизвестных: ";
    cin >> m;
    m += 1;
    float **matrix = new float *[n];
    for (i=0; i<n; i++)
             matrix[i] = new float [m];
 
    //инициализируем
    for (i = 0; i<n; i++)
        for (j = 0; j<m; j++)
        {
            cout << "Элемент " << "[" << i+1 << " , " << j+1 << "]: "  ;
            cin >> matrix[i][j];
        }
 
    //выводим массив
    cout << "matrix: " << endl;
    for (i=0; i<n; i++)
    {
        for (j=0; j<m; j++)
            cout << matrix[i][j] << " ";
        cout << endl;
    }
    cout << endl;
 
    //Метод Гаусса
    //Прямой ход, приведение к верхнетреугольному виду
    float  tmp, xx[m];
    int k;
 
    for (i=0; i<n; i++)
    {
        tmp=matrix[i][i];
        for (j=n;j>=i;j--)
            matrix[i][j]/=tmp;
        for (j=i+1;j<n;j++)
        {
            tmp=matrix[j][i];
            for (k=n; k>=i; k--)
                matrix[j][k]-=tmp*matrix[i][k];
        }
    }
    /*обратный ход*/
    xx[n-1] = matrix[n-1][n];
    for (i=n-2; i>=0; i--)
    {
        xx[i] = matrix[i][n];
        for (j=i+1;j<n;j++)
            xx[i]-=matrix[i][j]*xx[j];
    }
 
//Выводим решения
    for (i=0; i<n; i++)
        cout << xx[i] << " ";
    cout << endl;
 
    delete[] matrix;
 
    return 0;
}


P.S. Немного поправил форматирование. Кстати, четвёртая ссылка в гугле по запросу система линейных уравнений C++.
Kerry_Jr
Модератор
 Аватар для Kerry_Jr
1857 / 1653 / 577
Регистрация: 14.05.2014
Сообщений: 4,749
Записей в блоге: 1
Завершенные тесты: 5
30.06.2014, 13:17     Решение систем алгебраических уравнений #25
Попробую еще раз, только это уже более универсальный вариант
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
#include <iostream>
#include <cmath>
#include <cstdlib>
 
//Минор матрицы
double** minor(double** matrix, int row, int col, int size)
{
    double** minor;
    minor = new double*[size-1];
    int m_row = 0, m_col;
    for (int i = 0; i < size; i++)
    {
        m_col = 0;
        if(i != row)
        {
            minor[m_row] = new double[size-1];
            for (int j = 0; j < size; j++)
            {
                if(j != col)
                {
                    minor[m_row][m_col] = matrix[i][j];
                    m_col++;
                }
            }
            m_row++;
        }
    }
    return minor;
}
 
// Детерминант матрицы
double determinant(double** matrix,int size)
{
    if (size == 1)
        return matrix[0][0];
    else if (size == 2)
        return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
    double determ = 0;
    for (int j = 0; j < size; j++)
        if (matrix[0][j])
            determ += (j%2==0?1:-1) * matrix[0][j] * determinant(minor(matrix,0, j, size), size-1);
 
    return determ;
}
 
int main()
{
    char ch;
    setlocale(LC_ALL, "");
    do
    {
        system("cls");
        int row;
        std::cout << "Введите порядок уравнения: ";
        std::cin >> row;
        int col = row + 1;
        double d0[row][col];
        std::cout << "Введите коэффициенты уравнения:" << std::endl;
        for (int i = 0; i < row; i++)
            for (int j = 0; j < col; j++)
                std::cin >> d0[i][j];
        double ***d = new double **[col];
        for (int k = 0; k < col; k++)
        {
            d[k] = new double *[col];
            for (int i = 0; i < row; i++)
            {
                d[k][i] = new double[row];
                for (int j = 0; j < row; j++)
                {   
                    d[k][i][j] = d0[i][j];
                    if (k > 0 && j == k-1) d[k][i][j] = d0[i][col-1];
                }
            }
        }
        double det = determinant(d[0], row);
        std::cout << "determinant = " << det << std::endl;
        if (det != 0)
        {
            for (int k = 1; k < col; k++)
            {
                std::cout << "x" << k << " = " << determinant(d[k], row)/det << std::endl;
            }
        }
        else std::cout << "Корней нет!" << std::endl;
        for (int k = 0; k < col; k++)
        {
            for (int i =0; i < row; i++)
            {   
                delete[] d[k][i];
                d[k][i] = NULL;
            }
            delete[] d[k];
            d[k] = NULL;
        }
        delete[] d;
        d = NULL;
        std::cout << "Продолжить? ";
        std::cin >> ch;
    }
    while (ch != 'n');
    
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2014, 14:09     Решение систем алгебраических уравнений
Еще ссылки по теме:

C++ Помогите найти программу решения систем алгебраических уравнений методом Зейделя
C++ Решение системы линейных алгебраических уравнений методом Гаусса
Решение системы алгебраических уравнений C++

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

Или воспользуйтесь поиском по форуму:
gru74ik
Модератор
 Аватар для gru74ik
3116 / 1342 / 167
Регистрация: 20.02.2013
Сообщений: 3,809
Записей в блоге: 17
30.06.2014, 14:09     Решение систем алгебраических уравнений #26
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вот ещё очень простой, но при этом вполне работающий вариант (тоже поиск в гугле).

Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <windows.h>
using namespace std;
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    int a11, a12, a13, a21, a22, a23, a31, a32, a33, b1, b2, b3;
 
    cout << "Введите значение a11: ";
    cin >> a11;
    cout << "Введите значение a12: ";
    cin >> a12;
    cout << "Введите значение a13: ";
    cin >> a13;
    cout << endl;
 
    cout << "Введите значение a21: ";
    cin >> a21;
    cout << "Введите значение a22: ";
    cin >> a22;
    cout << "Введите значение a23: ";
    cin >> a23;
    cout << endl;
 
    cout << "Введите значение a31: ";
    cin >> a31;
    cout << "Введите значение a32: ";
    cin >> a32;
    cout << "Введите значение a33: ";
    cin >> a33;
    cout << endl;
 
    cout << "Введите значение b1: ";
    cin >> b1;
    cout << "Введите значение b2: ";
    cin >> b2;
    cout << "Введите значение b3: ";
    cin >> b3;
    cout << endl;
 
    int A1 = 0, A2 = 0, A3 = 0, A4 = 0, A5 = 0, A6 = 0, A7 = 0, A8 = 0;
 
    A1 = (a11 * a22) - (a21 * a12);
    A2 = (a11 * a23) - (a21 * a13);
    A3 = (a11 * b2) - (a21 * b1);
 
    A4 = (a11 * a32) - (a31 * a12);
    A5 = (a11 * a33) - (a31 * a13);
    A6 = (a11 * b3) - (a31 * b1);
 
    A7 = (A1 * A5) - (A4 * A2);
    A8 = (A1 * A6) - (A4 * A3);
 
    int x1 = 0, x2 = 0, x3 = 0, y = 0, z = 0;
 
    x3 = A8 / A7;
    y = A3 -(A2 * x3);
    x2 = y / A1;
    z = b1 - ((a12 * x2) + (a13 * x3));
    x1 = z / a11;
 
    cout << endl;
    cout << "x1 = " << x1 << endl;
    cout << "x2 = " << x2 << endl;
    cout << "x3 = " << x3 << endl;
 
    system("pause");
    return 0;
}


P.S. Тоже немного форматирование кода поправил.

Добавлено через 8 минут
А вот этот вариант и вовсе в теме, которая в шапке раздела С++ для начинающих прикреплена.
Yandex
Объявления
30.06.2014, 14:09     Решение систем алгебраических уравнений
Ответ Создать тему
Опции темы

Текущее время: 14:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru