Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.69/26: Рейтинг темы: голосов - 26, средняя оценка - 4.69
179 / 180 / 55
Регистрация: 08.04.2009
Сообщений: 1,309
1

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

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

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

Написать программу, реализующую метод Гаусса для решения СЛАУ с постолбцовым выбором главного элемента
Добрый день. Очень прошу вас помочь мне с программой для лабораторной. Программа должна : -...

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

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

23
4848 / 3269 / 466
Регистрация: 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
4196 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
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
179 / 180 / 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
4196 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
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
179 / 180 / 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
4196 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
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
179 / 180 / 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
4196 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
01.03.2010, 13:01 9
Это xor. И там не ^, а ^=, то есть результат xorа помещается в левый операнд. И впервой версии таких строк нет. Там я прямо перевёл код из первого поста темы на иную адресацию элементов.
0
179 / 180 / 55
Регистрация: 08.04.2009
Сообщений: 1,309
01.03.2010, 13:03  [ТС] 10
Цитата Сообщение от taras atavin Посмотреть сообщение
Это xor. И там не ^, а ^=,
ясно,просто на С++ его в явном виде нету,щас напишу ф-цию =)
0
4196 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
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
179 / 180 / 55
Регистрация: 08.04.2009
Сообщений: 1,309
01.03.2010, 13:08  [ТС] 12
Я имел ввиду что ^ - этот значок в псевдокоде означает возведение в степень,
со значком ^= если честно до этого не сталкивался вообще, только с записью: xor
0
4196 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
01.03.2010, 13:09 13
Ну и на чём же ты обычно пишешь?
0
179 / 180 / 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
4196 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
01.03.2010, 13:12 15
Обычно только в классе, но если в классе такого нет, то тогда вне класса. Судя по мессаге о егоге, в классе такого нет. Значит можно объявить вне его.
0
179 / 180 / 55
Регистрация: 08.04.2009
Сообщений: 1,309
01.03.2010, 13:13  [ТС] 16
Цитата Сообщение от taras atavin Посмотреть сообщение
Обычно только в классе, но если в классе такого нет, то тогда вне класса. Судя по мессаге о егоге, в классе такого нет. Значит можно объявить вне его.
Непонял...
Классов то у меня вообще нету, и поэтому как я буду выполнять перегрузку оператора???
0
4196 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
01.03.2010, 13:16 17
Цитата Сообщение от vet Посмотреть сообщение
С++ нет оператора^/
Куда делся? & = and, ^ = xor, | = or, ! = not.

Добавлено через 2 минуты
Цитата Сообщение от vet Посмотреть сообщение
Классов то у меня вообще нету, и поэтому как я буду выполнять перегрузку оператора???
Ты вообще с++ знаешь? Там все типы превращены в классы, в том числе, все встроенные стандартные типы. На числом c int, char, double - типы, а на c++ - классы. Больше того, на c++ даже любой struct - класс.
0
179 / 180 / 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
4196 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
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
Эксперт С++
5017 / 2596 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
01.03.2010, 14:06 20
vet,
попробуй использовать вместо трех операций "исключающего или" std::swap();
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.03.2010, 14:06

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

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

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