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

Двумерные массивы (СЛАУ). Привести систему к треугольному виду - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.88
silverserfer
-123 / 0 / 0
Регистрация: 12.10.2012
Сообщений: 12
30.12.2012, 01:24     Двумерные массивы (СЛАУ). Привести систему к треугольному виду #1
Коэффициенты системы линейных уравнений заданы в виде прямоугольной матрицы.С помощью допустимых преобразований привести систему к треугольному виду. Найти количество строк, среднее арифметическое элементов которых меньше данной величины.

Незнаю как решить.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.12.2012, 01:24     Двумерные массивы (СЛАУ). Привести систему к треугольному виду
Посмотрите здесь:

C++ Как привести матрицу к верхнему треугольному виду? С++ (Имеется код нахождения нижней треуг. матрицы)
C++ Как привести матрицу к треугольному виду по методу гауса?
C++ Задача: привести матрицу к треугольному виду
Как привести матрицу к треугольному виду C++
C++ Свести матрицу к треугольному виду
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silverserfer
-123 / 0 / 0
Регистрация: 12.10.2012
Сообщений: 12
31.12.2012, 14:39  [ТС]     Двумерные массивы (СЛАУ). Привести систему к треугольному виду #21
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Тем, что там используются не общеизвестные функции. emmintrin.h - я такой в первый раз вижу >_>
__m128d - странный тип, используемый в SIMD 2 - странные инструкции для процессора. Походу это что-то с чем-то для оптимизации кода. Только вопрос, а зачем это обычному студенту, тем более такое никто не приподает. Вот спросит препод - и что ему отвечать? Короче, слишком много надо знать, чтобы такое использовать.
Вот точно! В точку ! Я не понимаю чего там понаписано, к тому же я как бы сам еще хочу понять алгоритм.

[удалено]

да потому что там половино всего расписано, чтобы ваш код разбирать себе головную боль создавать. Я лучше сам алгоритм узнаю точный а потом сам напишу.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
31.12.2012, 15:09     Двумерные массивы (СЛАУ). Привести систему к треугольному виду #22
Для всех дочитавших эту тему,(но не для автора данной темы!) привожу код на С++ для метода Гаусса из поста5, котрый после отработки функции PryamoiHod(n, a, b); привод систему к треугольному виду (как видим изменений от кода поста 5 почти нет, прото было переписано с Си на С++, хотя кому то не под силу их даже это было осознать)
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include <cmath>
#include <iostream>
using namespace std;
 
void ShowVector(int n, double * vec);
void PryamoiHod(int n, double **a, double *b);
void ObratniHod(int n, double **a, double *b, double *x);
 
int main()
{
    int i,j,n;
    double **a, *b, *x;
    char chInp = 0;
    do
    {
        cout<<"Enter NUM of equations: ";cin>>n;
        //Выделяем память под матрицу А и векторы В и Х
        a = new double *[n];
        b = new double [n];
        x = new double [n];
        for(i = 0; i < n; i++)
        {
            a[i] = new double[n];
            //Ввод a
            for(j = 0; j < n; j++)
            {
                cout<<"a["<<i + 1<<"]["<<j + 1<<"] = ";
                cin>>a[i][j];cin.get();
            }
        }
        //Ввод b
        for(i = 0; i < n; i++)
        {
            cout<<"b["<<i + 1<<"] = ";
            cin>>b[i];cin.get();
        }
        
        cout<<"\tSee input\r\n";
        cout<<"Matrix A:\r\n";
        for(i = 0; i < n; i++)
            ShowVector(n, a[i]);
        cout<<"Vector B:\r\n";
        ShowVector(n, b);
        
        cout<<"\tSolving on Gauss method\r\n";
        PryamoiHod(n, a, b);
        cout<<"Forvard Gauss course\r\n";//Прямой ход
        cout<<"Matrix A:\r\n";
        for(i = 0; i < n; i++)
            ShowVector(n, a[i]);
        cout<<"Vector B:\r\n";
        ShowVector(n, b);
 
        ObratniHod(n, a, b, x);
        cout<<"Back Gauss course\r\n";//Обратный ход
        cout<<"Matrix A:\r\n";
        for(i = 0; i < n; i++)
            ShowVector(n, a[i]);
        cout<<"Vector B:\r\n";
        ShowVector(n, b);
 
        cout<<"Results :\r\n";
        ShowVector(n, x);
 
        cout<<"Enter Y for new input\r\n";
        cin>>chInp;cin.get();
        //Чистим память
        for(i = 0; i < n; i++)
            delete [] a[i];
        delete [] a;
        delete [] b;
        delete [] x;
        
    }
    while(toupper(chInp) == 'Y');
    return 0;
}
 
void ShowVector(int n, double * vec)
{
    for(int i = 0; i < n; i++)
        cout<<vec[i]<<"\t";
    printf("\r\n");
}
 
void PryamoiHod(int n, double **a, double *b)
{
        double v;
        for(int k = 0,i,j,im; k < n - 1; k++)
        {
                im = k;
                for(i = k + 1; i < n; i++)
                {
                        if(fabs(a[im][k]) < fabs(a[i][k]))
                        {
                                im = i;
                        }
                }
                if(im != k)
                {
                        for(j = 0; j < n; j++)
                        {
                                v                = a[im][j];
                                a[im][j] = a[k][j];
                                a[k][j]  = v;
                        }
                        v     = b[im];
                        b[im] = b[k];
                        b[k]  = v;
                }
                for(i = k + 1; i < n; i++)
                {
                        v               = 1.0*a[i][k]/a[k][k];
                        a[i][k] = 0;
                        b[i]    = b[i] - v*b[k];
                        if(v != 0)
                        for(j = k + 1; j < n; j++)
                        {
                                a[i][j] = a[i][j] - v*a[k][j];
                        }
                }
        }
}
 
void ObratniHod(int n, double **a, double *b, double *x)
{
        double s = 0;
        x[n - 1] = 1.0*b[n - 1]/a[n - 1][n - 1];
        for(int i = n - 2, j; 0 <= i; i--)
        {
                s = 0;
                for(j = i + 1; j < n; j++)
                {
                        s = s+a[i][j]*x[j];
                }
                x[i] = 1.0*(b[i] - s)/a[i][i];
        }
}
Миниатюры
Двумерные массивы (СЛАУ). Привести систему к треугольному виду  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.12.2012, 15:35     Двумерные массивы (СЛАУ). Привести систему к треугольному виду
Еще ссылки по теме:

C++ С помощью допустимых изменений привести систему к треугольному виду...
C++ Привести матрицу к треугольному виду
Привести вектор к треугольному виду C++

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

Или воспользуйтесь поиском по форуму:
silverserfer
-123 / 0 / 0
Регистрация: 12.10.2012
Сообщений: 12
31.12.2012, 15:35  [ТС]     Двумерные массивы (СЛАУ). Привести систему к треугольному виду #23
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Для всех дочитавших эту тему,(но не для автора данной темы!) привожу код на С++ для метода Гаусса из поста5, котрый после отработки функции PryamoiHod(n, a, b); привод систему к треугольному виду (как видим изменений от кода поста 5 почти нет, прото было переписано с Си на С++, хотя кому то не под силу их даже это было осознать)
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include <cmath>
#include <iostream>
using namespace std;
 
void ShowVector(int n, double * vec);
void PryamoiHod(int n, double **a, double *b);
void ObratniHod(int n, double **a, double *b, double *x);
 
int main()
{
    int i,j,n;
    double **a, *b, *x;
    char chInp = 0;
    do
    {
        cout<<"Enter NUM of equations: ";cin>>n;
        //Выделяем память под матрицу А и векторы В и Х
        a = new double *[n];
        b = new double [n];
        x = new double [n];
        for(i = 0; i < n; i++)
        {
            a[i] = new double[n];
            //Ввод a
            for(j = 0; j < n; j++)
            {
                cout<<"a["<<i + 1<<"]["<<j + 1<<"] = ";
                cin>>a[i][j];cin.get();
            }
        }
        //Ввод b
        for(i = 0; i < n; i++)
        {
            cout<<"b["<<i + 1<<"] = ";
            cin>>b[i];cin.get();
        }
        
        cout<<"\tSee input\r\n";
        cout<<"Matrix A:\r\n";
        for(i = 0; i < n; i++)
            ShowVector(n, a[i]);
        cout<<"Vector B:\r\n";
        ShowVector(n, b);
        
        cout<<"\tSolving on Gauss method\r\n";
        PryamoiHod(n, a, b);
        cout<<"Forvard Gauss course\r\n";//Прямой ход
        cout<<"Matrix A:\r\n";
        for(i = 0; i < n; i++)
            ShowVector(n, a[i]);
        cout<<"Vector B:\r\n";
        ShowVector(n, b);
 
        ObratniHod(n, a, b, x);
        cout<<"Back Gauss course\r\n";//Обратный ход
        cout<<"Matrix A:\r\n";
        for(i = 0; i < n; i++)
            ShowVector(n, a[i]);
        cout<<"Vector B:\r\n";
        ShowVector(n, b);
 
        cout<<"Results :\r\n";
        ShowVector(n, x);
 
        cout<<"Enter Y for new input\r\n";
        cin>>chInp;cin.get();
        //Чистим память
        for(i = 0; i < n; i++)
            delete [] a[i];
        delete [] a;
        delete [] b;
        delete [] x;
        
    }
    while(toupper(chInp) == 'Y');
    return 0;
}
 
void ShowVector(int n, double * vec)
{
    for(int i = 0; i < n; i++)
        cout<<vec[i]<<"\t";
    printf("\r\n");
}
 
void PryamoiHod(int n, double **a, double *b)
{
        double v;
        for(int k = 0,i,j,im; k < n - 1; k++)
        {
                im = k;
                for(i = k + 1; i < n; i++)
                {
                        if(fabs(a[im][k]) < fabs(a[i][k]))
                        {
                                im = i;
                        }
                }
                if(im != k)
                {
                        for(j = 0; j < n; j++)
                        {
                                v                = a[im][j];
                                a[im][j] = a[k][j];
                                a[k][j]  = v;
                        }
                        v     = b[im];
                        b[im] = b[k];
                        b[k]  = v;
                }
                for(i = k + 1; i < n; i++)
                {
                        v               = 1.0*a[i][k]/a[k][k];
                        a[i][k] = 0;
                        b[i]    = b[i] - v*b[k];
                        if(v != 0)
                        for(j = k + 1; j < n; j++)
                        {
                                a[i][j] = a[i][j] - v*a[k][j];
                        }
                }
        }
}
 
void ObratniHod(int n, double **a, double *b, double *x)
{
        double s = 0;
        x[n - 1] = 1.0*b[n - 1]/a[n - 1][n - 1];
        for(int i = n - 2, j; 0 <= i; i--)
        {
                s = 0;
                for(j = i + 1; j < n; j++)
                {
                        s = s+a[i][j]*x[j];
                }
                x[i] = 1.0*(b[i] - s)/a[i][i];
        }
}
Спасибо что вы его перекодили на с++, я вам вот за это могу сказать большое спасибо. Но все же у меня есть некоторые вопросы , да я не знаю алгоритм как написать этот , но желание научиться все же у меня есть. Вы не могли бы мне сами действия алгоритма где он приводит матрицу к треугольному виду откомментить, я чуть не могу просто понять что для чего там служит im например и мне кажется там еще другие действия есть которые для моей задачи не нужны видимо , это когда с матрицой b какие то действия идут. Если вот вы мне это объясните я вам вот честное слово , буду благодарен.
Yandex
Объявления
31.12.2012, 15:35     Двумерные массивы (СЛАУ). Привести систему к треугольному виду
Ответ Создать тему
Опции темы

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