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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 5.00
morAlex
9 / 9 / 0
Регистрация: 06.01.2011
Сообщений: 73
#1

Ошибка в решении СЛАУ методом Гаусса - C++

24.09.2011, 12:31. Просмотров 1232. Ответов 9
Метки нет (Все метки)

Ребят, помогите пожайлуйста найти ошибку у меня в программе метод Гаусса
Вроде прямой ход правильный, может ошибка в обратном?
Буду благодарен

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
#include<math.h>
#include<conio.h>
#include<stdio.h>
#include<iostream.h>
 
main()
{
int n,v,p,c,s,d,h;
 double **a,
        **a1,
        *x,
        *b,
         l,
         sum;
n=4; c=n-1;h=0;
    b = new double[n];
    x = new double[n];
    a = new double*[n];
    a1 = new double*[n];
    for(int i=0; i < n; i++){
        a[i] = new double[n];
        a1[i]= new double[n];
    }
cout<<"Koeff."<<endl;
    for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>*(*(a+i)+j);
cout<<endl<<"Svobod._chleni"<<endl;
for(int i=0;i<n;i++)
cin>>*(b+i);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
a1[i][j]=a[i][j];
v=0;p=0;s=0;d=0;                    //прямой ход, начало
 
 for(int j=0;j<n-1;j++)
           { l=a[s][d];
 
 
        for (int i=0; i<n;i++)
            {a[h][i]=a[h][i]/l;}b[h]=b[h]/l;
   for(int g=0;g<c;g++)
   { for(int i=0;i<n;i++)
    {a[v+1][i]=a[v+1][i]-(a[v+1][i]*a[p][i]);}
    b[v+1]=b[v+1]-(b[v+1]*b[p]); v++;}p++;c--;s++;d++;h++;v=s;}
 
 
     for(int i=0;i<n;i++){cout<<endl;
for(int j=0;j<n;j++)
cout<<*(*(a+i)+j)<<" ";}
cout<<endl<<endl;
for(int i=0;i<n;i++)
cout<<" "<<b[i]<<" ";
cout<<endl<<endl;                               //прямой ход, конец
 
for(int m=n-1; m >= 0; m--){                //обратный ход
        double sum=0;
        for(int i=n-1; i > m; i--){
            sum += x[i] * a[m][i];
        }
        x[m] = (b[m] - sum)/a[m][m];
    }                                                 //обратный ход
 
    cout << "Reshenie" << endl;
    for(int i=0; i < n; i++){
        cout << "x[" << i+1 << "]=" << x[i] << endl;
    }
   
cout<<endl<<"Proverka"<<endl;
    for(int i=0;i<n;i++)                  //
    {sum=0;                               //не сходятся ответы
    for(int j=0;j<n;j++)                //
    {sum+=a1[i][j]*x[j];}             //
    cout<<i+1<<"="<<sum<<endl;}// 
getch();
}
заранее благодарен

 Комментарий модератора 
Используйте теги форматирования кода!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
sandye51
программист С++
682 / 584 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
24.09.2011, 13:18     Ошибка в решении СЛАУ методом Гаусса #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
#include <iostream>
#include <cstdlib>
#include <ctime>
 
// printing a matrix;
void print_extended_matrix(double ** matrix, double * b, unsigned int size)
{
    for (unsigned int i = 0u; i < size; ++i)
    {
    for (unsigned int j = 0u; j < size; ++j)
        std::cout << matrix[i][j] << " ";
 
    std::cout << " = " << b[i] << std::endl;
    }
}
 
int main()
{
    // Entering the data;
    unsigned int size;
 
    std::cout << "Enter the size of the matrix" << std::endl;
    std::cin >> size;
 
    double ** A = new double*[size];
    double * b = new double[size];
 
    std::cout << "Enter the matrix A" << std::endl;
    for (unsigned int i = 0u; i < size; ++i)
    {
    A[i] = new double[size];
    for (unsigned int j = 0u; j < size; ++j)
        std::cin >> A[i][j];
    }
 
    std::cout << "Enter the rigth vector B" << std::endl;
    for (unsigned int i = 0u; i < size; ++i)
    std::cin >> b[i];
 
    print_extended_matrix(A, b, size);
 
    // Gausse method - calculating the vector X, where A * X = B;
    for (unsigned int i = 0u; i < size; ++i)
    {
    // norming the current row, which will be subtracted from others;
    double value = A[i][i];
    for (unsigned int j = 0u; j < size; ++j)
        A[i][j] /= value;
    b[i] /= value;
 
    // the Gausse iteration;
    for (unsigned int j = 0u; j < i; ++j)
    {
        value = A[j][i];
        for (unsigned int k = i; k < size; ++k)
        A[j][k] -= A[i][k] * value;
 
        b[j] -= b[i] * value;
    }
 
    for (unsigned int j = i + 1; j < size; ++j)
    {
        value = A[j][i];
        for (unsigned int k = i; k < size; ++k)
        A[j][k] -= A[i][k] * value;
 
        b[j] -= b[i] * value;
    }
    }
 
    std::cout << "Vector X: " << std::endl;
    for (unsigned int i = 0u; i < size; ++i)
    {
    std::cout << b[i] << " ";
    delete[]A[i];
    }
 
    delete[]A;
    delete[]b;
 
    return EXIT_SUCCESS;
}
только без проверок деления на 0
morAlex
9 / 9 / 0
Регистрация: 06.01.2011
Сообщений: 73
24.09.2011, 13:24  [ТС]     Ошибка в решении СЛАУ методом Гаусса #3
А можно моё решение проверить, пожайлуйста. Мне оно нужно
-=ЮрА=-
Заблокирован
Автор FAQ
24.09.2011, 13:52     Ошибка в решении СЛАУ методом Гаусса #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
morAlex, посмотрите сюда
Методом Гаусса решить систему n линейных алгебраических уравнений в топике также дал пояснения
матописание метода здесь
Решение систем линейных уравнений методом Гаусса
sandye51, ваш алгоритм неверен, даже перестановки строк нет...просто УЖАС
sandye51
программист С++
682 / 584 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
24.09.2011, 13:59     Ошибка в решении СЛАУ методом Гаусса #5
-=ЮрА=-, верен, читать умеешь?
Цитата Сообщение от sandye51 Посмотреть сообщение
только без проверок деления на 0

Не по теме:

я тебе советую не начинать опять придираться

morAlex
9 / 9 / 0
Регистрация: 06.01.2011
Сообщений: 73
24.09.2011, 15:15  [ТС]     Ошибка в решении СЛАУ методом Гаусса #6
а можно хотя бы сказать, у меня в программе прямой ход или обратный, что-нибудь правильное???
-=ЮрА=-
Заблокирован
Автор FAQ
25.09.2011, 17:53     Ошибка в решении СЛАУ методом Гаусса #7
Цитата Сообщение от sandye51 Посмотреть сообщение
=ЮрА=-, верен, читать умеешь?
Сообщение от sandye51
только без проверок деления на 0
- зачем тогда нужен такой алгоритм который откидывается при разрежённых матрицах???

Не по теме:

Некоторое время назад ты говорил что приводимый мной код на форуме ну никуда не годен,
ну вот и смотри чей на самом деле код отрабатывает а чей нет
Отныне буду следить за тобой чтобы всякий полуфабрикат на форуме не вчухивал

Миниатюры
Ошибка в решении СЛАУ методом Гаусса  
-=ЮрА=-
Заблокирован
Автор FAQ
25.09.2011, 18:04     Ошибка в решении СЛАУ методом Гаусса #8
Цитата Сообщение от morAlex Посмотреть сообщение
А можно моё решение проверить, пожайлуйста. Мне оно нужно
- твой код как и у sandye51, лишь упрощенная версия метода Гаусса, он не будет отрабатывать при разрежённых матрицах(Детально его не тестировал и не компилировал, но он приближен к коду 2-го поста), и к сожалению содержит в себе все недостатки упрощённого метода
Для уверенной работы необходма перестановка строк и сравнене по модулю элементов на главной диагонали, указанный мной выше алгоритм позволяет справляться с матрицами любой разрежённости и размера (единственное что в метое Гаусса плохо - так это большая длительность вычислений при решении в лоб систем порядка нескольких тысяч, но и это можно обойти, причём указанный мной алгоритм почти не требует модернизаций-если будет интересно расскажу и об этом). Касательно твоего поста о коэффициенте 1.0 при делении - это не более чем перестраховка для старых компиляторов, мало ли что они выдадут при целочисленном делении единицы(к сожалению без неявного преобразования типа некоторые ранние версии билдера сбоили. Вообще же алгоритм тестировался от 4.5-го билдера до VS2008 с небольшими модификациями связанными с возросшими требованиями кода к соответсвию стандарту)
sandye51
25.09.2011, 18:54
  #9

Не по теме:

-=ЮрА=-, для разреженных матриц совсем другие алгоритмы, поскольку для них нужно оптимизированное решение со специальном выбором формата хранения (например, CRS)

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.09.2011, 19:53     Ошибка в решении СЛАУ методом Гаусса
Еще ссылки по теме:
C++ Решения СЛАУ методом Гаусса по шагу
C++ Реализовать решение СЛАУ методом Гаусса
Решить СЛАУ методом Гаусса (проверить) C++
C++ Решение СЛАУ методом Гаусса, индексы
C++ Реализовать программу, решающую СЛАУ методом Гаусса

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
25.09.2011, 19:53     Ошибка в решении СЛАУ методом Гаусса
  #10

Не по теме:

sandye51, приведенный тобой алгоритм споткнулся о матрицу 3х3, которую вручную занулить можно, какие спецметоды

Yandex
Объявления
25.09.2011, 19:53     Ошибка в решении СЛАУ методом Гаусса
Ответ Создать тему
Опции темы

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