0 / 0 / 0
Регистрация: 30.06.2014
Сообщений: 9
1

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

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

Всех приветствую и желаю доброго дня!
Нуждаюсь в помощи по разработке алгоритма задания на языке С++
Необходимо написать программу для решения алгебраических уравнений и нахождения корней системы уравнения следующего вида:
a11+a12+a13=b14
a21+a22+a23=b24
a31+a32+a33=a34
Вот такая система, надеюсь на вашу помощь спасибо за внимание !
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.06.2014, 08:53
Ответы с готовыми решениями:

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

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

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

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

25
2431 / 1831 / 404
Регистрация: 15.12.2013
Сообщений: 8,164
30.06.2014, 08:59 2
Relaxory, что в вашей системе известно,что нет?
В вашей записи я СЛАУ не вижу.
0
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
Эксперт CЭксперт С++
5094 / 2279 / 332
Регистрация: 20.02.2013
Сообщений: 5,598
Записей в блоге: 19
30.06.2014, 09:59 4
Надо полагать, имелось ввиду что-то типа:

https://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}

Где коэффициенты https://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{11}, https://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{12}, https://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{13}, https://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{21}, https://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{22}, https://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{23}, https://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{31}, https://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{32}, https://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{33}, и свободные члены https://www.cyberforum.ru/cgi-bin/latex.cgi?{b}_{1}, https://www.cyberforum.ru/cgi-bin/latex.cgi?{b}_{2}, https://www.cyberforum.ru/cgi-bin/latex.cgi?{b}_{3} известны (их программа запрашивает у пользователя), а найти надо корни https://www.cyberforum.ru/cgi-bin/latex.cgi?{x}_{1}, https://www.cyberforum.ru/cgi-bin/latex.cgi?{x}_{2} и https://www.cyberforum.ru/cgi-bin/latex.cgi?{x}_{3}.
0
0 / 0 / 0
Регистрация: 30.06.2014
Сообщений: 9
30.06.2014, 10:03  [ТС] 5
Именно так, спасибо. Я с телефона не мог написать эту систему, а так вы все правильно написали. Остался только код самой программы
0
2431 / 1831 / 404
Регистрация: 15.12.2013
Сообщений: 8,164
30.06.2014, 10:06 6
Relaxory, каким методом вам нужно решить эту систему?
0
0 / 0 / 0
Регистрация: 30.06.2014
Сообщений: 9
30.06.2014, 10:13  [ТС] 7
Любой метод который Вам больше нравится
0
2431 / 1831 / 404
Регистрация: 15.12.2013
Сообщений: 8,164
30.06.2014, 10:14 8
Relaxory, мне больше нравится тот метод,который вы сможете запрограммировать сами,или с помощью форумчан.
2
Эксперт CЭксперт С++
5094 / 2279 / 332
Регистрация: 20.02.2013
Сообщений: 5,598
Записей в блоге: 19
30.06.2014, 10:16 9
Вот код для системы из двух линейных уравнений. Попробуйте сами переделать для трёх.
Или воспользуйтесь поиском, возможно найдёте готовое решение.
0
Master of Orion
Эксперт .NET
6094 / 4950 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
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
Эксперт PHP
3102 / 2587 / 1219
Регистрация: 14.05.2014
Сообщений: 7,231
Записей в блоге: 1
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
Эксперт CЭксперт С++
5094 / 2279 / 332
Регистрация: 20.02.2013
Сообщений: 5,598
Записей в блоге: 19
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
Эксперт PHP
3102 / 2587 / 1219
Регистрация: 14.05.2014
Сообщений: 7,231
Записей в блоге: 1
30.06.2014, 11:25 15
Нет, это решение выдает z с обратным знаком
0
0 / 0 / 0
Регистрация: 30.06.2014
Сообщений: 9
30.06.2014, 11:45  [ТС] 16
Цитата Сообщение от S_el Посмотреть сообщение
Relaxory, мне больше нравится тот метод,который вы сможете запрограммировать сами,или с помощью форумчан.
методом гауса
0
2431 / 1831 / 404
Регистрация: 15.12.2013
Сообщений: 8,164
30.06.2014, 12:18 17
Цитата Сообщение от Relaxory Посмотреть сообщение
методом гауса
Обычным или Жордана-Гаусса?
Не хотите делать сами,ищите на форуме уже готовые.
0
0 / 0 / 0
Регистрация: 30.06.2014
Сообщений: 9
30.06.2014, 12:21  [ТС] 18
обычный, сам я уже поискал и ничего толком не подходит, вот расчитываю на вашу щедрость и помощь
0
0 / 0 / 0
Регистрация: 30.06.2014
Сообщений: 9
30.06.2014, 12:25  [ТС] 19
Цитата Сообщение от S_el Посмотреть сообщение
Обычным или Жордана-Гаусса?
Не хотите делать сами,ищите на форуме уже готовые.
Решение систем алгебраических уравнений

вот само задание уже и учебник полистал, не могу реализовать в С++
0
2431 / 1831 / 404
Регистрация: 15.12.2013
Сообщений: 8,164
30.06.2014, 12:33 20
Цитата Сообщение от Relaxory Посмотреть сообщение
вот само задание уже и учебник полистал, не могу реализовать в С++
Можете смело говорить,что это не СЛАУ так как нет неизвестных.

Цитата Сообщение от Relaxory Посмотреть сообщение
не могу реализовать в С++
Что именно вы не можете реализовать?задание массивов?Ввод коэффициентов?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.06.2014, 12:33
Помогаю со студенческими работами здесь

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru