Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.91/22: Рейтинг темы: голосов - 22, средняя оценка - 4.91
vet
175 / 176 / 55
Регистрация: 08.04.2009
Сообщений: 1,309
#1

Метод Гаусса для решения СЛАУ с использованием одномерного массива

01.03.2010, 05:04. Просмотров 4005. Ответов 23
Метки нет (Все метки)

Доброго всем времени суток.
У меня есть прога для двумерного массива
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
#include <stdio.h>
#include <iostream>
#include <conio.h>
using namespace std;
void f(double an[3][3], double bn[3],int m)
{
    int i,j;
    cout << " \n";
    for (i=0;i<=m;i++)
    {
      for (j=0;j<=m;j++) cout << " " << an[i][j];
      cout << "   " << bn[i] << " \n";
    }    
}
main ()
{
    int i,j,k,l,m,n,jj,kk,j1;
    double mi,d;
    double an[3][3] = { { 81, 2, 3 },
                        { 2, 899, 3 },
                        { 2, 3, 1 } };
    double bn[3]={ 3, 4, 5 };
    double xn[3];
    m=2;
    cout.precision(18);
    f(an,bn,m);
      n=m-1;
      k=0;
      for (j=0;j<=n;j++)
    {
      l=1;
      for (i=k+1;i<=m;i++)
      {
        mi=an[k+l][k]/an[k][k];
        bn[i]=bn[i]-mi*bn[k];
        for (j1=k;j1<=m;j1++) an[k+l][j1]=an[k+l][j1]-mi*an[k][j1];
        l=l+1;
      }
      k=k+1;
    }
//    f(an,bn,m);
    xn[m]=bn[m]/an[m][m];
    k=1;
    d=0;
    for (i=n;i>=0;i--)
    {
       kk=1;
        for (jj=1;jj<=k;jj++)
        {
            d=d+an[i][i+kk]*xn[i+kk];
            kk=kk+1; 
        }
       xn[i]=(bn[i]-d)/an[i][i];
       d=0;
       k=k+1;
    }
    cout << " \n";
    cout << " \n";
    for (i=0;i<=m;i++) cout << " " << xn[i] << " \n";
    
    getch();
}
Требуется же эту задачу решить так чтобы был массив не an[N][N], а просто an[N*N] как и какие условия добавить чтобы прога решала с одномерным массивом, не добавляя никаких дополнительных двумерных массивов???
Заранее Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2010, 05:04
Ответы с готовыми решениями:

Метод Гаусса для решения СЛАУ
Здравствуйте! У меня есть алгоритм решения СЛАУ методом Гаусса, но почему-то он...

Метод Гаусса (подстановки) решения СЛАУ
Всем доброго времени суток, написал я одну недопрограмму, потому как сделал её...

Метод Гаусса решения СЛАУ с полным выбором. C++
Написал код реализующий метод Гаусса с полным выбором ведущего элемента, но...

Численное решение СЛАУ методом Гаусса с организацией хранения матрицы в виде одномерного массива
Помогите кому не сложно.

Разработать программу для решения СЛАУ методом Гаусса.
Разработать программу для решения СЛАУ методом Гаусса. вот заданный массив...

23
accept
4833 / 3255 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
01.03.2010, 06:34 #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
void f(double *an, double bn[3], int m)
{
    int i, j;
    
    cout << " \n";
 
    for (i = 0; i < m; i++) {
        
        for (j = 0; j < m; j++)
            cout << " " << an[i*m+j];
        
        cout << "   " << bn[i] << " \n";
    }    
}
 
...
 
    double an[9] = { 81, 2, 3, 2, 899, 3, 2, 3, 1 };
 
...
 
    m = 3;
 
    cout.precision(18);
 
    f(an, bn, m);
1
taras atavin
4204 / 1765 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
01.03.2010, 06:37 #3
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
#include <stdio.h>
#include <iostream>
#include <conio.h>
using namespace std;
void f(double an[9], double bn[3],int m)
{
    int i,j;
    cout << " \n";
    for (i=0;i<=m;i++)
    {
      for (j=0;j<=m;j++) cout << " " << an[i*3+j];
      cout << "   " << bn[i] << " \n";
    }    
}
main ()
{
    int i,j,k,l,m,n,jj,kk,j1;
    double mi,d;
    double an[9] = { 81, 2, 3 , 2, 899, 3 ,  2, 3, 1  };
    double bn[3]={ 3, 4, 5 };
    double xn[3];
    m=2;
    cout.precision(18);
    f(an,bn,m);
      n=m-1;
      k=0;
      for (j=0;j<=n;j++)
    {
      l=1;
      for (i=k+1;i<=m;i++)
      {
        mi=an[k*4+i*3]/an[k*4];
        bn[i]=bn[i]-mi*bn[k];
        for (j1=k;j1<=m;j1++) an[k*3+i*3+j1]=an[k*3+i*3+j1]-mi*an[k*3+j1];
        l=l+1;
      }
      k=k+1;
    }
//    f(an,bn,m);
    xn[m]=bn[m]/an[m*4];
    k=1;
    d=0;
    for (i=n;i>=0;i--)
    {
       kk=1;
        for (jj=1;jj<=k;jj++)
        {
            d=d+an[i*4+kk]*xn[i+kk];
            kk=kk+1; 
        }
       xn[i]=(bn[i]-d)/an[i*4];
       d=0;
       k=k+1;
    }
    cout << " \n";
    cout << " \n";
    for (i=0;i<=m;i++) cout << " " << xn[i] << " \n";
    
    getch();
}
Добавлено через 1 минуту
Двумерный массив - это массив массивов. Так вот, собери массив из элементов элементов своего массива, сгруппировав их по элементам самого массива.
1
vet
175 / 176 / 55
Регистрация: 08.04.2009
Сообщений: 1,309
01.03.2010, 12:26  [ТС] #4
Спасибо,но не могли бы еще раз помочь,а то я определил, что тот код который выше дико глючный и больше N=3 не хотит работать =(((
я написал новый,вроде поудачнее
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
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <iostream>
#include <time.h>
using namespace std;
int n;
double c,d,det;
 main ()
{
      srand((unsigned)time(NULL));
cout << "n=";
cin >> n;
double **gauss1 = new double*[n];
for(int i=0; i<n; i++)
gauss1[i] = new double[n];
double *y = new double[n];
double *gauss2 = new double[n];
 
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
       gauss1[i][j] = rand()/100; 
//cout << "gauss1["<< i << "][" << j << "]=";
//cin >> gauss1[i][j];
}
}
 
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
      // gauss1[i][j] = rand()/100; 
cout << "gauss1["<< i << "][" << j << "]=";
cout <<  gauss1[i][j];
cout << "\n";
}
}
for(int j=0; j<n; j++)
{
cout << "gauss2[" << j << "]=";
cin >> gauss2[j];
}
for(int i=0; i<n; i++)
 
 
 
//Triangulycia
 
for(int k=0; k<n-1; k++)
{
for(int i=k+1; i<n; i++)
{
d=gauss1[i][k]/gauss1[k][k];
gauss1[i][k]=0;
 
for(int j=k+1; j<n; j++)
gauss1[i][j]=gauss1[i][j]-d*gauss1[k][j];
gauss2[i]=gauss2[i]-d*gauss2[k];
}
 
/*
//Formiruet v vide matrix
cout << "\n";
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
cout << "\n\t" << gauss1[i][j];
//printf("\n%f\t",gauss2[i]);
//printf("\n");
}*/
y[n-1]=gauss2[n-1]/gauss1[n-1][n-1];
for(int i=n-1; i>=1; i--)
 
c=0;
for(int j=i+1; j<n; j++)
c=c+gauss1[i][j]*y[j];
y[i]=(gauss2[i]-c)/gauss1[i][i];
 
}
 
//Glavnye peremennye
cout << "\n"; 
cout.precision(18);
for(int i=0; i<n; i++)
cout << "y[" << i << "]=" << y[i] << "\n";
 
 
//Determinant
det =1;
for(int i=0;i<n; i++)
det = det*gauss1[i][i];
cout << "\n Determinant= " << det;
 
cin.get();
cin.get();
}
и попытался переписать по аналогии для одномерного,но чета не получилось

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
83
84
85
86
87
88
89
#include <iostream>
using namespace std;
 
 
int n;
double c,d,det;
 
 
main ()
{
          srand((unsigned)time(NULL));
cout << "n=";
cin >> n;
int n1 = n*n;
double *gauss1 = new double[n1];
 
double *y = new double[n];
double *gauss2 = new double[n];
 
for(int i=0; i<n1; i++)
{
gauss1[i]=rand()/100;
}
for(int i=0; i<n1; i++)
{
cout << "gauss1["<< i << "]=";
cout << gauss1[i];
cout << "\n";
}
 
for(int j=0; j<n; j++)
{
cout << "gauss2[" << j << "]=";
cin >> gauss2[j];
}
for(int i=0; i<n; i++)
 
 
 
//Triangulycia
 
for(int k=0; k<n-1; k++)
{
for(int i=k+1; i<n; i++)
{
d=gauss1[i*n+k*n]/gauss1[k*n];
gauss1[i*n]=0;
 
for(int j=k+1; j<n; j++)
gauss1[i*n+j*n]=gauss1[i*n+j*n]-d*gauss1[k*n+j*n];
gauss2[i]=gauss2[i]-d*gauss2[k];
}
 
/*
//Formiruet v vide matrix
cout << "\n";
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
cout << "\n\t" << gauss1[i][j];
//printf("\n%f\t",gauss2[i]);
//printf("\n");
}*/
y[n-1]=gauss2[n-1]/gauss1[(n-1)*n];
for(int i=n-1; i>=1; i--)
 
c=0;
for(int j=i+1; j<n; j++)
c=c+gauss1[i*n+j*n]*y[j];
y[i]=(gauss2[i]-c)/gauss1[i*n];
 
}
 
//Glavnye peremennye
cout << "\n"; 
cout.precision(18);
for(int i=0; i<n; i++)
cout << "y[" << i << "]=" << y[i] << "\n";
 
 
//Determinant
det =1;
for(int i=0;i<n; i++)
det = det*gauss1[i*n];
cout << "\n Determinant= " << det;
 
cin.get();
cin.get();
}

Не по теме:

Сёдня точно не мой день,туплю что-то слишком =((((

0
taras atavin
4204 / 1765 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
01.03.2010, 12:47 #5
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
double abs(double x)
{
 if (x<0)
 {
  return -x;
 }
 retrun x;
}
void Gaus(double *a, double *b, double *&x, unsigned int n)
{
 int i;
 int j;
 int k;
 double kof;
 double s;
 for (i=n-1; i>=0; --i)
 {
  for (j=i-1; i>=0; --j)
  {
   if (abs(a[j*n+i])>abs(a[i*n+i]))
   {
    for (k=n-1; k>=0; --k)
    {
     a[j*n+k]^=a[i*n+k];
     a[i*n+k]^=a[j*n+k];
     a[j*n+k]^=a[i*n+k];
    }
   }
  }
  for (j=i-1; j>=0; --j)
  {
   Kof=a[j*n+i]/a[i*n+i];
   for (k=i; k>=0; --k)
   {
    a[j*n+k]-=a[i*n+k]*kof;
   }
   b[j]-=b[i]*Kof;
  }
 }
 for (i=0; i<n; ++i)
 {
  s=0;
  for (k=i-1; k<i; ++k)
  {
   s+=a[i*n+k]*x[k];
  }
  x[i]=(b[i]-s)/a[i*n+i];
 }
}
Добавлено через 2 минуты
Если сама матрица плохо обусловлена, или, что ещё хуже, вырождена, тогда и этот вариант будет гарантировано глючить. Но по нормальным матрицам должен работать. Идею переделки я тебе дал в своём первом в этой теме посте.
1
vet
175 / 176 / 55
Регистрация: 08.04.2009
Сообщений: 1,309
01.03.2010, 12:50  [ТС] #6
Цитата Сообщение от taras atavin Посмотреть сообщение
a[j*n+k]^=a[i*n+k];
Имеется ввиду возведение в степень?
т.е.:
C++
1
a[i*n+k]=pow(a[i*n+k],a[i*n+k]);
Так?
и почему 3 раза?
C++
1
2
3
4
5
6
 for (k=n-1; k>=0; --k)
    {
     a[j*n+k]^=a[i*n+k];
     a[i*n+k]^=a[j*n+k];
     a[j*n+k]^=a[i*n+k];
    }
0
taras atavin
4204 / 1765 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
01.03.2010, 12:52 #7
C++
1
2
3
a[j*n+k]^=a[i*n+k];
a[i*n+k]^=a[j*n+k];
a[j*n+k]^=a[i*n+k];
это перестановка. Элементы j-той и i-той строк меняются местами. А целиком цикл
C++
1
2
3
4
5
6
for (k=n-1; k>=0; --k)
{
 a[j*n+k]^=a[i*n+k];
 a[i*n+k]^=a[j*n+k];
 a[j*n+k]^=a[i*n+k];
}
- перестановка самих строк. i-тая и j-тая строки меняются местами. С этим циклом нифига это не классический Гаусс, а более надёжный метод на его основе. А то ты по Гауссу элементарно получишь ноль на главной диагонали. И ещё, классический Гаусс приводит матрицу к верхнетреугольной, а здесь приведение к нижнетреугольной. Если бы не перестановка строк, то это всё равно Гаусс. А так - точно не знаю. Кажется Джордан-Гаусс.
0
vet
175 / 176 / 55
Регистрация: 08.04.2009
Сообщений: 1,309
01.03.2010, 12:56  [ТС] #8
Я немного про другое, на строку вида:
C++
1
a[j*n+k]^=a[i*n+k];
компилятор ругается:
in evaluation of `operator^=(double, double)'
invalid operands of types `double' and `double' to binary `operator^'
он не знает что за оператор ^.
Обычно так возведение в степень обозначается, а что в данном случае?
0
taras atavin
4204 / 1765 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
01.03.2010, 13:01 #9
Это xor. И там не ^, а ^=, то есть результат xorа помещается в левый операнд. И впервой версии таких строк нет. Там я прямо перевёл код из первого поста темы на иную адресацию элементов.
0
vet
175 / 176 / 55
Регистрация: 08.04.2009
Сообщений: 1,309
01.03.2010, 13:03  [ТС] #10
Цитата Сообщение от taras atavin Посмотреть сообщение
Это xor. И там не ^, а ^=,
ясно,просто на С++ его в явном виде нету,щас напишу ф-цию =)
0
taras atavin
4204 / 1765 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
01.03.2010, 13:05 #11
Цитата Сообщение от vet Посмотреть сообщение
nvalid operands of types `double' and `double' to binary `operator^'
Ну воткни в самом начале
C++
1
2
3
4
5
6
7
8
9
operator ^= (double x, double y)
{
 char *p1;
 char *p2;
 for (p1=(char *)&x+sizeof(x)-1, p1=(char *)&y+sizeof(y)-1; p1>= (char *)&x; ++p1, ++p2)
 {
  *p1^=*p2;
 }
}
Добавлено через 1 минуту
Цитата Сообщение от vet Посмотреть сообщение
Обычно так возведение в степень обозначается
В бейсике. Но не в c++. В c++ это xor. По стандарту объявлен не для всех типов, но для char char стандартная версия есть. Другой вариант - меняй перестановку через xor на перестановку через temp:
C++
1
2
3
temp=a[j*n+k];
a[j*n+k]=a[i*n+k];
a[i*n+k]=temp;
0
vet
175 / 176 / 55
Регистрация: 08.04.2009
Сообщений: 1,309
01.03.2010, 13:08  [ТС] #12
Я имел ввиду что ^ - этот значок в псевдокоде означает возведение в степень,
со значком ^= если честно до этого не сталкивался вообще, только с записью: xor
0
taras atavin
4204 / 1765 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
01.03.2010, 13:09 #13
Ну и на чём же ты обычно пишешь?
0
vet
175 / 176 / 55
Регистрация: 08.04.2009
Сообщений: 1,309
01.03.2010, 13:11  [ТС] #14
ISO C++ forbids declaration of `operator^=' with no type

А операторы перегружаются разве не с классами?

Добавлено через 1 минуту
Цитата Сообщение от taras atavin Посмотреть сообщение
Ну и на чём же ты обычно пишешь?
В каком смысле? На С++ или псевдокоде? на С++ конечно,просто в С++ нет оператора ^ вот я и подумал что это псевдокод программы который означает возведение в степень
0
taras atavin
4204 / 1765 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
01.03.2010, 13:12 #15
Обычно только в классе, но если в классе такого нет, то тогда вне класса. Судя по мессаге о егоге, в классе такого нет. Значит можно объявить вне его.
0
vet
175 / 176 / 55
Регистрация: 08.04.2009
Сообщений: 1,309
01.03.2010, 13:13  [ТС] #16
Цитата Сообщение от taras atavin Посмотреть сообщение
Обычно только в классе, но если в классе такого нет, то тогда вне класса. Судя по мессаге о егоге, в классе такого нет. Значит можно объявить вне его.
Непонял...
Классов то у меня вообще нету, и поэтому как я буду выполнять перегрузку оператора???
0
taras atavin
4204 / 1765 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
01.03.2010, 13:16 #17
Цитата Сообщение от vet Посмотреть сообщение
С++ нет оператора^/
Куда делся? & = and, ^ = xor, | = or, ! = not.

Добавлено через 2 минуты
Цитата Сообщение от vet Посмотреть сообщение
Классов то у меня вообще нету, и поэтому как я буду выполнять перегрузку оператора???
Ты вообще с++ знаешь? Там все типы превращены в классы, в том числе, все встроенные стандартные типы. На числом c int, char, double - типы, а на c++ - классы. Больше того, на c++ даже любой struct - класс.
0
vet
175 / 176 / 55
Регистрация: 08.04.2009
Сообщений: 1,309
01.03.2010, 13:19  [ТС] #18
Если верить Шилдту то в С++ отсутствует оператор xor и его требуется реализовывать

Цитата Сообщение от taras atavin Посмотреть сообщение
Ты вообще с++ знаешь?
тогда как разрешить ошибку в Dev-C++ :ISO C++ forbids declaration of `operator^=' with no type
а в VS 2008: error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C2803: 'operator ^=' must have at least one formal parameter of class type
error C2296: '^=' : illegal, left operand has type 'double'
error C2297: '^=' : illegal, right operand has type 'double'
0
taras atavin
4204 / 1765 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
01.03.2010, 13:22 #19
Цитата Сообщение от vet Посмотреть сообщение
declaration of `operator^=' with no type
а в VS 2008: error C4430: missing type specifier - int assumed.
Вот именно. То есть он не оператора не знает, а такого сочетания его аргументов.
Цитата Сообщение от vet Посмотреть сообщение
Если верить Шилдту то в С++ отсутствует оператор xor
. Вот как раз по Шилдту я ^ и перевёл как xor. А нет имени "xor" для оператора, но не вообще какого нибудь аналога xorа.
0
fasked
Эксперт С++
4981 / 2560 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
01.03.2010, 14:06 #20
vet,
попробуй использовать вместо трех операций "исключающего или" std::swap();
1
01.03.2010, 14:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.03.2010, 14:06

Помогите написать программу для решения слау методом Гаусса
Осталось как обычно пару дней до сдачи курсовой, а она еще не готова! Помогите...

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

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


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

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

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