Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.51/158: Рейтинг темы: голосов - 158, средняя оценка - 4.51
2 / 2 / 0
Регистрация: 14.10.2012
Сообщений: 53
1

Найти решение системы линейных уравнений методом Гаусса с выбором главного элемента в столбце

10.11.2012, 16:16. Просмотров 31796. Ответов 7
Метки нет (Все метки)

Решить систему линейных уравнений методом Гаусса с выбором главного элемента в столбце.
Вот моя программа
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 "stdafx.h"
#include <locale>
#include <iostream>
using namespace std;
const int n=4;
int i, j, m, k;
double aa, bb;
 
double a[n][n+1]={{  3,   4, -9,   5, -14},   //матрица коэффициентов, где последний столбец - правая часть системы
               {-15, -12,  50, -16, 44}, 
               {-27, -36,  73,   8, 142},
               {  9,  12, -10, -16, -76}};
 
void main()
{
    setlocale(LC_ALL, "Russian");
    double* x; 
    x = (double *)malloc(n* sizeof(double));
 
    for (k = 0; k<n; k++) //Поиск максимального элемента в первом столбце
    {
        aa = abs(a[k][k]);
        i = k;
        for(m = k+1; m<n; m++)
            if(abs(a[m][k])>aa)
            {
                i = m;
                aa = abs(a[m][k]);
            }
 
            if (aa == 0)   //проверка на нулевой элемент
            {
                cout<<"Система не имеет решений"<<endl;
            }
 
        if (i != k)  //  перестановка i-ой строки, содержащей главный элемент k-ой строки
        {
         for (j=k; j < n+1; j++)
         {
            bb = a[k][j];
            a[k][j] = a[i][j];
            a[i][j] = bb;
         }
        }
        aa = a[k][k];//преобразование k-ой строки (Вычисление масштабирующих множителей)
        a[k][k] = 1;   
        for (j=k+1;j<n;j++) 
            a[k][j] = a[k][j]/aa;
        for (i = k+1; i < n; i++)//преобразование строк с помощью k-ой строки
        {
         bb = a[i][k];
         a[i][k] = 0;
         if (bb!=0)
            for (j=k+1; j< n+1; j++)
              a[i][j]=a[i][j]-bb*a[k][j];
        }
    }
 
    for (i=n; i>0; i--)   //Нахождение решений СЛАУ
    {
      x[i] = 0;
      aa = a[i][n+1];
      for (j = n; j>i; j--) 
         aa = aa-a[i][j]*x[j];
      x[i] = aa;
    }
 
   cout<<"Решение системы:"<<endl;  //вывод решений
   for (i = 1; i< n+1; i++)
   {
      cout<<"x["<<i<<"]="<<x[i];
      cout<<endl;
   }
   system("PAUSE");
}
на выходе должно получиться: х1 = -8; х2 = -2; х3 = -2; х4 = 0
У меня выводится что-то непонятное. Подскажите пожалуйста где ошибка
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.11.2012, 16:16
Ответы с готовыми решениями:

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

GUI: Решение системы линейных уравнений методом Гаусса с выбором главного элемента.
clc,clear n = input('Количество строк'); A= for p=1:1:n B=zeros(n,1); for i=p:1:n if...

СЛАУ методом Гаусса с выбором главного элемента в столбце
СЛАУ методом Гаусса с выбором главного элемента по столбцу.Помогите пожалуйста с кодом...

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

7
570 / 553 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
10.11.2012, 16:36 2
много ошибок с индексами было
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
#include <locale>
#include <iostream>
using namespace std;
const int n=4;
int i, j, m, k;
double aa, bb;
 
double a[n][n+1]={{  3,   4, -9,   5, -14},   //матрица коэффициентов, где последний столбец - правая часть системы
{-15, -12,  50, -16, 44}, 
{-27, -36,  73,   8, 142},
{  9,  12, -10, -16, -76}};
 
void main()
{
    setlocale(LC_ALL, "Russian");
    double* x; 
    x = (double *)malloc(n* sizeof(double));
 
    for (k = 0; k<n; k++) //Поиск максимального элемента в первом столбце
    {
        aa = abs(a[k][k]);
        i = k;
        for(m = k+1; m<n; m++)
            if(abs(a[m][k])>aa)
            {
                i = m;
                aa = abs(a[m][k]);
            }
 
            if (aa == 0)   //проверка на нулевой элемент
            {
                cout<<"Система не имеет решений"<<endl;
            }
 
            if (i != k)  //  перестановка i-ой строки, содержащей главный элемент k-ой строки
            {
                for (j=k; j < n+1; j++)
                {
                    bb = a[k][j];
                    a[k][j] = a[i][j];
                    a[i][j] = bb;
                }
            }
            aa = a[k][k];//преобразование k-ой строки (Вычисление масштабирующих множителей)
            a[k][k] = 1;   
            for (j=k+1;j<n+1;j++) 
                a[k][j] = a[k][j]/aa;
            for (i = k+1; i < n; i++)//преобразование строк с помощью k-ой строки
            {
                bb = a[i][k];
                a[i][k] = 0;
                if (bb!=0)
                    for (j=k+1; j< n+1; j++)
                        a[i][j]=a[i][j]-bb*a[k][j];
            }
    }
 
    for (i=n-1; i>=0; i--)   //Нахождение решений СЛАУ
    {
        x[i] = 0;
        aa = a[i][n];
        for (j = n; j>i; j--) 
            aa = aa-a[i][j]*x[j];
        x[i] = aa;
    }
 
    cout<<"Решение системы:"<<endl;  //вывод решений
    for (i = 0; i< n; i++)
    {
        cout<<"x["<<i+1<<"]="<<x[i];
        cout<<endl;
    }
    system("PAUSE");
}
1
2 / 2 / 0
Регистрация: 14.10.2012
Сообщений: 53
10.11.2012, 16:51  [ТС] 3
I.M., Спасибо большое! Вы мне очень помогли!
0
1 / 1 / 0
Регистрация: 26.12.2016
Сообщений: 5
26.12.2016, 19:57 4
I.M.,
Привет,мог бы ты мне помочь доделать код,который ты раньше делал,он выдает ошибки.

Решить систему линейных уравнений методом Гаусса с выбором главного элемента в столбце:
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
#include <locale>
#include <iostream>
using namespace std;
const int n=4;
int i, j, m, k;
double aa, bb;
 
double a[n][n+1]={{  3,   4, -9,   5, -14},   //матрица коэффициентов, где последний столбец - правая часть системы
{-15, -12,  50, -16, 44}, 
{-27, -36,  73,   8, 142},
{  9,  12, -10, -16, -76}};
 
void main()
{
    setlocale(LC_ALL, "Russian");
    double* x; 
    x = (double *)malloc(n* sizeof(double));
 
    for (k = 0; k<n; k++) //Поиск максимального элемента в первом столбце
    {
        aa = abs(a[k][k]);
        i = k;
        for(m = k+1; m<n; m++)
            if(abs(a[m][k])>aa)
            {
                i = m;
                aa = abs(a[m][k]);
            }
 
            if (aa == 0)   //проверка на нулевой элемент
            {
                cout<<"Система не имеет решений"<<endl;
            }
 
            if (i != k)  //  перестановка i-ой строки, содержащей главный элемент k-ой строки
            {
                for (j=k; j < n+1; j++)
                {
                    bb = a[k][j];
                    a[k][j] = a[i][j];
                    a[i][j] = bb;
                }
            }
            aa = a[k][k];//преобразование k-ой строки (Вычисление масштабирующих множителей)
            a[k][k] = 1;   
            for (j=k+1;j<n+1;j++) 
                a[k][j] = a[k][j]/aa;
            for (i = k+1; i < n; i++)//преобразование строк с помощью k-ой строки
            {
                bb = a[i][k];
                a[i][k] = 0;
                if (bb!=0)
                    for (j=k+1; j< n+1; j++)
                        a[i][j]=a[i][j]-bb*a[k][j];
            }
    }
 
    for (i=n-1; i>=0; i--)   //Нахождение решений СЛАУ
    {
        x[i] = 0;
        aa = a[i][n];
        for (j = n; j>i; j--) 
            aa = aa-a[i][j]*x[j];
        x[i] = aa;
    }
 
    cout<<"Решение системы:"<<endl;  //вывод решений
    for (i = 0; i< n; i++)
    {
        cout<<"x["<<i+1<<"]="<<x[i];
        cout<<endl;
    }
    system("PAUSE");
}
0
0 / 0 / 0
Регистрация: 01.06.2017
Сообщений: 22
03.06.2017, 01:05 5
I.M., I.M., Простите за глупый вопрос, как скопировать ее себе? у меня не компилируется после void main() ошибка
0
с++
1196 / 482 / 211
Регистрация: 15.07.2015
Сообщений: 2,402
03.06.2017, 07:28 6
Цитата Сообщение от Penattt Посмотреть сообщение
void main() ошибка
так должно же быть int main(){return 0;}
0
0 / 0 / 0
Регистрация: 01.06.2017
Сообщений: 22
03.06.2017, 12:20 7
Все равно не получилось, мне вместо
C++
1
void main()
поставить
C++
1
int main()
а в конце return 0;
0
Работаю
6 / 5 / 0
Регистрация: 30.05.2014
Сообщений: 170
11.09.2019, 13:55 8
вот мой код с выбором количества уравнений и значений X, программа под винду, написана в Visual C++ 2008, переменная n количество уравнений и значений X в уравнении:
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
                                int n1, k1, j, m;
                double v, s;
                //создаем матрицу значений A
                double **a=new double*[n];
                for(int i=0;i<n;i++)a[i]=new double[n];
                //создаем матрицу C
                double **c=new double*[n];
                for(int i=0;i<n;i++)c[i]=new double[n];
                //создаем массив значений B
                double *b=new double[n];
                //создаем массив G
                double *g=new double[n];
                //создаем массив корней X
                double *x=new double[n];
                //заполняем матрицу A
                for(int i=0;i<n;i++)
                    for(int j=0;j<n;j++)a[i][j]=System::Convert::ToDouble(dataGridView1->Rows[i]->Cells[j]->Value);
                //заполняем массив B
                for(int i=0;i<n;i++)b[i]=System::Convert::ToDouble(dataGridView1->Rows[i]->Cells[n]->Value);
                //решение
                n1=n-1;
                for(int k=0;k<n1;k++){
                    if(fabs(a[k][k])==0){
                        k1=k+1;
                        for(int m=k1;m<n;m++){
                            if(fabs(a[m][k])==0)continue;
                            for(int l=0;l<n;l++){
                                v=a[k][l];
                                a[k][l]=a[m][l];
                                a[m][l]=v;
                            }
                        }
                        v=b[k];b[k]=b[m];b[m]=v;
                    }
                    g[k]=b[k]/a[k][k];k1=k+1;
                    for(int i=k1;i<n;i++){
                        b[i]=b[i]-a[i][k]*g[k];
                        for(int j1=k;j1<n;j1++){
                            j=n-1-j1+k;c[k][j]=a[k][j]/a[k][k];
                            a[i][j]=a[i][j]-a[i][k]*c[k][j];
                        }
                    }
                }
                m=n-1;x[m]=b[m]/a[m][m];
                do{
                    m=m-1;s=0;
                    for(int l=m;l<n1;l++)s=s+c[m][l+1]*x[l+1];
                    x[m]=g[m]-s;
                }while(m>0);
                dataGridView2->RowCount=n;
                dataGridView2->ColumnCount=2;
                dataGridView2->Columns[0]->Width=30;
                dataGridView2->Columns[1]->Width=100;
                //вывод результата значений корней X
                for(int i=0;i<n;i++){
                    dataGridView2->Rows[i]->Cells[0]->Value="X"+(i+1).ToString();
                    dataGridView2->Rows[i]->Cells[1]->Value=x[i];
                }
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.09.2019, 13:55

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Для системы линейных уравнений найти решение методом Гаусса
Для системы линейных уравнений найти решение методом Гаусса (разработать алгоритм-прога на паскале)...

Найти общее решение системы линейных уравнений методом Гаусса
Ребят нужна помощь! а то это на зачёт нести, я не знаю как делать! Болел в то время когда...

Решение СЛАУ методом Гаусса с выбором главного элемента
Решите пожалуйста примерчик , если не трудно, а уже по образцу попробую на экзамене ...:-[

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


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

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

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