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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 70, средняя оценка - 4.66
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
22.07.2011, 15:58     Решить систему алгебраических линейных неоднородных уравнени #1
У меня есть система линейных уравнений. В ней 4000 уравнений.
Киньте плиз код для её решения. Желательно, чтобы он был максимально быстрым.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
22.07.2011, 16:34     Решить систему алгебраических линейных неоднородных уравнени #2
Уже писал тебе здесь используй метод гаусса, он наиболее эфективен для систем с порядком менее 10000, чем тебя не устраивает ума не приложу...
Решение Системы уравнений
CEBEP
105 / 105 / 9
Регистрация: 21.03.2010
Сообщений: 437
23.07.2011, 02:48     Решить систему алгебраических линейных неоднородных уравнени #3
есть более эфективные методы, если действительно важно добиться производительного решения. Мне лично пригодилось как-то раз разложение какого-то ботана
-=ЮрА=-
Заблокирован
Автор 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 Кб, 17 просмотров)
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
23.07.2011, 15:14     Решить систему алгебраических линейных неоднородных уравнени #5
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Из за большой величины матрицы которая составляет 3638х3638 программа оказывается очень ресурсозатратной на одно запоминание матрицы А необходимо около 12,62 Мб, я уже не говорю о вычислениях
Странный подсчёт. Около 13 миллионов — это количество элементов матрицы, а памяти с использованием double нужно больше 100 МБ.

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

Не по теме:

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

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

будь человеком, поделись информацией )
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
25.07.2011, 10:49  [ТС]     Решить систему алгебраических линейных неоднородных уравнени #8
Это делу поможет?
co6ak
Кошковед
 Аватар для co6ak
402 / 495 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
25.07.2011, 10:49     Решить систему алгебраических линейных неоднородных уравнени #9
кто знает, кто знает...
-=ЮрА=-
Заблокирован
Автор FAQ
25.07.2011, 11:36     Решить систему алгебраических линейных неоднородных уравнени #10
co6ak, в энергетике матрица А может быть матрицей проводимости узлов энергосистемы, для какого нибудь промышленного района она и все 20000х20000 может быть. Программирование на то и программирование чтобы решать поставленные задачи, а не задаваться вопросом а зачем...
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
25.07.2011, 11:41  [ТС]     Решить систему алгебраических линейных неоднородных уравнени #11
А в экономике может быть использована для расчета себе стоимости продукта...
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.07.2011, 11:47     Решить систему алгебраических линейных неоднородных уравнени #12
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
в энергетике матрица А может быть матрицей проводимости узлов энергосистемы, для какого нибудь промышленного района она и все 20000х20000 может быть. Программирование на то и программирование чтобы решать поставленные задачи
вот сдесь я соглашусь, а вот с постом номер 4 категорически нет, разреженые системы таких объемов не решаются(на практике) через обычные матрици, там же одни ноли почти, нафига их хранить!!!? вы про метод прогонки знаете для трехдиагональных матриц(конкретно я о способе хранения элементов матрици в этом методе)? так вот для не трехдиагональных НО разреженных матриц тоже используют свою систему хранения элементов матрици
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
25.07.2011, 11:50  [ТС]     Решить систему алгебраических линейных неоднородных уравнени #13
Цитата Сообщение от Maxwe11 Посмотреть сообщение
вот сдесь я соглашусь, а вот с постом номер 4 категорически нет, разреженые системы таких объемов нерешаются через обычные матрици, там же одни ноли почти, нафига их хранить!!!?
И ка же быть в этом случае?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.07.2011, 11:55     Решить систему алгебраических линейных неоднородных уравнени #14
писать обертку - структуру/класс, объект которой по обращению по индексу будет возвращать либо 0 либо элемент матрици отличный от ноля
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
25.07.2011, 11:58  [ТС]     Решить систему алгебраических линейных неоднородных уравнени #15
Можете хотя бы наброски показать
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 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); 
};
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
25.07.2011, 12:12  [ТС]     Решить систему алгебраических линейных неоднородных уравнени #17
Кстати матрица моя - не трехдиагональная...
А что плохого в том, что мы храним такой массив данных?
-=ЮрА=-
Заблокирован
Автор 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];
        }
}
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
26.07.2011, 12:14  [ТС]     Решить систему алгебраических линейных неоднородных уравнени #19
Выводит неправильный результат(
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.07.2011, 13:01     Решить систему алгебраических линейных неоднородных уравнени
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор 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 уравнениях...
Yandex
Объявления
26.07.2011, 13:01     Решить систему алгебраических линейных неоднородных уравнени
Ответ Создать тему
Опции темы

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