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

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

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

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

24.09.2011, 12:31. Просмотров 1399. Ответов 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();
}
заранее благодарен

 Комментарий модератора 
Используйте теги форматирования кода!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.09.2011, 12:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка в решении СЛАУ методом Гаусса (C++):

Квадратичная аппроксимация, ошибка при решении СЛАУ методом Гаусса - C++
всем привет, возникла проблема при квадратичной аппроксимации функции, в результате левые данные... сама функция имеет вид у = х^0.25, а...

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

Решание СЛАУ методом Гаусса в С++ - C++
Салют обитателям форума! Вот значит какое дело, у меня такое задание : &quot;Решение уравнений методом Гаусса. Коэффициенты обрабатываются в...

Решение СЛАУ методом Гаусса - C++
Всем привет))) Друзья, сколько я уже лазию по инету и по этому форуму, я никак не могу найти правильно работающей программки. Может кто...

СЛАУ методом Жордана-Гаусса - C++
Нужна программа для решения СЛАУ методом Жордана-Гаусса с выбором главного элемента.

Решение СЛАУ методом Гаусса - C++
У меня программа для решения слау методом Гаусса с выбором главного элемента по столбцам. Что-то мне не нравятся ответы, гляньте может в...

9
sandye51
программист С++
685 / 587 / 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
0
morAlex
9 / 9 / 0
Регистрация: 06.01.2011
Сообщений: 73
24.09.2011, 13:24  [ТС] #3
А можно моё решение проверить, пожайлуйста. Мне оно нужно
0
-=ЮрА=-
Заблокирован
Автор FAQ
24.09.2011, 13:52 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
morAlex, посмотрите сюда
Методом Гаусса решить систему n линейных алгебраических уравнений в топике также дал пояснения
матописание метода здесь
Решение систем линейных уравнений методом Гаусса
sandye51, ваш алгоритм неверен, даже перестановки строк нет...просто УЖАС
0
sandye51
программист С++
685 / 587 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
24.09.2011, 13:59 #5
-=ЮрА=-, верен, читать умеешь?
Цитата Сообщение от sandye51 Посмотреть сообщение
только без проверок деления на 0

Не по теме:

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

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

Не по теме:

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

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

Не по теме:

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

0
-=ЮрА=-
25.09.2011, 19:53     Ошибка в решении СЛАУ методом Гаусса
  #10

Не по теме:

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.09.2011, 19:53
Привет! Вот еще темы с ответами:

Решение СЛАУ методом Гаусса - C++
помогите разобраться!!ВЫдает 85 ошибок!!!! #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;tchar.h&gt; #include &lt;iostream&gt; #include...

Решить СЛАУ методом Гаусса (проверить) - C++
Есть код!компилируется без ошибок.Задача программы решить СЛАУ методом Гаусса Но я не понимаю почему вывод информации осуществляется...

Реализовать решение СЛАУ методом Гаусса - C++
Не могу разобраться в чём проблема. Пытаюсь реализовать метод гаусса, вроде бы всё правильно, но приводит матрицу к не правильному...

Решение СЛАУ методом Гаусса, индексы - C++
Собственно программа решает слау методом гаусса. Как найти индексы главного элемента на второй итерации? #include &lt;iostream.h&gt; ...


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

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

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