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

Метод Гаусса - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
С@talina
0 / 0 / 0
Регистрация: 27.09.2012
Сообщений: 5
27.09.2012, 19:56     Метод Гаусса #1
Здравствуйте, у меня такая проблема. Мне нужно написать программу, которая решает СЛАУ методом Гаусса. Программа у меня работает,но когда программа скомпилировалась, она дает ввести только сколько уранений в системе и саму системы, и она показывает какая матрица будет, и все потом она ничего не делает. Я не знаю, что там надо дописать. Программа должна работать по прямому ходу (приведение расширенной матрицы до треугольного вида) и по обратному ходу (нахождение неизвестных). Помогите, пожалуйста.
Текст программы:
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
#include <stdio.h>
#include <conio.h>
#include <math.h>
#define N 50
 
void glavelem(int k, double mas[][N + 1], int n, int otv[]);
 
int main(void)
{
    double mas[N][N + 1];
    double x[N];                //корни системы
    int otv[N];                 //отвечает за порядок корней
    int i, j, k, n;
    //ввод данных
    //clrscr();
    do {
        printf("введите число уравнений сисемы: ");
        scanf("%d", &n);
        if (N < n)
            printf("слишком большое число уравнений, повторите ввод\n");
    }
    while (N < n);
    printf("введите систему:n");
    for (i = 0; i < n; i++)
        for (j = 0; j < n + 1; j++)
            scanf("%lf", &mas[i][j]);
    //вывод введенной системы
    //clrscr();
    printf("система:n");
    for (i = 0; i < n; i++) {
        for (j = 0; j < n + 1; j++)
            printf("%7.2f ", mas[i][j]);
        printf("n");
    }
    //сначало все корни по порядку
    for (i = 0; i < n + 1; i++)
        otv[i] = i;
    //прямой ход метода Гаусса
    for (k = 0; k < n; k++) {
        glavelem(k, mas, n, otv);
        if (fabs(mas[k][k]) < 0.0001) {
            printf("система не имеет единственного решения");
            return (0);
        }
        for (j = n; j >= k; j--)
            mas[k][j] /= mas[k][k];
        for (i = k + 1; i < n; i++)
            for (j = n; j >= k; j--)
                mas[i][j] -= mas[k][j] * mas[i][k];
    }
    //обратных ход
    for (i = 0; i < n; i++)
        x[i] = mas[i][n];
    for (i = n - 2; i >= 0; i--)
        for (j = i + 1; j < n; j++)
            x[i] -= x[j] * mas[i][j];
    //вывод результата
    printf("ГЋГІГўГҐГІ:n");
    for (i = 0; i < n; i++)
        for (j = 0; j < n; j++)
            if (i == otv[j]) {        //расставляем корни по порядку
                printf("%fn", x[j]);
                break;
            }
    return (0);
}
 
//----------------------------------------------
// описание функции
//----------------------------------------------
void glavelem(int k, double mas[][N + 1], int n, int otv[])
{
    int i, j, i_max = k, j_max = k;
    double temp;
    //ищем максимальный по модулю элемент
    for (i = k; i < n; i++)
        for (j = k; j < n; j++)
            if (fabs(mas[i_max][j_max]) < fabs(mas[i][j])) {
                i_max = i;
                j_max = j;
            }
    //переставляем строки
    for (j = k; j < n + 1; j++) {
        temp = mas[k][j];
        mas[k][j] = mas[i_max][j];
        mas[i_max][j] = temp;
    }
    //переставляем столбцы
    for (i = 0; i < n; i++) {
        temp = mas[i][k];
        mas[i][k] = mas[i][j_max];
        mas[i][j_max] = temp;
    }
    //учитываем изменение порядка корней
    i = otv[k];
    otv[k] = otv[j_max];
    otv[j_max] = i;
    getch();
}
Когда программа скомпилировалась, он дает ввести только сколько уранений в системе и саму системы, и он показывает какая матрица будет, и все потом он ничего не делает
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.09.2012, 19:56     Метод Гаусса
Посмотрите здесь:

Метод Гаусса в С++ C++
метод Гаусса C++
метод Гаусса C++
метод Гаусса C++
метод гаусса C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
XmarvelX
0 / 0 / 0
Регистрация: 27.09.2012
Сообщений: 3
27.09.2012, 21:31     Метод Гаусса #2
Насколько я помню из курса линейки, метод Гаусса это сведение матрицы до диагонального вида (поправьте меня, если я не то вспомнил) а следовательно, матрица должна быть квадратной, потому что СЛАУ решится если для Х неизвестных есть Х независимых линейных уравнений... double mas[N][N + 1] - почему у вас она не квадратная, это как первый пункт= ) дальше я что-то забоялся лезть в код
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
27.09.2012, 21:47     Метод Гаусса #3
double mas[N][N + 1] - почему у вас она не квадратная
очевидно потому, что есть еще и свободные члены выражения
x1+x2 = 42
С@talina
0 / 0 / 0
Регистрация: 27.09.2012
Сообщений: 5
28.09.2012, 11:35  [ТС]     Метод Гаусса #4
http://www.cyberforum.ru/cgi-bin/latex.cgi?\begin{cases}<br />
 & 15.7x+6.6y-5.7z+11.5w= -2.4  \\ <br />
 & 8.8x-6.7y+5.5z-4.5w=5.6  \\ <br />
 & 6.3x-5.7y-23.4z+6.6w=7.7  \\ <br />
 & 14.3x+8.7y-15.7z-5.8w= 23.4  <br />
\end{cases}
Скажем, нужно решить вот такую стстему
Yandex
Объявления
28.09.2012, 11:35     Метод Гаусса
Ответ Создать тему
Опции темы

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