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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Вычислить сумму последовательности http://www.cyberforum.ru/cpp-beginners/thread108843.html
S= sinX + sinX2(квадрат) + SinX3(куб) + sinX4(в четвертой степени) + … + sinXn(н-ая степень)
C++ Найти сумму цифр в десятичном числе k Найти сумму цифр в десятичном числе k http://www.cyberforum.ru/cpp-beginners/thread108832.html
Нужно сделать переменную статической C++
Доброго времени суток всем. У меня вот какая проблема: создан класс множество. Перегружен оператор + чтоб добавлять элементы. Но вот при добавлении элемента оно добавляет элемент не в конец множества,а вместо последнего добавленного, т е получается множество является не статической переменной,а обновляется каждый раз при добавлении. со счётчиком ,который есть для того чтоб указывать в какое место...
Найти произведение и количество элементов линейной таблицы, имеющих четные значения C++
1) Составить программу для подсчета произведения и количества элементов линейной тфблицы B, состоящей из 24 целых чисел имеющих четные значения. 3) Заданны два одномерных массива А и В разномерности N. Составить программу, проверяющую, можно ли, меняя местами элемеенты одномерного массива А, получить одномерный массив В. Учесть, что массив состоит из неповторяющихся по значению элементов.
C++ Сложение двух чисел http://www.cyberforum.ru/cpp-beginners/thread108808.html
Сложение двух чисел. Как, если оба числа в диапазоне от 0 до 2*10^9 ? Если складывать 2*10^9 + 2*10^9 то long int не справляется((
C++ Дана последовательность целых чисел, за которой следует 0. Найти количество четных элементов этой последовательности Дана последовательность целых чисел, за которой следует 0. Найти количество четных элементов этой последовательности. Помогите!!! подробнее

Показать сообщение отдельно
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
26.03.2010, 11:05     Коэффициенты системы линейных уравнений
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) - прямой ход метода (именно с его помощью матрица приводится к треугольному виду).
ЗЫ. Выбор ведущего элемента можешь опустить
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru