Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
9 / 9 / 0
Регистрация: 06.01.2011
Сообщений: 73
1

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

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

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

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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.09.2011, 12:31
Ответы с готовыми решениями:

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

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

СЛАУ методом Гаусса
Написал комменты к имеющейся проге, и хочу понять, верно ли я понял её. В общем и целом ход...

СЛАУ методом Гаусса
Здравствуйте, подскажите пожалуйста, решаю СЛАУ методом Гаусса, но решение зависит от параметра...

9
программист С++
860 / 600 / 147
Регистрация: 19.12.2010
Сообщений: 2,014
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
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
программист С++
860 / 600 / 147
Регистрация: 19.12.2010
Сообщений: 2,014
24.09.2011, 13:59 5
-=ЮрА=-, верен, читать умеешь?
Цитата Сообщение от sandye51 Посмотреть сообщение
только без проверок деления на 0

Не по теме:

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

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

Не по теме:

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

Миниатюры
Ошибка в решении СЛАУ методом Гаусса  
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.09.2011, 19:53

СЛАУ методом Гаусса
Здравствуйте! Алгоритм понимаю. Нужно привести к треугольному виду, затем осуществить обратный ход....

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

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

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru