Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
Relaxory
0 / 0 / 0
Регистрация: 30.06.2014
Сообщений: 9
#1

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

30.06.2014, 08:53. Просмотров 2429. Ответов 25
Метки нет (Все метки)

Всех приветствую и желаю доброго дня!
Нуждаюсь в помощи по разработке алгоритма задания на языке С++
Необходимо написать программу для решения алгебраических уравнений и нахождения корней системы уравнения следующего вида:
a11+a12+a13=b14
a21+a22+a23=b24
a31+a32+a33=a34
Вот такая система, надеюсь на вашу помощь спасибо за внимание !
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.06.2014, 08:53
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Решение систем алгебраических уравнений (C++):

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

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

Решение системы алгебраических уравнений
Доброго времени суток, форумчане :) Помогите пожалуйста решить задачу: Найти...

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

Решение СЛАУ - Системы линейных алгебраических уравнений
Задачу почти закончил писать, матрицу приводит к ступенчатому виду, только не...

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

25
S_el
2133 / 1661 / 354
Регистрация: 15.12.2013
Сообщений: 6,595
30.06.2014, 08:59 #2
Relaxory, что в вашей системе известно,что нет?
В вашей записи я СЛАУ не вижу.
0
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
Затем найти корни слау
0
gru74ik
Модератор
Эксперт CЭксперт С++
4648 / 1962 / 293
Регистрация: 20.02.2013
Сообщений: 5,225
Записей в блоге: 23
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}.
0
Relaxory
0 / 0 / 0
Регистрация: 30.06.2014
Сообщений: 9
30.06.2014, 10:03  [ТС] #5
Именно так, спасибо. Я с телефона не мог написать эту систему, а так вы все правильно написали. Остался только код самой программы
0
S_el
2133 / 1661 / 354
Регистрация: 15.12.2013
Сообщений: 6,595
30.06.2014, 10:06 #6
Relaxory, каким методом вам нужно решить эту систему?
0
Relaxory
0 / 0 / 0
Регистрация: 30.06.2014
Сообщений: 9
30.06.2014, 10:13  [ТС] #7
Любой метод который Вам больше нравится
0
S_el
2133 / 1661 / 354
Регистрация: 15.12.2013
Сообщений: 6,595
30.06.2014, 10:14 #8
Relaxory, мне больше нравится тот метод,который вы сможете запрограммировать сами,или с помощью форумчан.
2
gru74ik
Модератор
Эксперт CЭксперт С++
4648 / 1962 / 293
Регистрация: 20.02.2013
Сообщений: 5,225
Записей в блоге: 23
30.06.2014, 10:16 #9
Вот код для системы из двух линейных уравнений. Попробуйте сами переделать для трёх.
Или воспользуйтесь поиском, возможно найдёте готовое решение.
0
Psilon
Master of Orion
Эксперт .NET
5981 / 4834 / 901
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 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();
}
2
Kerry_Jr
Эксперт PHP
2210 / 2006 / 940
Регистрация: 14.05.2014
Сообщений: 5,869
Записей в блоге: 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;
}
0
gru74ik
Модератор
Эксперт CЭксперт С++
4648 / 1962 / 293
Регистрация: 20.02.2013
Сообщений: 5,225
Записей в блоге: 23
30.06.2014, 10:49 #12
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
Пользоваться не очень советую
Почему?
0
Kerry_Jr
30.06.2014, 11:00
  #13

Не по теме:

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

0
Psilon
30.06.2014, 11:06
  #14

Не по теме:

Kerry_Jr, ну за такое

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

0
Kerry_Jr
Эксперт PHP
2210 / 2006 / 940
Регистрация: 14.05.2014
Сообщений: 5,869
Записей в блоге: 1
Завершенные тесты: 5
30.06.2014, 11:25 #15
Нет, это решение выдает z с обратным знаком
0
Relaxory
0 / 0 / 0
Регистрация: 30.06.2014
Сообщений: 9
30.06.2014, 11:45  [ТС] #16
Цитата Сообщение от S_el Посмотреть сообщение
Relaxory, мне больше нравится тот метод,который вы сможете запрограммировать сами,или с помощью форумчан.
методом гауса
0
S_el
2133 / 1661 / 354
Регистрация: 15.12.2013
Сообщений: 6,595
30.06.2014, 12:18 #17
Цитата Сообщение от Relaxory Посмотреть сообщение
методом гауса
Обычным или Жордана-Гаусса?
Не хотите делать сами,ищите на форуме уже готовые.
0
Relaxory
0 / 0 / 0
Регистрация: 30.06.2014
Сообщений: 9
30.06.2014, 12:21  [ТС] #18
обычный, сам я уже поискал и ничего толком не подходит, вот расчитываю на вашу щедрость и помощь
0
Relaxory
0 / 0 / 0
Регистрация: 30.06.2014
Сообщений: 9
30.06.2014, 12:25  [ТС] #19
Цитата Сообщение от S_el Посмотреть сообщение
Обычным или Жордана-Гаусса?
Не хотите делать сами,ищите на форуме уже готовые.
Решение систем алгебраических уравнений
вот само задание уже и учебник полистал, не могу реализовать в С++
0
S_el
2133 / 1661 / 354
Регистрация: 15.12.2013
Сообщений: 6,595
30.06.2014, 12:33 #20
Цитата Сообщение от Relaxory Посмотреть сообщение
вот само задание уже и учебник полистал, не могу реализовать в С++
Можете смело говорить,что это не СЛАУ так как нет неизвестных.

Цитата Сообщение от Relaxory Посмотреть сообщение
не могу реализовать в С++
Что именно вы не можете реализовать?задание массивов?Ввод коэффициентов?
0
30.06.2014, 12:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2014, 12:33
Привет! Вот еще темы с решениями:

Решение системы нелинейныз алгебраических уравнений методом Ньютона (2 уравнения)
Всем привет, ребята, кто может подсказать, как решается математически по методу...

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

Решение систем уравнений
помогите решить, не могу понять как решаются системы

Решение систем нелинейных уравнений
Решение систем не линейных уравнений с использованием различных численных...


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

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

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