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

Коэффициенты системы линейных уравнений - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.76
Sasuke
 Аватар для Sasuke
0 / 0 / 0
Регистрация: 09.10.2009
Сообщений: 89
25.03.2010, 19:51     Коэффициенты системы линейных уравнений #1
Коэффициенты системы линейных уравнений заданы в виде прямоугольной матрицы. С помощью допустимых преобразований привести систему к треугольному виду. Найти количество строк, среднее арифметическое элементов которых меньше заданной величины.

Очень прошу, помогите понять задачу. Я не могу понять алгоритма решения этой задачи..((
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
25.03.2010, 20:17     Коэффициенты системы линейных уравнений #2
Преобразование матрицы к треугольному виду (для квадратной) или к трапециевидному (для прямоугольной) производится с помощью прямого хода метода Гаусса. Пусть применяется метод Гаусса без выбора ведущего элемента.
Алгоритм такой.
На i-том шаге непреобразованный столбец матрицы A - это часть столбца i, начиная с элемента a[i][i] (т.е. начиная с элемента главной диагонали для квадратной матрицы). Если a[i][i] равен нулю, то тебе нужно перестановкой строк добиться того, чтобы первый элемент непреобразованного столбца не равнялся нулю. Если все элементы непреобразованного столбца равны нулю, то переходишь к следующему столбцу, в противном случае обнуляешь остальные элементы непреобразованного столбца (делишь строку, которая содержит a[i][i] на a[i][i], умножаешь на элемент, который хочешь обнулить, и отнимаешь эту строку от строки, которая содержит элемент, который ты хочешь обнулить).
А вообще, если ты на вышке решал системы методом Гаусса, то тебе должен быть понятен алгоритм
Sasuke
 Аватар для Sasuke
0 / 0 / 0
Регистрация: 09.10.2009
Сообщений: 89
26.03.2010, 10:54  [ТС]     Коэффициенты системы линейных уравнений #3
Nameless One, а можно хотя бы фрагмент программы?
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
26.03.2010, 11:05     Коэффициенты системы линейных уравнений #4
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
#include <iostream>
#include <cmath>
 
void quit()
{
    std::cout << "Матрица системы - вырожденная" << std::endl;
    exit(EXIT_SUCCESS);
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    const size_t size=4;
    double A1[size][size];
    double B1[size];
    //Матрица системы
    double A[size][size]={ 
        {6.1, 6.2, -6.3, 6.4},
        {1.1, -1.5, 2.2, -3.8},
        {5.1, -5, 4.9, -4.8},
        {1.8, 1.9, 2, -2.1}};
 
    //Вектор, определяющий правую часть с-мы
    double B[size]={6.5, 1.2, 4.7, 2.2};
    //Число перестановок строк
    size_t rCnt=0;
    //Ведущий элемент
    double ldn;
    //Номер ведущего элемента
    size_t index;
    //Неизвестные корни
    double x[size];
    //Вектор невязки
    double r[size]={0, 0, 0, 0};
    //Вспомогательный вектор
    double asv[size]={0, 0, 0, 0};
    //Определитель
    double det;
 
    //Копирование исходных массивов
    for(size_t i=0; i<size; ++i)
    {
        for(size_t j=0; j<size; ++j)
            A1[i][j]=A[i][j];
        B1[i]=B[i];
    }
 
    //Прямой ход
    for(size_t j=0; j<size-1; ++j)
    {
        //Выбор ведущего элемента столбца
        ldn=fabs(A[j][j]);
        index=j;
        for(size_t i=j; i<size; ++i)
            if(fabs(A[i][j])>ldn)
            {
                ldn=fabs(A[i][j]);
                index=i;
            }
        //Если ведущий элемент равен нулю
        if(!ldn)
            quit();//Выход
 
        //Если ведущий элемент - не на гл. диагонали
        //меняем строки местами
        if(index!=j)
        {
            ++rCnt;
            double temp=B[j];
            B[j]=B[index];
            B[index]=temp;
            for(size_t i=0; i<size; ++i)
            {
                temp=A[j][i];
                A[j][i]=A[index][i];
                A[index][i]=temp;
            }
        }
        //Обнуление элементов ниже гл. диагонали
        for(size_t i=j+1; i<size; ++i)
        {
            double coeff=-(A[i][j]/A[j][j]);
            for(size_t k=j+1; k<size; ++k)
                A[i][k]=A[i][k]+A[j][k]*coeff;
            B[i]=B[i]+B[j]*coeff;
        }
    }
 
    det=1;
    //Подсчет определителя матрицы
    for(size_t i=0; i<size; i++)
        det*=A[i][i];
    det*=(rCnt%2)? (-1) : 1;
 
    //Обратная подстановка
    for(int j=size-1; j>=0; --j)
    {
        x[j]=B[j]/A[j][j];
        if(j!=3)
            for(int i=size-1; i>j; --i)
                x[j]=x[j]-A[j][i]*x[i]/A[j][j];
    }
 
    //Вычисление вектора невязки
    for(size_t i=0; i<size; ++i)
    {
        //Вычисление вспомогательного вектора
        for(size_t j=0; j<size; ++j)
            asv[i]+=x[j]*A1[i][j];
        r[i]=B1[i]-asv[i];
    }
 
    //Вывод значений
    std::cout << "\tРешение системы линейных уравнений методом Гаусса"
                 "\n\tс частичным выбором ведущего элемента"
                 "\n\nРешение системы:" << std::endl;
    for(size_t i=0; i<size; ++i, std::cout << std::endl)
        std::cout << "x[" << i << "]=" << x[i];
    std::cout << "\nОпределитель равен " << det
              << "\n\nВектор невязки:" << std::endl;    
    for(size_t i=0; i<size; ++i, std::cout << std::endl)
        std::cout << "r[" << i << "]=" << r[i];
 
    system("pause");
    return EXIT_SUCCESS;
}
Программа решает систему линейных уравнений методом Гаусса с частичным выбором ведущего элемента, вычисляет определитель матрицы и вектор невязки. Ведущий элемент при частичном выборе - это максимальный по модулю элемент в непреобразованном столбце. Если ведущий элемент - не A[i][i], то перестановкой строк помещаем его в A[i][i]. Интересующий тебя здесь фрагмент (строки 50-88) - прямой ход метода (именно с его помощью матрица приводится к треугольному виду).
ЗЫ. Выбор ведущего элемента можешь опустить
Yandex
Объявления
26.03.2010, 11:05     Коэффициенты системы линейных уравнений
Ответ Создать тему
Опции темы

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