Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 70, средняя оценка - 4.66
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
#1

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

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

У меня есть система линейных уравнений. В ней 4000 уравнений.
Киньте плиз код для её решения. Желательно, чтобы он был максимально быстрым.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2011, 15:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Решить систему алгебраических линейных неоднородных уравнени (C++):

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

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

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

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

Решить систему линейных уравнений вида Ax=b методом Зейделя - C++
2)Решить систему линейных уравнений вида Ax=b методом Зейделя 6.9 0,0319 0,039 0,461 0,0191 6,0 0,0333 0,405 0,0134 0,0205 5,1...

Система линейных алгебраических уравнений - C++
Решить систему линейных алгебраических уравнений. Метод решения выбрать самостоятельно. Коэффициенты и свободные члены линейного уравнения...

152
Jupiter
Каратель
Эксперт С++
6566 / 3987 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
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
Stas0n
3 / 4 / 0
Регистрация: 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
Stas0n
3 / 4 / 0
Регистрация: 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
-=ЮрА=-
Заблокирован
Автор FAQ
28.07.2011, 16:07 #21
Цитата Сообщение от hello19 Посмотреть сообщение
У меня есть система линейных уравнений. В ней 4000 уравнений.
Киньте плиз код для её решения. Желательно, чтобы он был максимально быстрым.
hello19, я уже не первый день сижу и пробовал на матрицах небольшого размера, у тебя файл с матрицей А корректный, там во всех строчках нужное число элементов???Как ты этот файл получаешь???
1
-=ЮрА=-
Заблокирован
Автор FAQ
29.07.2011, 12:33 #22
hello19, на сей раз я убрал ошибки считывания ввёл оптимальную комбинацию strrchr и strtok f nfr;t протестировал программу на твоём контрольном примере, прилагаю матрицы, код и скриншот работы. На 3638х3638 пока не проверял - уж очень долго матрица А читается, пока нет времени
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
#include <windows.h>
#include <stdio.h>
#include <math.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));
 
bool printf_err(LPCTSTR sMSG);
char * file2str(FILE *f, char * s);
int str2vec(char * s, char * delim, double * vec);
 
void PryamoiHod(int n, double **a, double *b);
void ObratniHod(int n, double **a, double *b, double *x);
 
int main()
{
    char * buf;
    int i,n,m = 0;bool bContinue = true;
    if(!(f = fopen("B.txt","rb+")))
        bContinue = printf_err("open B.txt");
    else
    {
        str = file2str(f, str);
        fclose(f);
    }
    if(bContinue)
    {
        buf = strchr(str,'\n');
        while(buf != 0)
        {
            buf = strchr(buf + 1,'\n');
            m++;
        }
        B = (double *)realloc((void *)B,(m = m + 1)*sizeof(double));
        if(m != (n = str2vec(str,"\n", B)))
            bContinue = printf_err("update vec B");
    }
    if(bContinue)
    if(!(f = fopen("A.txt","rb+")))
        bContinue = printf_err("open A.txt");
    else
    {
        str = file2str(f, str);
        fclose(f);
    }
    if(bContinue)
    {
        for(i = 0; i < m; i++)
            A[i] = (double *)malloc(m*sizeof(double));
        i--;
        buf = strrchr(str,'\n');
        while(buf != NULL && bContinue)
        {
            printf("UPDATING %04d ROW\r\n",i + 1);
            if(m != (n = str2vec(buf + 1, " ", A[i])))
            {
                printf("ERROR READING %d ROW m = %04d n = %04d\r\n", i + 1,m,n);
                bContinue = false;
            }
            str[strlen(str) - strlen(buf) - 1] = '\0';
            buf = strrchr(str,'\n');
            i--;
        }
        if(str)
        {
            printf("UPDATING %04d ROW\r\n",i + 1);
            if(m != str2vec(str, " ", A[i]))
            {
                printf("ERROR READING %d ROW\r\n", i + 1);
                bContinue = false;
            }
            str = (char *)realloc(str,sizeof(char));
        }
    }
    if(bContinue)
    {
        X = (double *)realloc((void *)X,m*sizeof(double));
        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");
            for(i = 0;i < m; i++)
            {
                printf("X[%04d] = %lf\r\n",i + 1,X[i]);
                fprintf(f,"%.3f\r\n",X[i]);
            }
            fclose(f);
        }
    }
    system("pause");
    return 0;
}
 
bool printf_err(LPCTSTR sMSG)
{
    printf("ERROR %s : %s\r\n",sMSG,strerror(GetLastError()));
    return false;
}
 
char * file2str(FILE *f, char * s)
{
    long fLen = 0;
    if(f && s)
    {
        fseek(f,0,SEEK_END);
        fLen = ftell(f);
        fseek(f,0,SEEK_SET);
        s = (char *)realloc(s,fLen*sizeof(char));
        fread(s,1,fLen*sizeof(char),f);
        s[fLen] = '\0';
    }
    return s;
}
 
int str2vec(char * s, char * delim, double * vec)
{
    int n = 0;
    char * pch = strtok(s,delim);
    while(pch != NULL)
    {
        vec[n] = atof(pch);
        pch = strtok(NULL,delim);
        n++;
    }
    return 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
Миниатюры
Решить систему алгебраических линейных неоднородных уравнени  
Вложения
Тип файла: rar ABX_.rar (208 байт, 14 просмотров)
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
29.07.2011, 12:45  [ТС] #23
Запустил на матрице порядка 3638... вылетело(
0
-=ЮрА=-
Заблокирован
Автор FAQ
29.07.2011, 12:52 #24
Видно всё таки буду тестировать на большом объёме, если можешь запусти у себя прогу ещё раз и пришли скриншот сообщения об ошибке, или хотя бы номер строки в которой вылетело(я о считывании или обработке). У меня дефицит времени - на работе сейчас и машина слабая(
1
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
29.07.2011, 13:02  [ТС] #25
Чет хз как миниатюру кинуть.. вообщем вот что получилось:
http://narod.ru/disk/20353716001/%D0...D0%BA.png.html
0
-=ЮрА=-
Заблокирован
Автор FAQ
29.07.2011, 14:11 #26
Хорошо, работаю над этим...

Добавлено через 54 минуты
Я выловил баг
после строки 51 перед циклом по выделению памяти для матрицы А нужно выделить место в памяти под указатели на строки матрицы, добавь эту строку и запускай алгоритм
C++
1
A = (double **)realloc((void *)A,m*sizeof(double));
1
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
29.07.2011, 15:23  [ТС] #27
Опять косяк... но тут хотя бы понятно где:
0
Миниатюры
Решить систему алгебраических линейных неоднородных уравнени  
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2011, 09:51 #28
Пришёл к тому что твой изначальный вид задания уравнений
вида (индекс;величина) обеспечивает наибольшее быстродействие. Иизготовил специальный конвертор для твоей исходной матрицы А, который преобразует её к виду
(828;4.000000)(3637;1541.440000)
(3539;18.000000)(3636;145657.000000)
(3635;10440.000000)
(3634;17260.000000)
(2155;6.000000)(3633;6.000000)
...
Алгоритм инициализации матрицы А выглядит таким образом:
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
A = (double **)realloc((void *)A,m*sizeof(double));
        printf("ALLOCATION MEMORY FOR MATRIX A START\r\n");
        for(i = 0; i < m; i++)
        {
            A[i] = (double *)malloc(m*sizeof(double));
            memset((void *)A[i], 0, m*sizeof(double));
            printf("ALLOCATION MEMORY FOR A[%04d] OK\r\n",i + 1);
        }
        printf("ALLOCATION MEMORY FOR MATRIX A DONE\r\n");
 
        i = 0;
        buf = strrchr(str,'\n');
        while(buf != NULL && bContinue)
        {
            printf("READING %04d ROW\r\n",i + 1);
            str2vec(buf, A[i]);
            str[strlen(str) - strlen(buf) - 1] = '\0';
            buf = strrchr(str,'\n');
            i++;
        }
        if(str)
        {
            printf("READING %04d ROW\r\n",i + 1);
            str2vec(str, A[i]);
            printf("READING A.txt DONE\r\n",i + 1);
            str = (char *)realloc(str,sizeof(char));
        }
Ты увидишь на считывание матрицы уйдёт не более 10 сек!Единственное что пока мне не удалось реализовать - это быстрый алгоритм Гаусса, пока работаю над этим...
1
Вложения
Тип файла: zip AB.zip (31.9 Кб, 14 просмотров)
Тип файла: rar conv2str_exe.rar (22.3 Кб, 14 просмотров)
Тип файла: rar SLAU_cpp.rar (1.3 Кб, 24 просмотров)
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
02.08.2011, 10:22  [ТС] #29
Вообще, можно обойтись без конвертора. Могу просто дать исходную матрицу уже в таком виде)))
0
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
02.08.2011, 10:33  [ТС] #30
Вот эти самый коэффициенты.
0
Вложения
Тип файла: rar Матрица.rar (29.8 Кб, 19 просмотров)
02.08.2011, 10:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2011, 10:33
Привет! Вот еще темы с ответами:

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

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

Решение системы линейных алгебраических уравнений - C++
Добрый вечер!!! Помогите, пожалуйста, написать программу для решения системы уравнений итерационным методом(метод А-минимальных...

Плохо обусловленные системы линейных алгебраических уравнений - C++
Добрый вечер! Ребят, может сталкивался кто с такими методами решения плохо обусловленных систем линейных алгебраических уравнений: --...


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

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

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