Форум программистов, компьютерный форум 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)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
S_el
1907 / 1502 / 296
Регистрация: 15.12.2013
Сообщений: 5,917
30.06.2014, 08:59     Решение систем алгебраических уравнений #2
Relaxory, что в вашей системе известно,что нет?
В вашей записи я СЛАУ не вижу.
Relaxory
0 / 0 / 0
Регистрация: 30.06.2014
Сообщений: 9
30.06.2014, 09:45  [ТС]     Решение систем алгебраических уравнений #3
Программа должна запрашивать произвольные числа от пользователя и подставить слау:
a11+a12+a13=b14
a21+a22+a23=b24
a31+a32+a33=a34
Затем найти корни слау
gru74ik
Модератор
 Аватар для gru74ik
3120 / 1346 / 167
Регистрация: 20.02.2013
Сообщений: 3,835
Записей в блоге: 17
30.06.2014, 09:59     Решение систем алгебраических уравнений #4
Надо полагать, имелось ввиду что-то типа:

http://www.cyberforum.ru/cgi-bin/latex.cgi?\begin{cases}{a}_{11}&{x}_{1}\, +\, {a}_{12}&{x}_{2}\, +\, {a}_{13}&{x}_{3} = {b}_{1}\\ {a}_{21}&{x}_{1}\, +\, {a}_{22}&{x}_{2}\, +\, {a}_{23}&{x}_{3} = {b}_{2}\\ {a}_{31}&{x}_{1}\, +\, {a}_{32}&{x}_{2}\, +\, {a}_{33}&{x}_{3} = {b}_{3} \end{cases}

Где коэффициенты http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{11}, http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{12}, http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{13}, http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{21}, http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{22}, http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{23}, http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{31}, http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{32}, http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{33}, и свободные члены http://www.cyberforum.ru/cgi-bin/latex.cgi?{b}_{1}, http://www.cyberforum.ru/cgi-bin/latex.cgi?{b}_{2}, http://www.cyberforum.ru/cgi-bin/latex.cgi?{b}_{3} известны (их программа запрашивает у пользователя), а найти надо корни http://www.cyberforum.ru/cgi-bin/latex.cgi?{x}_{1}, http://www.cyberforum.ru/cgi-bin/latex.cgi?{x}_{2} и http://www.cyberforum.ru/cgi-bin/latex.cgi?{x}_{3}.
Relaxory
0 / 0 / 0
Регистрация: 30.06.2014
Сообщений: 9
30.06.2014, 10:03  [ТС]     Решение систем алгебраических уравнений #5
Именно так, спасибо. Я с телефона не мог написать эту систему, а так вы все правильно написали. Остался только код самой программы
S_el
1907 / 1502 / 296
Регистрация: 15.12.2013
Сообщений: 5,917
30.06.2014, 10:06     Решение систем алгебраических уравнений #6
Relaxory, каким методом вам нужно решить эту систему?
Relaxory
0 / 0 / 0
Регистрация: 30.06.2014
Сообщений: 9
30.06.2014, 10:13  [ТС]     Решение систем алгебраических уравнений #7
Любой метод который Вам больше нравится
S_el
1907 / 1502 / 296
Регистрация: 15.12.2013
Сообщений: 5,917
30.06.2014, 10:14     Решение систем алгебраических уравнений #8
Relaxory, мне больше нравится тот метод,который вы сможете запрограммировать сами,или с помощью форумчан.
gru74ik
Модератор
 Аватар для gru74ik
3120 / 1346 / 167
Регистрация: 20.02.2013
Сообщений: 3,835
Записей в блоге: 17
30.06.2014, 10:16     Решение систем алгебраических уравнений #9
Вот код для системы из двух линейных уравнений. Попробуйте сами переделать для трёх.
Или воспользуйтесь поиском, возможно найдёте готовое решение.
Psilon
Master of Orion
 Аватар для Psilon
5738 / 4686 / 619
Регистрация: 10.07.2011
Сообщений: 14,160
Записей в блоге: 5
Завершенные тесты: 4
30.06.2014, 10:20     Решение систем алгебраических уравнений #10
gru74ik, бесполезно, количество строк кода в таком случае будет расти квадратично.

Вот пример нахождения на C#, на плюсы, надеюсь, переводить почти не надо:
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
// result - указатель на буффер правой части СЛАУ
// mtx - указатель на первый элемент матрицы
// n - размер системы
static bool _Solve_square_system(double* result, double* mtx, int n)
{
    double* mtx_u_ii, mtx_ii_j;
    double a;
    double* mtx_end = mtx + n * n, result_i, mtx_u_ii_j = null;
    double mx;
    int d = 0;
    // mtx_ii - указатель на 'ведущий' диагональный элемент матрицы
    for (double* mtx_ii = mtx, mtx_ii_end = mtx + n; mtx_ii < mtx_end; result++, mtx_ii += n + 1, mtx_ii_end += n, d++)
    {
        // Смотрим под ведущим элеменом, значение максимальное по модулю
        {
            mx = System.Math.Abs(*(mtx_ii_j = mtx_ii));
            for (mtx_u_ii = mtx_ii + n, result_i = result + 1; mtx_u_ii < mtx_end; mtx_u_ii += n, result_i++)
            {
                if (mx < System.Math.Abs(*mtx_u_ii))
                {
                    mx = System.Math.Abs(*(mtx_ii_j = mtx_u_ii));
                    mtx_u_ii_j = result_i;
                }
            }
            // если максимальный по модулю элемент равен 0 - система вырождена и не имеет решения
            if (mx == 0) return false;
            // если максимальный элемент не является ведущим, делаем перестановку строк, чтобы он стал ведущим
            else if (mtx_ii_j != mtx_ii)
            {
                a = *result;
                *result = *mtx_u_ii_j;
                *mtx_u_ii_j = a;
                for (mtx_u_ii = mtx_ii; mtx_u_ii < mtx_ii_end; mtx_ii_j++, mtx_u_ii++)
                {
                    a = *mtx_u_ii; *mtx_u_ii = *mtx_ii_j; *mtx_ii_j = a;
                }
            }
        }
        //'обнуляем' элементы над ведущим
        for (mtx_u_ii = mtx_ii - n, result_i = result - 1; mtx_u_ii > mtx; mtx_u_ii -= n)
        {
            a = *(mtx_u_ii) / *mtx_ii;
            for (mtx_ii_j = mtx_ii + 1, mtx_u_ii_j = mtx_u_ii + 1; mtx_ii_j < mtx_ii_end; *(mtx_u_ii_j++) -= *(mtx_ii_j++) * a) ;
            *(result_i--) -= *(result) * a;
        }
        //'обнуляем' элементы под ведущим
        for (mtx_u_ii = mtx_ii + n, result_i = result + 1; mtx_u_ii < mtx_end; mtx_u_ii += d)
        {
            a = *(mtx_u_ii++) / *mtx_ii;
            for (mtx_ii_j = mtx_ii + 1; mtx_ii_j < mtx_ii_end; *(mtx_u_ii++) -= *(mtx_ii_j++) * a) ;
            *(result_i++) -= *(result) * a;
        }
    }
    //матрица приведена к дигональному виду
    //приводим ее к единичному, получая права решение
    for (; mtx_end > mtx; *(--result) /= *(--mtx_end), mtx_end -= n) ;
    return true;
}
public static bool SolveSquare(double[] outResult, double[,] A, double[] x)
{
    int n = outResult.Length;
    if (n == x.Length && n == A.GetLength(0) && n == A.GetLength(1))
    {
        if (n > 0)
        {
            Array.Copy(x, outResult, n);
            fixed(double* presult = &outResult[0])
            fixed (double* pmtx = &A[0,0])
                return _Solve_square_system(presult, pmtx, n);
        }
        else return true; 
    }
    throw new IndexOutOfRangeException();
}
Kerry_Jr
Модератор
 Аватар для Kerry_Jr
1858 / 1654 / 577
Регистрация: 14.05.2014
Сообщений: 4,753
Записей в блоге: 1
Завершенные тесты: 5
30.06.2014, 10:48     Решение систем алгебраических уравнений #11
Пользоваться не очень советую, но
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
#include <iostream>
#include <cmath>
 
//Минор матрицы
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;
}
 
int countZero(double** matrix, int size)
{
    int max_zero = 0, zero, count = 0;
    for (int i = 0; i < size; i++)
    {
        zero = 0;
        for (int j = 0; j < size; j++)
        {
            if (*(matrix+i*size+j) == 0)
                zero++;
        }
        if (max_zero < zero)
        {
            max_zero = zero;
            count = i;
        }
    }
    return count;
}
 
// Детерминант матрицы
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;
    int zero_row = countZero(matrix, size);
    for (int j = 0; j < size; j++)
        if (matrix[zero_row][j])
            determ += pow(-1, j) * matrix[zero_row][j] * determinant(minor(matrix,zero_row, j, size), size-1);
            
    return determ;
}
 
int main()
{
    setlocale(LC_ALL, "");
    const int row = 3;
    const int col = 4;
    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*[row];
    double** d1 = new double*[row];
    double** d2 = new double*[row];
    double** d3 = new double*[row];
    for (int i = 0; i < row; i++)
    {
        d[i] = new double[row]; 
        d1[i] = new double[row]; 
        d2[i] = new double[row]; 
        d3[i] = new double[row]; 
        for (int j = 0; j < row; j++)
        {   
            d[i][j] = d0[i][j];
            d1[i][j] = d0[i][j];
            d2[i][j] = d0[i][j];
            d3[i][j] = d0[i][j];
            if (j == 0) d1[i][j] = d0[i][3];
            if (j == 1) d2[i][j] = d0[i][3];    
            if (j == 2) d3[i][j] = d0[i][3];
        }
    }
    double det, det1, det2, det3, x, y, z;
    det = determinant(d, row);
    if (det != 0)
    {
        x = determinant(d1,row)/det;
        y = determinant(d2,row)/det;
        z = determinant(d3,row)/det;
        std::cout << "x = " << x << std::endl;
        std::cout << "y = " << y << std::endl;
        std::cout << "z = " << z << std::endl;
    }
    else std::cout << "Корней нет!" << std::endl;
    
    return 0;
}
gru74ik
Модератор
 Аватар для gru74ik
3120 / 1346 / 167
Регистрация: 20.02.2013
Сообщений: 3,835
Записей в блоге: 17
30.06.2014, 10:49     Решение систем алгебраических уравнений #12
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
Пользоваться не очень советую
Почему?
Kerry_Jr
30.06.2014, 11:00
  #13

Не по теме:

Я самокритичен, очень

Psilon
30.06.2014, 11:06
  #14

Не по теме:

Kerry_Jr, ну за такое

C++
1
pow(-1, j)
можно надавать по рукам, а так норм

Kerry_Jr
Модератор
 Аватар для Kerry_Jr
1858 / 1654 / 577
Регистрация: 14.05.2014
Сообщений: 4,753
Записей в блоге: 1
Завершенные тесты: 5
30.06.2014, 11:25     Решение систем алгебраических уравнений #15
Нет, это решение выдает z с обратным знаком
Relaxory
0 / 0 / 0
Регистрация: 30.06.2014
Сообщений: 9
30.06.2014, 11:45  [ТС]     Решение систем алгебраических уравнений #16
Цитата Сообщение от S_el Посмотреть сообщение
Relaxory, мне больше нравится тот метод,который вы сможете запрограммировать сами,или с помощью форумчан.
методом гауса
S_el
1907 / 1502 / 296
Регистрация: 15.12.2013
Сообщений: 5,917
30.06.2014, 12:18     Решение систем алгебраических уравнений #17
Цитата Сообщение от Relaxory Посмотреть сообщение
методом гауса
Обычным или Жордана-Гаусса?
Не хотите делать сами,ищите на форуме уже готовые.
Relaxory
0 / 0 / 0
Регистрация: 30.06.2014
Сообщений: 9
30.06.2014, 12:21  [ТС]     Решение систем алгебраических уравнений #18
обычный, сам я уже поискал и ничего толком не подходит, вот расчитываю на вашу щедрость и помощь
Relaxory
0 / 0 / 0
Регистрация: 30.06.2014
Сообщений: 9
30.06.2014, 12:25  [ТС]     Решение систем алгебраических уравнений #19
Цитата Сообщение от S_el Посмотреть сообщение
Обычным или Жордана-Гаусса?
Не хотите делать сами,ищите на форуме уже готовые.
Решение систем алгебраических уравнений
вот само задание уже и учебник полистал, не могу реализовать в С++
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2014, 12:33     Решение систем алгебраических уравнений
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
S_el
1907 / 1502 / 296
Регистрация: 15.12.2013
Сообщений: 5,917
30.06.2014, 12:33     Решение систем алгебраических уравнений #20
Цитата Сообщение от Relaxory Посмотреть сообщение
вот само задание уже и учебник полистал, не могу реализовать в С++
Можете смело говорить,что это не СЛАУ так как нет неизвестных.

Цитата Сообщение от Relaxory Посмотреть сообщение
не могу реализовать в С++
Что именно вы не можете реализовать?задание массивов?Ввод коэффициентов?
Yandex
Объявления
30.06.2014, 12:33     Решение систем алгебраических уравнений
Ответ Создать тему
Опции темы

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