Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.90/71: Рейтинг темы: голосов - 71, средняя оценка - 4.90
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
1

Решить систему алгебраических линейных неоднородных уравнени

22.07.2011, 15:58. Показов 12969. Ответов 152
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
У меня есть система линейных уравнений. В ней 4000 уравнений.
Киньте плиз код для её решения. Желательно, чтобы он был максимально быстрым.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.07.2011, 15:58
Ответы с готовыми решениями:

Решить систему линейных алгебраических уравнений
Решить CЛАУ 2A^tX=Y^2,где |2 1 5 6| |3| A= |5 2 2 6| Y= |1| |2...

Методом Гаусса решить систему n линейных алгебраических уравнений
Помогите пожалуйста написать на с++ методом Гаусса решить систему n линейных алгебраических...

Решить систему алгебраических уравнений методом Гаусса
Решить систему алгебраических уравнений методом Гаусса: 6X1-X2-X3=11,33, -X1+6X2-X3=32,...

Решить систему линейных неравенств
Нужно написать программу, решающую систему неравенств. Программа должна правильно...

152
Заблокирован
Автор FAQ
22.07.2011, 16:34 2
Уже писал тебе здесь используй метод гаусса, он наиболее эфективен для систем с порядком менее 10000, чем тебя не устраивает ума не приложу...
Решение Системы уравнений
1
108 / 108 / 23
Регистрация: 21.03.2010
Сообщений: 445
23.07.2011, 02:48 3
есть более эфективные методы, если действительно важно добиться производительного решения. Мне лично пригодилось как-то раз разложение какого-то ботана
1
Заблокирован
Автор FAQ
23.07.2011, 14:26 4
Из за большой величины матрицы которая составляет 3638х3638 программа оказывается очень ресурсозатратной на одно запоминание матрицы А необходимо около 12,62 Мб, я уже не говорю о вычислениях, так что на слабых машинах возможна некорректная работа, ввиду неполного считывания матрицы А. Тестировал на двух машинах на одноядерном Celeron 2.0 с ОЗУ 512 Мб и на 4-х ядерном Athlon с ОЗУ Гб. На последней машине всё пошло, на селероне происходило некорректное считывание в итоге часть матрицы А оказывалась незаполненной. Вот алгоритм, даже на 4-х ядрах и 4 Гб приходится ждать, поэтому снабдил программу информационными сообщениями о текущей считываемой строке и извещениях о прямом и обратном методе Гаусса
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#include <math.h>
#include <stdio.h>
#include <windows.h>
 
#define N 3638
 
FILE * f;
double A[N][N];
double B[N];
double X[N];
 
char * str = (char *)malloc(sizeof(char));
char * buf;
 
char * fgetstr(FILE * f, char * s);
int str2vec(char * s, char delim, double * vec);
void swapvec(int m, double * vec);
void vec2file(FILE *f, int m, double * vec);
 
void PryamoiHod(int n, double a[][N], double *b);
void ObratniHod(int n, double a[][N], double *b, double *x);
 
int main()
{
    int i,m = 0;
    if(!(f = fopen("B.txt","rb+")))
        printf("ERROR OPEN B.txt\r\n");
    else
    {
        str = fgetstr(f, str);
        fclose(f);
        m = str2vec(str, '\n', B);
        swapvec(m, B);
    }
    if(!(f = fopen("A.txt","rb+")))
        printf("ERROR OPEN A.txt\r\n");
    else
    {
        str = fgetstr(f, str);
        fclose(f);
        buf = strrchr(str,'\n');
        i = 0;
        while(buf)
        {
            printf("READING %04d ROW\r\n",i + 1);
            m = str2vec(buf, ' ', A[i]);
            swapvec(m, A[i]);
            str[strlen(str) - strlen(buf)] = '\0';
            buf = strrchr(str,'\n');
            i++;
        }
        if(str)
        {
            printf("READING %04d ROW\r\n",i + 1);
            m = str2vec(str, ' ', A[i]);
            swapvec(m, A[i]);
        }
    }
    printf("\tCALCULATION ON GAUSS METHOD\r\n");
    printf(">FOVARD COURSE\r\n");
    PryamoiHod(m, A, B);
    printf(">BACK COURSE\r\n");
    ObratniHod(m, A, B, X);
    if(!(f = fopen("X.txt","wb+")))
        printf("ERROR OPEN X.txt\r\n");
    else
    {
        printf("SAVING RESULTS\r\n");
        vec2file(f, m, X);
        fclose(f);
    }
    system("pause");
    return 0;
}
 
char * fgetstr(FILE * f, char * s)
{
    int fLen = 0;
    if(s)
    {
        fseek(f,0,SEEK_END);
        fLen = ftell(f);
        fseek(f,0,SEEK_SET);
        s = (char *)realloc(s,fLen);
        fread(s,1,fLen,f);
        s[fLen] = '\0';
    }
    return s;
}
 
int str2vec(char * s, char delim, double * vec)
{
    int m = 0;
    char * chBuf = strrchr(s,delim);
    while(chBuf)
    {
        vec[m] = atof(chBuf + 1);
    //  printf("vec[%04d] = %lf\r\n",m + 1, vec[m]);
        s[strlen(s) - strlen(chBuf)] = '\0';
        chBuf = strrchr(s,delim);
        m++;
    }
    if(s)
    {
        vec[m] = atof(s + 3);
//      printf("vec[%04d] = %lf\r\n",m + 1, vec[m]);
    }
    if(0 < m)
        m++;
    return m;
}
 
void swapvec(int m, double * vec)
{
    double buf;
    for(int i = 0; i < m/2; i++)
    {
        buf = vec[m - i -1];
        vec[m - i -1] = vec[i];
        vec[i] = buf;
    }
}
 
void vec2file(FILE *f, int m, double * vec)
{
    for(int i = 0;i < m; i++)
    {
        printf("X[%04d] = %lf\r\n",i + 1,X[i]);
        fprintf(f,"%.3f\r\n",X[i]);
    }
    fprintf(f,"%s","\r\n");
}
 
void PryamoiHod(int n, double a[][N], double *b)
{
    double v;
    for(int k = 0,i,j,im; k < n - 1; k++)
    {
        printf("UPDATING %04d ROW\r\n",k);
        im = k;
        for(i = k + 1; i < n; i++)
        {
            if(fabs(a[im][k]) < fabs(a[i][k]))
            {
                im = i;
            }
        }
        if(im != k)
        {
            for(j = 0; j < n; j++)
            {
                v        = a[im][j];
                a[im][j] = a[k][j];
                a[k][j]  = v;
            }
            v     = b[im];
            b[im] = b[k];
            b[k]  = v;
        }
        for(i = k + 1; i < n; i++)
        {
            v       = a[i][k]/a[k][k];
            a[i][k] = 0;
            b[i]    = b[i] - v*b[k];
            for(j = k + 1; j < n; j++)
            {
                a[i][j] = a[i][j] - v*a[k][j];
            }
        }
    }
}
 
void ObratniHod(int n, double a[][N], double *b, double *x)
{
    double s = 0;
    x[n - 1] = b[n - 1]/a[n - 1][n - 1];
    for(int i = n - 2, j; 0 <= i; i--)
    {
        printf("UPDATING %04d ROW\r\n",n - i - 1);
        s = 0;
        for(j = i + 1; j < n; j++)
        {
            s = s+a[i][j]*x[j];
        }
        x[i] = (b[i] - s)/a[i][i];
    }
}
Мартицы
Вложения
Тип файла: rar SLAU.rar (67.5 Кб, 21 просмотров)
2
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
23.07.2011, 15:14 5
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Из за большой величины матрицы которая составляет 3638х3638 программа оказывается очень ресурсозатратной на одно запоминание матрицы А необходимо около 12,62 Мб, я уже не говорю о вычислениях
Странный подсчёт. Около 13 миллионов — это количество элементов матрицы, а памяти с использованием double нужно больше 100 МБ.

Добавлено через 38 минут

Не по теме:

Посмотрел в код (там где даже считывание матрицы "приходится ждать"). Зачем я это сделал? Мама, роди меня обратно! -=ЮрА=-, скажи что это была шутка.

2
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
25.07.2011, 10:41  [ТС] 6
Что то неправильно систему решает. Если протестить на мелкой системе
А:
1 2
3 4
и столбце В:
5
6
то результатом будет
-1.5
3
вместо
-4
4.5
0
Кошковед
521 / 509 / 63
Регистрация: 12.04.2010
Сообщений: 1,390
25.07.2011, 10:45 7
hello19, слушай, расскажи пажалста, НАХРЕНА тебе это?
откуда такие числа и их количество??

будь человеком, поделись информацией )
0
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
25.07.2011, 10:49  [ТС] 8
Это делу поможет?
0
Кошковед
521 / 509 / 63
Регистрация: 12.04.2010
Сообщений: 1,390
25.07.2011, 10:49 9
кто знает, кто знает...
0
Заблокирован
Автор FAQ
25.07.2011, 11:36 10
co6ak, в энергетике матрица А может быть матрицей проводимости узлов энергосистемы, для какого нибудь промышленного района она и все 20000х20000 может быть. Программирование на то и программирование чтобы решать поставленные задачи, а не задаваться вопросом а зачем...
1
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
25.07.2011, 11:41  [ТС] 11
А в экономике может быть использована для расчета себе стоимости продукта...
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
25.07.2011, 11:47 12
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
в энергетике матрица А может быть матрицей проводимости узлов энергосистемы, для какого нибудь промышленного района она и все 20000х20000 может быть. Программирование на то и программирование чтобы решать поставленные задачи
вот сдесь я соглашусь, а вот с постом номер 4 категорически нет, разреженые системы таких объемов не решаются(на практике) через обычные матрици, там же одни ноли почти, нафига их хранить!!!? вы про метод прогонки знаете для трехдиагональных матриц(конкретно я о способе хранения элементов матрици в этом методе)? так вот для не трехдиагональных НО разреженных матриц тоже используют свою систему хранения элементов матрици
0
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
25.07.2011, 11:50  [ТС] 13
Цитата Сообщение от Maxwe11 Посмотреть сообщение
вот сдесь я соглашусь, а вот с постом номер 4 категорически нет, разреженые системы таких объемов нерешаются через обычные матрици, там же одни ноли почти, нафига их хранить!!!?
И ка же быть в этом случае?
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
25.07.2011, 11:55 14
писать обертку - структуру/класс, объект которой по обращению по индексу будет возвращать либо 0 либо элемент матрици отличный от ноля
0
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
25.07.2011, 11:58  [ТС] 15
Можете хотя бы наброски показать
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
25.07.2011, 12:08 16
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <list>
 
struct nonzero_element_of_matrix {
    int i; //строка матрици
    int j; //столбец матрици
    double value; //значение элемента
};
 
class sparse_matrix {
    std::list< nonzero_element_of_matrix > coef; //не нулевые коэффициенты
public:
    sparse_matrix(const std::list< element_of_matrix >);
 
/*доступ к элементу матрици, получаем либо ноль 
   либо не нулевой коэффициент, если таковой есть в coef*/
    double& operator () (int x, int y); 
};
1
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
25.07.2011, 12:12  [ТС] 17
Кстати матрица моя - не трехдиагональная...
А что плохого в том, что мы храним такой массив данных?
0
Заблокирован
Автор FAQ
26.07.2011, 10:42 18
Вот код, суть в следующем, считываю текстовую матрицу и записываю её уже как матрицу double в файл, а затем уж из него читаю из него, вроде косяки ушли...
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
#include <math.h>
#include <stdio.h>
#include <windows.h>
 
FILE * f;
double **A = (double **)malloc(sizeof(double));
double *B = (double *)malloc(sizeof(double));
double *X = (double *)malloc(sizeof(double));
 
char * str = (char *)malloc(sizeof(char));
char * buf;
 
char * fgetstr(FILE * f, char * s);
int double2bin(char * s, char delim, FILE *f);
void swapvec(int m, double * vec);
void vec2file(FILE *f, int m, double * vec);
 
void PryamoiHod(int n, double **a, double *b);
void ObratniHod(int n, double **a, double *b, double *x);
 
int main()
{
    int i, m = 0;
    printf("\tPROGRAM START\r\n");
    if(!(f = fopen("B.txt","rb+")))
        printf("ERROR OPEN B.txt\r\n");
    else
    {
        str = fgetstr(f, str);
        fclose(f);
        if(!(f = fopen("binB.txt","wb+")))
            printf("ERROR OPEN binB.txt\r\n");
        else
        {
            m = double2bin(str,'\n',f);
            fclose(f);
        }
    }
    if(0 < m)
    {
        if(!(f = fopen("A.txt","rb+")))
            printf("ERROR OPEN A.txt\r\n");
        else
        {
            i = 0;
            str = fgetstr(f, str);
            fclose(f);
            if(!(f = fopen("binA.txt","wb+")))
                printf("ERROR OPEN binB.txt\r\n");
            else
            {
                buf = strrchr(str,'\n');
                while(buf)
                {
                    printf("READING %04d ROW\r\n",i + 1);
                    if(m != double2bin(buf,' ',f))
                    {
                        printf("READING ERROR A.txt\r\n");
                        return 1;
                    }
                    str[strlen(str) - strlen(buf)] = '\0';
                    buf = strrchr(str,'\n');
                    i++;
                }
                if(str)
                {
                    printf("READING %04d ROW\r\n",i + 1);
                    if(m != double2bin(str,' ',f))
                    {
                        printf("READING ERROR A.txt\r\n");
                        return 1;
                    }
                    fclose(f);
                }
            }
        }
        A = (double **)realloc((void *)A,m*sizeof(double));
        for(i = 0; i < m; i++)
            A[i] = (double *)malloc(m*sizeof(double));
        B = (double *)realloc((void *)B,m*sizeof(double));
        X = (double *)realloc((void *)X,m*sizeof(double));
        if(!(f = fopen("binB.txt","rb+")))
             printf("ERROR OPEN binB.txt\r\n");
        else
        {
            fread((void *)B,1,m*sizeof(double),f);
            fclose(f);
            swapvec(m,B);
            if(!(f = fopen("binA.txt","rb+")))
                printf("ERROR OPEN binA.txt\r\n");
            else
            {
                for(i = 0; i < m; i++)
                {
                    fread((void *)A[i],1,m*sizeof(double),f);
                    swapvec(m,A[i]);
                }
                fclose(f);
                printf("\tCALCULATION ON GAUSS METHOD\r\n");
                printf("\t>FOVARD COURSE\r\n");
                PryamoiHod(m, A, B);
                printf("\t>BACK COURSE\r\n");
                ObratniHod(m, A, B, X);
                if(!(f = fopen("X.txt","wb+")))
                printf("ERROR OPEN X.txt\r\n");
                else
                {
                        printf("\tSAVING RESULTS\r\n");
                        vec2file(f, m, X);
                        fclose(f);
                }
            }
        }
    }
    system("pause");
    return 0;
}
 
char * fgetstr(FILE * f, char * s)
{
        int fLen = 0;
        if(s)
        {
            fseek(f,0,SEEK_END);
            fLen = ftell(f);
            fseek(f,0,SEEK_SET);
            s = (char *)realloc(s,fLen);
            fread(s,1,fLen,f);
            s[fLen] = '\0';
        }
        return s;
}
 
int double2bin(char * s, char delim, FILE *f)
{
    int nCount = 0;
    double buf;
    char * chBuf = strrchr(s,delim);
    while(chBuf)
    {
        buf = atof(chBuf + 1);
        fwrite((void *)&buf,1,sizeof(double),f);
        s[strlen(s) - strlen(chBuf)] = '\0';
        chBuf = strrchr(s,delim);
        nCount++;
    }
    if(s)
    {
        buf = atof(s); 
        fwrite((void *)&buf,1,sizeof(double),f);
        nCount++;
    }
    return nCount;
}
 
void swapvec(int m, double * vec)
{
    double buf;
    for(int i = 0; i < m/2; i++)
    {
        buf = vec[m - i -1];
        vec[m - i -1] = vec[i];
        vec[i] = buf;
    }
}
 
void vec2file(FILE *f, int m, double * vec)
{
        for(int i = 0;i < m; i++)
        {
                printf("X[%04d] = %lf\r\n",i + 1,X[i]);
                fprintf(f,"%.3f\r\n",X[i]);
        }
        fprintf(f,"%s","\r\n");
}
 
void PryamoiHod(int n, double **a, double *b)
{
        double v;
        for(int k = 0,i,j,im; k < n - 1; k++)
        {
                printf("UPDATING %04d ROW\r\n",k + 1);
                im = k;
                for(i = k + 1; i < n; i++)
                {
                        if(fabs(a[im][k]) < fabs(a[i][k]))
                        {
                                im = i;
                        }
                }
                if(im != k)
                {
                        for(j = 0; j < n; j++)
                        {
                                v                = a[im][j];
                                a[im][j] = a[k][j];
                                a[k][j]  = v;
                        }
                        v     = b[im];
                        b[im] = b[k];
                        b[k]  = v;
                }
                for(i = k + 1; i < n; i++)
                {
                        v               = 1.0*a[i][k]/a[k][k];
                        a[i][k] = 0;
                        b[i]    = b[i] - v*b[k];
                        for(j = k + 1; j < n; j++)
                        {
                                a[i][j] = a[i][j] - v*a[k][j];
                        }
                }
        }
}
 
void ObratniHod(int n, double **a, double *b, double *x)
{
        double s = 0;
        x[n - 1] = 1.0*b[n - 1]/a[n - 1][n - 1];
        for(int i = n - 2, j; 0 <= i; i--)
        {
                printf("UPDATING %04d ROW\r\n",n - i - 1);
                s = 0;
                for(j = i + 1; j < n; j++)
                {
                        s = s+a[i][j]*x[j];
                }
                x[i] = 1.0*(b[i] - s)/a[i][i];
        }
}
2
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
26.07.2011, 12:14  [ТС] 19
Выводит неправильный результат(
0
Заблокирован
Автор FAQ
26.07.2011, 13:01 20
Лишний раз инвертировал вектор В вот пробуй, я тестировал!
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
#include <math.h>
#include <stdio.h>
#include <windows.h>
 
FILE * f;
double **A = (double **)malloc(sizeof(double));
double *B = (double *)malloc(sizeof(double));
double *X = (double *)malloc(sizeof(double));
 
char * str = (char *)malloc(sizeof(char));
char * buf;
 
char * fgetstr(FILE * f, char * s);
int double2bin(char * s, char delim, FILE *f);
void swapvec(int m, double * vec);
void vec2file(FILE *f, int m, double * vec);
void showvec(int m, double * vec);
 
void PryamoiHod(int n, double **a, double *b);
void ObratniHod(int n, double **a, double *b, double *x);
 
int main()
{
    int i, m = 0;
    printf("\tPROGRAM START\r\n");
    if(!(f = fopen("B.txt","rb+")))
        printf("ERROR OPEN B.txt\r\n");
    else
    {
        str = fgetstr(f, str);
        fclose(f);
        if(!(f = fopen("binB.txt","wb+")))
            printf("ERROR OPEN binB.txt\r\n");
        else
        {
            m = double2bin(str,'\n',f);
            fclose(f);
        }
    }
    if(0 < m)
    {
        if(!(f = fopen("A.txt","rb+")))
            printf("ERROR OPEN A.txt\r\n");
        else
        {
            i = 0;
            str = fgetstr(f, str);
            fclose(f);
            if(!(f = fopen("binA.txt","wb+")))
                printf("ERROR OPEN binB.txt\r\n");
            else
            {
                buf = strrchr(str,'\n');
                while(buf)
                {
                    printf("READING %04d ROW\r\n",i + 1);
                    if(m != double2bin(buf,' ',f))
                    {
                        printf("READING ERROR A.txt\r\n");
                        return 1;
                    }
                    str[strlen(str) - strlen(buf)] = '\0';
                    buf = strrchr(str,'\n');
                    i++;
                }
                if(str)
                {
                    printf("READING %04d ROW\r\n",i + 1);
                    if(m != double2bin(str,' ',f))
                    {
                        printf("READING ERROR A.txt\r\n");
                        return 1;
                    }
                    fclose(f);
                }
            }
        }
        A = (double **)realloc((void *)A,m*sizeof(double));
        for(i = 0; i < m; i++)
            A[i] = (double *)malloc(m*sizeof(double));
        B = (double *)realloc((void *)B,m*sizeof(double));
        X = (double *)realloc((void *)X,m*sizeof(double));
        if(!(f = fopen("binB.txt","rb+")))
             printf("ERROR OPEN binB.txt\r\n");
        else
        {
            fread((void *)B,1,m*sizeof(double),f);
            fclose(f);
            //swapvec(m,B);
            printf("Vector B\r\n");
            showvec(m,B);
            if(!(f = fopen("binA.txt","rb+")))
                printf("ERROR OPEN binA.txt\r\n");
            else
            {
                printf("Matrix A\r\n");
                for(i = 0; i < m; i++)
                {
                    fread((void *)A[i],1,m*sizeof(double),f);
                    swapvec(m,A[i]);
                    showvec(m,A[i]);
                }
                fclose(f);
                printf("\tCALCULATION ON GAUSS METHOD\r\n");
                printf("\t>FOVARD COURSE\r\n");
                PryamoiHod(m, A, B);
                printf("\t>BACK COURSE\r\n");
                ObratniHod(m, A, B, X);
                if(!(f = fopen("X.txt","wb+")))
                printf("ERROR OPEN X.txt\r\n");
                else
                {
                        printf("\tSAVING RESULTS\r\n");
                        vec2file(f, m, X);
                        fclose(f);
                }
            }
        }
    }
    system("pause");
    return 0;
}
 
char * fgetstr(FILE * f, char * s)
{
        int fLen = 0;
        if(s)
        {
            fseek(f,0,SEEK_END);
            fLen = ftell(f);
            fseek(f,0,SEEK_SET);
            s = (char *)realloc(s,fLen);
            fread(s,1,fLen,f);
            s[fLen] = '\0';
        }
        return s;
}
 
int double2bin(char * s, char delim, FILE *f)
{
    int nCount = 0;
    double buf;
    char * chBuf = strrchr(s,delim);
    while(chBuf)
    {
        buf = atof(chBuf + 1);
        fwrite((void *)&buf,1,sizeof(double),f);
        s[strlen(s) - strlen(chBuf)] = '\0';
        chBuf = strrchr(s,delim);
        nCount++;
    }
    if(s)
    {
        buf = atof(s); 
        fwrite((void *)&buf,1,sizeof(double),f);
        nCount++;
    }
    return nCount;
}
 
void swapvec(int m, double * vec)
{
    double buf;
    for(int i = 0; i < m/2; i++)
    {
        buf = vec[m - i -1];
        vec[m - i -1] = vec[i];
        vec[i] = buf;
    }
}
 
void vec2file(FILE *f, int m, double * vec)
{
        for(int i = 0;i < m; i++)
        {
                printf("X[%04d] = %lf\r\n",i + 1,X[i]);
                fprintf(f,"%.3f\r\n",X[i]);
        }
        fprintf(f,"%s","\r\n");
}
 
void PryamoiHod(int n, double **a, double *b)
{
        double v;
        for(int k = 0,i,j,im; k < n - 1; k++)
        {
                printf("UPDATING %04d ROW\r\n",k + 1);
                im = k;
                for(i = k + 1; i < n; i++)
                {
                        if(fabs(a[im][k]) < fabs(a[i][k]))
                        {
                                im = i;
                        }
                }
                if(im != k)
                {
                        for(j = 0; j < n; j++)
                        {
                                v                = a[im][j];
                                a[im][j] = a[k][j];
                                a[k][j]  = v;
                        }
                        v     = b[im];
                        b[im] = b[k];
                        b[k]  = v;
                }
                for(i = k + 1; i < n; i++)
                {
                        v               = 1.0*a[i][k]/a[k][k];
                        a[i][k] = 0;
                        b[i]    = b[i] - v*b[k];
                        for(j = k + 1; j < n; j++)
                        {
                                a[i][j] = a[i][j] - v*a[k][j];
                        }
                }
        }
}
 
void ObratniHod(int n, double **a, double *b, double *x)
{
        double s = 0;
        x[n - 1] = 1.0*b[n - 1]/a[n - 1][n - 1];
        for(int i = n - 2, j; 0 <= i; i--)
        {
                printf("UPDATING %04d ROW\r\n",n - i - 1);
                s = 0;
                for(j = i + 1; j < n; j++)
                {
                        s = s+a[i][j]*x[j];
                }
                x[i] = 1.0*(b[i] - s)/a[i][i];
        }
}
 
void showvec(int m, double * vec)
{
    for(int i = 0; i < m; i++)
        printf("%.2f ",vec[i]);
    printf("\r\n");
}
Добавлено через 16 секунд
Лишний раз инвертировал вектор В вот пробуй, я тестировал!
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
#include <math.h>
#include <stdio.h>
#include <windows.h>
 
FILE * f;
double **A = (double **)malloc(sizeof(double));
double *B = (double *)malloc(sizeof(double));
double *X = (double *)malloc(sizeof(double));
 
char * str = (char *)malloc(sizeof(char));
char * buf;
 
char * fgetstr(FILE * f, char * s);
int double2bin(char * s, char delim, FILE *f);
void swapvec(int m, double * vec);
void vec2file(FILE *f, int m, double * vec);
void showvec(int m, double * vec);
 
void PryamoiHod(int n, double **a, double *b);
void ObratniHod(int n, double **a, double *b, double *x);
 
int main()
{
    int i, m = 0;
    printf("\tPROGRAM START\r\n");
    if(!(f = fopen("B.txt","rb+")))
        printf("ERROR OPEN B.txt\r\n");
    else
    {
        str = fgetstr(f, str);
        fclose(f);
        if(!(f = fopen("binB.txt","wb+")))
            printf("ERROR OPEN binB.txt\r\n");
        else
        {
            m = double2bin(str,'\n',f);
            fclose(f);
        }
    }
    if(0 < m)
    {
        if(!(f = fopen("A.txt","rb+")))
            printf("ERROR OPEN A.txt\r\n");
        else
        {
            i = 0;
            str = fgetstr(f, str);
            fclose(f);
            if(!(f = fopen("binA.txt","wb+")))
                printf("ERROR OPEN binB.txt\r\n");
            else
            {
                buf = strrchr(str,'\n');
                while(buf)
                {
                    printf("READING %04d ROW\r\n",i + 1);
                    if(m != double2bin(buf,' ',f))
                    {
                        printf("READING ERROR A.txt\r\n");
                        return 1;
                    }
                    str[strlen(str) - strlen(buf)] = '\0';
                    buf = strrchr(str,'\n');
                    i++;
                }
                if(str)
                {
                    printf("READING %04d ROW\r\n",i + 1);
                    if(m != double2bin(str,' ',f))
                    {
                        printf("READING ERROR A.txt\r\n");
                        return 1;
                    }
                    fclose(f);
                }
            }
        }
        A = (double **)realloc((void *)A,m*sizeof(double));
        for(i = 0; i < m; i++)
            A[i] = (double *)malloc(m*sizeof(double));
        B = (double *)realloc((void *)B,m*sizeof(double));
        X = (double *)realloc((void *)X,m*sizeof(double));
        if(!(f = fopen("binB.txt","rb+")))
             printf("ERROR OPEN binB.txt\r\n");
        else
        {
            fread((void *)B,1,m*sizeof(double),f);
            fclose(f);
            //swapvec(m,B);
            printf("Vector B\r\n");
            showvec(m,B);
            if(!(f = fopen("binA.txt","rb+")))
                printf("ERROR OPEN binA.txt\r\n");
            else
            {
                printf("Matrix A\r\n");
                for(i = 0; i < m; i++)
                {
                    fread((void *)A[i],1,m*sizeof(double),f);
                    swapvec(m,A[i]);
                    showvec(m,A[i]);
                }
                fclose(f);
                printf("\tCALCULATION ON GAUSS METHOD\r\n");
                printf("\t>FOVARD COURSE\r\n");
                PryamoiHod(m, A, B);
                printf("\t>BACK COURSE\r\n");
                ObratniHod(m, A, B, X);
                if(!(f = fopen("X.txt","wb+")))
                printf("ERROR OPEN X.txt\r\n");
                else
                {
                        printf("\tSAVING RESULTS\r\n");
                        vec2file(f, m, X);
                        fclose(f);
                }
            }
        }
    }
    system("pause");
    return 0;
}
 
char * fgetstr(FILE * f, char * s)
{
        int fLen = 0;
        if(s)
        {
            fseek(f,0,SEEK_END);
            fLen = ftell(f);
            fseek(f,0,SEEK_SET);
            s = (char *)realloc(s,fLen);
            fread(s,1,fLen,f);
            s[fLen] = '\0';
        }
        return s;
}
 
int double2bin(char * s, char delim, FILE *f)
{
    int nCount = 0;
    double buf;
    char * chBuf = strrchr(s,delim);
    while(chBuf)
    {
        buf = atof(chBuf + 1);
        fwrite((void *)&buf,1,sizeof(double),f);
        s[strlen(s) - strlen(chBuf)] = '\0';
        chBuf = strrchr(s,delim);
        nCount++;
    }
    if(s)
    {
        buf = atof(s); 
        fwrite((void *)&buf,1,sizeof(double),f);
        nCount++;
    }
    return nCount;
}
 
void swapvec(int m, double * vec)
{
    double buf;
    for(int i = 0; i < m/2; i++)
    {
        buf = vec[m - i -1];
        vec[m - i -1] = vec[i];
        vec[i] = buf;
    }
}
 
void vec2file(FILE *f, int m, double * vec)
{
        for(int i = 0;i < m; i++)
        {
                printf("X[%04d] = %lf\r\n",i + 1,X[i]);
                fprintf(f,"%.3f\r\n",X[i]);
        }
        fprintf(f,"%s","\r\n");
}
 
void PryamoiHod(int n, double **a, double *b)
{
        double v;
        for(int k = 0,i,j,im; k < n - 1; k++)
        {
                printf("UPDATING %04d ROW\r\n",k + 1);
                im = k;
                for(i = k + 1; i < n; i++)
                {
                        if(fabs(a[im][k]) < fabs(a[i][k]))
                        {
                                im = i;
                        }
                }
                if(im != k)
                {
                        for(j = 0; j < n; j++)
                        {
                                v                = a[im][j];
                                a[im][j] = a[k][j];
                                a[k][j]  = v;
                        }
                        v     = b[im];
                        b[im] = b[k];
                        b[k]  = v;
                }
                for(i = k + 1; i < n; i++)
                {
                        v               = 1.0*a[i][k]/a[k][k];
                        a[i][k] = 0;
                        b[i]    = b[i] - v*b[k];
                        for(j = k + 1; j < n; j++)
                        {
                                a[i][j] = a[i][j] - v*a[k][j];
                        }
                }
        }
}
 
void ObratniHod(int n, double **a, double *b, double *x)
{
        double s = 0;
        x[n - 1] = 1.0*b[n - 1]/a[n - 1][n - 1];
        for(int i = n - 2, j; 0 <= i; i--)
        {
                printf("UPDATING %04d ROW\r\n",n - i - 1);
                s = 0;
                for(j = i + 1; j < n; j++)
                {
                        s = s+a[i][j]*x[j];
                }
                x[i] = 1.0*(b[i] - s)/a[i][i];
        }
}
 
void showvec(int m, double * vec)
{
    for(int i = 0; i < m; i++)
        printf("%.2f ",vec[i]);
    printf("\r\n");
}
Строка 89 - не инвертирую В, матрица А выходит перевёрнутой поэтому В нужно оставлять также перевёрнутым, сейчас попробую на 3638 уравнениях...
2
26.07.2011, 13:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.07.2011, 13:01
Помогаю со студенческими работами здесь

Решить систему линейных уравнений вида Ax=b методом Зейделя
2)Решить систему линейных уравнений вида Ax=b методом Зейделя 6.9 0,0319 0,039 0,461 0,0191 6,0...

Система линейных алгебраических уравнений
Решить систему линейных алгебраических уравнений. Метод решения выбрать самостоятельно....

Система линейных алгебраических уравнений
помогите исправить ошибки! #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;cmath&gt; #include...

Система линейных алгебраических уравнений
Помогите пожалуйта с програмой вопрос жизни и смерти!!! Мне нужно написать програму до завтра!...


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

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