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

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

Восстановить пароль Регистрация
 
Janice
 Аватар для Janice
0 / 0 / 0
Регистрация: 11.04.2013
Сообщений: 3
11.04.2013, 22:44     Метод Гаусса через единичную диагональ. Что не так? #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
 # 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2013, 22:44     Метод Гаусса через единичную диагональ. Что не так?
Посмотрите здесь:

Метод Гаусса!!! C++
Метод Гаусса C++
метод Гаусса C++
метод гаусса C++
C++ Метод Гаусса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
w8me
496 / 11 / 1
Регистрация: 10.04.2013
Сообщений: 44
11.04.2013, 23:26     Метод Гаусса через единичную диагональ. Что не так? #2
Это метод Гаусса с приведением к верхнетреугольному виду. У вас только прямой ход т.е. приведение к верхнетреугольному без обратного где считаются корни, а первый корень верный т.к. на него не нужен обратный ход. И лучше выбирать наибольший элемент в столбце, так точность выше.
Janice
 Аватар для Janice
0 / 0 / 0
Регистрация: 11.04.2013
Сообщений: 3
12.04.2013, 00:09  [ТС]     Метод Гаусса через единичную диагональ. Что не так? #3
Цитата Сообщение от w8me Посмотреть сообщение
Это метод Гаусса с приведением к верхнетреугольному виду. У вас только прямой ход т.е. приведение к верхнетреугольному без обратного где считаются корни, а первый корень верный т.к. на него не нужен обратный ход. И лучше выбирать наибольший элемент в столбце, так точность выше.
Так ведь у меня все равно перебор всех элементов строки и формула с учетом получаюшихся нулей. Или неправильно составлено?
И хотелось бы по-другому, но надо сделать так..
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]);
Janice
 Аватар для 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; }

Нашла ошибку у себя! выделено красным, теперь работает и "по-простому"))спасибо!
Yandex
Объявления
12.04.2013, 01:17     Метод Гаусса через единичную диагональ. Что не так?
Ответ Создать тему
Опции темы

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