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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.86
vet
 Аватар для vet
175 / 175 / 13
Регистрация: 08.04.2009
Сообщений: 1,309
01.03.2010, 05:04     Метод Гаусса для решения СЛАУ с использованием одномерного массива #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
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] как и какие условия добавить чтобы прога решала с одномерным массивом, не добавляя никаких дополнительных двумерных массивов???
Заранее Спасибо
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
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);
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
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 минуту
Двумерный массив - это массив массивов. Так вот, собери массив из элементов элементов своего массива, сгруппировав их по элементам самого массива.
vet
 Аватар для vet
175 / 175 / 13
Регистрация: 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();
}

Не по теме:

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

taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
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 минуты
Если сама матрица плохо обусловлена, или, что ещё хуже, вырождена, тогда и этот вариант будет гарантировано глючить. Но по нормальным матрицам должен работать. Идею переделки я тебе дал в своём первом в этой теме посте.
vet
 Аватар для vet
175 / 175 / 13
Регистрация: 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];
    }
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
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-тая строки меняются местами. С этим циклом нифига это не классический Гаусс, а более надёжный метод на его основе. А то ты по Гауссу элементарно получишь ноль на главной диагонали. И ещё, классический Гаусс приводит матрицу к верхнетреугольной, а здесь приведение к нижнетреугольной. Если бы не перестановка строк, то это всё равно Гаусс. А так - точно не знаю. Кажется Джордан-Гаусс.
vet
 Аватар для vet
175 / 175 / 13
Регистрация: 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^'
он не знает что за оператор ^.
Обычно так возведение в степень обозначается, а что в данном случае?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
01.03.2010, 13:01     Метод Гаусса для решения СЛАУ с использованием одномерного массива #9
Это xor. И там не ^, а ^=, то есть результат xorа помещается в левый операнд. И впервой версии таких строк нет. Там я прямо перевёл код из первого поста темы на иную адресацию элементов.
vet
 Аватар для vet
175 / 175 / 13
Регистрация: 08.04.2009
Сообщений: 1,309
01.03.2010, 13:03  [ТС]     Метод Гаусса для решения СЛАУ с использованием одномерного массива #10
Цитата Сообщение от taras atavin Посмотреть сообщение
Это xor. И там не ^, а ^=,
ясно,просто на С++ его в явном виде нету,щас напишу ф-цию =)
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
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;
vet
 Аватар для vet
175 / 175 / 13
Регистрация: 08.04.2009
Сообщений: 1,309
01.03.2010, 13:08  [ТС]     Метод Гаусса для решения СЛАУ с использованием одномерного массива #12
Я имел ввиду что ^ - этот значок в псевдокоде означает возведение в степень,
со значком ^= если честно до этого не сталкивался вообще, только с записью: xor
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
01.03.2010, 13:09     Метод Гаусса для решения СЛАУ с использованием одномерного массива #13
Ну и на чём же ты обычно пишешь?
vet
 Аватар для vet
175 / 175 / 13
Регистрация: 08.04.2009
Сообщений: 1,309
01.03.2010, 13:11  [ТС]     Метод Гаусса для решения СЛАУ с использованием одномерного массива #14
ISO C++ forbids declaration of `operator^=' with no type

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

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

Добавлено через 2 минуты
Цитата Сообщение от vet Посмотреть сообщение
Классов то у меня вообще нету, и поэтому как я буду выполнять перегрузку оператора???
Ты вообще с++ знаешь? Там все типы превращены в классы, в том числе, все встроенные стандартные типы. На числом c int, char, double - типы, а на c++ - классы. Больше того, на c++ даже любой struct - класс.
vet
 Аватар для vet
175 / 175 / 13
Регистрация: 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'
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
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а.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.03.2010, 14:06     Метод Гаусса для решения СЛАУ с использованием одномерного массива
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
01.03.2010, 14:06     Метод Гаусса для решения СЛАУ с использованием одномерного массива #20
vet,
попробуй использовать вместо трех операций "исключающего или" std::swap();
Yandex
Объявления
01.03.2010, 14:06     Метод Гаусса для решения СЛАУ с использованием одномерного массива
Ответ Создать тему
Опции темы

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