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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Janice
0 / 0 / 0
Регистрация: 11.04.2013
Сообщений: 3
#1

Метод Гаусса через единичную диагональ. Что не так? - C++

11.04.2013, 22:44. Просмотров 416. Ответов 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
 # include<stdio.h> 
#include <conio.h> 
#define N 2 // размерность
 
int main () 
{
int i, n, g, k;
float A[N][N+1], a, b, c, d, e; // a & b - коэфф, с & d & e - для вычислений
A[0][0]=1; A[0][1]=2; A[0][2]=11;
A[1][0]=3; A[1][1]=4; A[1][2]=25;
for (n=0; n<N; n++)
{
a=A[n][n]; printf("\n%f\n", a); 
for (i=0; i<N+1; i++)
{ 
c=A[n][i];
A[n][i]=c/a; // заготовка для диагонали
}
for (g=0; g<N; g++)
{ 
if(g!=n)
{
b=A[g][n]/a; //определили коэф для обнуления по столбцу
for (k=0; k<N+1; k++)
{
d=A[g][k];
e=A[n][k];
A[g][k]=d-e*b; // "вычли" уравнение из всех ост так, чтобы обнул по столбцу
}
}
} 
}
for (n=0; n<N; n++)
{
printf ("\n");
for (i=0; i<N+1; i++)
printf ("%2.3f ", A[n][i]);
} 
getch(); return 0; }
Неправильно считает: корни 3 и 16
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2013, 22:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Метод Гаусса через единичную диагональ. Что не так? (C++):

СЛАУ. Метод обратной матрицы, метод Гаусса, метод Крамера, метод Зейделя - C++
Помогите ребят. Не могу построить алгоритмы для этих методов Язык C++

Метод Гаусса - C++
Как решить квадратную матрицу методом Гаусса, я ее привел к треугольному виду, не могу понять как дальше быть....

Метод Гаусса!!! - C++
Всем привет! )) У меня вот такая проблемка! Нужно решить СЛАУ методом Гаусса с выбором главного элемента по столбцу!! Теоретически знаю, а...

метод гаусса - C++
найти метод гаусса n+1 значение определителя в n+1 точке, а затем решить систему из n+1 уравнение с n+1 неизвестными. составить...

Метод Гаусса - C++
Здравствуйте, у меня такая проблема. Мне нужно написать программу, которая решает СЛАУ методом Гаусса. Программа у меня работает,но когда...

Метод Гаусса - C++
Как реализовать метод Гаусса в моей программе? Вкратце о том, что сделано: void Gauss(int N)//объявил функцию { int i, k; double...

4
w8me
496 / 11 / 1
Регистрация: 10.04.2013
Сообщений: 44
11.04.2013, 23:26 #2
Это метод Гаусса с приведением к верхнетреугольному виду. У вас только прямой ход т.е. приведение к верхнетреугольному без обратного где считаются корни, а первый корень верный т.к. на него не нужен обратный ход. И лучше выбирать наибольший элемент в столбце, так точность выше.
0
Janice
0 / 0 / 0
Регистрация: 11.04.2013
Сообщений: 3
12.04.2013, 00:09  [ТС] #3
Цитата Сообщение от w8me Посмотреть сообщение
Это метод Гаусса с приведением к верхнетреугольному виду. У вас только прямой ход т.е. приведение к верхнетреугольному без обратного где считаются корни, а первый корень верный т.к. на него не нужен обратный ход. И лучше выбирать наибольший элемент в столбце, так точность выше.
Так ведь у меня все равно перебор всех элементов строки и формула с учетом получаюшихся нулей. Или неправильно составлено?
И хотелось бы по-другому, но надо сделать так..
0
w8me
496 / 11 / 1
Регистрация: 10.04.2013
Сообщений: 44
12.04.2013, 00:18 #4
Корни 3 и 16 вы нашли тоже неверно , в Mathematica {3} и {4}. В этом методе обычно выбирают наибольший элемент в столбце и переставляют эту строку на 1ое место, потом делят, отнимают и т.д.
А так все верно , нехватает только обратного хода.
C++
1
2
3
4
5
6
7
8
9
    float x[N];
    x[N-1]=A[N-1][N];
 
    for (int k=N-2;k>=0;k--)
    {
        float sum=0;
        for (i=k+1;i<N;i++) sum+=x[i]*A[k][i];
        x[k]=A[k][N]-sum;
    }
Вот навсякий постстолбцовый Гаусс из вашего кода
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
int i, n, g, k;
    float A[N][N+1], a, b, c, d, e; // a & b - коэфф, с & d & e - для вычислений
    A[0][0]=1; A[0][1]=2; A[0][2]=11;
    A[1][0]=3; A[1][1]=4; A[1][2]=25;
    for (int k=0; k<N;k++)
    {
        float _max=fabs(A[k][k]);
        i=k;
        for (int n=k+1;n<N;n++)
        {
            if (fabs(A[n][k])>_max){i=n;
                _max=A[n][k];}
        }
        if (i!=k){
            for (int j=k; j<N+1;j++)
            {
                float dop=A[i][j];
                A[i][j]=A[k][j];
                A[k][j]=dop;
            }
        }//Главн эл в столбце и перестановка строки
            c=A[k][k];
        for (int j=0;j<N+1;j++) 
            A[k][j]/=c;//дел строки на c
        for (i=k+1;i<N;i++){
            c=A[i][k];
            for (int j=k;j<N+1;j++)
                A[i][j]-=A[k][j]*c;// отнимаем строку
        }
    }
    float x[4];
    x[N-1]=A[N-1][N];
 
    for (int k=N-2;k>=0;k--)
    {
        float sum=0;
        for (i=k+1;i<N;i++) sum+=x[i]*A[k][i];
        x[k]=A[k][N]-sum;
    }
 
    for (n=0; n<N; n++)
    {
        printf ("\n");
        for (i=0; i<N+1; i++)
            printf ("%2.3f ", A[n][i]);
    } 
    for (i=0;i<N;i++) printf("\n%f", x[i]);
0
Janice
0 / 0 / 0
Регистрация: 11.04.2013
Сообщений: 3
12.04.2013, 01:17  [ТС] #5
теперь понятно, спасибо!

Добавлено через 56 минут
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
# include<stdio.h> 
#include <conio.h> 
#define N 2 // размерность
 
int main () 
{
int i, n, g, k;
float A[N][N+1], a, b, c, d, e; // a & b - коэфф, с & d & e - для вычислений
A[0][0]=1; A[0][1]=2; A[0][2]=11;
A[1][0]=3; A[1][1]=4; A[1][2]=25;
for (n=0; n<N; n++)
{
a=A[n][n]; printf("\n%f\n", a); 
for (i=0; i<N+1; i++)
{ 
c=A[n][i];
A[n][i]=c/a; // заготовка для диагонали
}
for (g=0; g<N; g++)
{ 
if(g!=n)
{
[COLOR="DarkRed"]b=A[g][n]; //определили коэф для обнуления по столбцу [/COLOR] 
for (k=0; k<N+1; k++)
{
d=A[g][k];
e=A[n][k];
A[g][k]=d-e*b; // "вычли" уравнение из всех ост так, чтобы обнул по столбцу
}
}
} 
}
for (n=0; n<N; n++)
{
printf ("\n");
for (i=0; i<N+1; i++)
printf ("%2.3f ", A[n][i]);
} 
getch(); return 0; }

Нашла ошибку у себя! выделено красным, теперь работает и "по-простому"))спасибо!
0
12.04.2013, 01:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2013, 01:17
Привет! Вот еще темы с ответами:

Метод Гаусса - C++
#include&lt;stdio.h&gt; #include&lt;iostream.h&gt; #include&lt;conio.h&gt; #include&lt;stdlib.h&gt; #include&lt;malloc.h&gt; // global variable declarations...

метод Гаусса - C++
дана система линейных уравнений, в графическом режиме надо написать программу. Не понимаю как, помогите. в системе 4 уравнения

Метод Гаусса - C++
Помогите, пожалуйста, написать программу. Вот условие: Написать программу решения системы уравнений методом Гаусса. С ее помощью...

Метод Гаусса - C++
Суть в том что бы СЛАУ методом Гаусс с последовательным исключениям неизвестных.Вот система: 2.7x+3.3y+1.3z=2.1 3.5x-1.7y+2.8z=1.7 ...


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

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

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