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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 70, средняя оценка - 4.66
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
22.07.2011, 15:58     Решить систему алгебраических линейных неоднородных уравнени #1
У меня есть система линейных уравнений. В ней 4000 уравнений.
Киньте плиз код для её решения. Желательно, чтобы он был максимально быстрым.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
28.07.2011, 16:07     Решить систему алгебраических линейных неоднородных уравнени #21
Цитата Сообщение от hello19 Посмотреть сообщение
У меня есть система линейных уравнений. В ней 4000 уравнений.
Киньте плиз код для её решения. Желательно, чтобы он был максимально быстрым.
hello19, я уже не первый день сижу и пробовал на матрицах небольшого размера, у тебя файл с матрицей А корректный, там во всех строчках нужное число элементов???Как ты этот файл получаешь???
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор 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];
        }
}
Миниатюры
Решить систему алгебраических линейных неоднородных уравнени  
Вложения
Тип файла: rar ABX_.rar (208 байт, 14 просмотров)
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
29.07.2011, 12:45  [ТС]     Решить систему алгебраических линейных неоднородных уравнени #23
Запустил на матрице порядка 3638... вылетело(
-=ЮрА=-
Заблокирован
Автор FAQ
29.07.2011, 12:52     Решить систему алгебраических линейных неоднородных уравнени #24
Видно всё таки буду тестировать на большом объёме, если можешь запусти у себя прогу ещё раз и пришли скриншот сообщения об ошибке, или хотя бы номер строки в которой вылетело(я о считывании или обработке). У меня дефицит времени - на работе сейчас и машина слабая(
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
29.07.2011, 13:02  [ТС]     Решить систему алгебраических линейных неоднородных уравнени #25
Чет хз как миниатюру кинуть.. вообщем вот что получилось:
http://narod.ru/disk/20353716001/%D0...D0%BA.png.html
-=ЮрА=-
Заблокирован
Автор FAQ
29.07.2011, 14:11     Решить систему алгебраических линейных неоднородных уравнени #26
Хорошо, работаю над этим...

Добавлено через 54 минуты
Я выловил баг
после строки 51 перед циклом по выделению памяти для матрицы А нужно выделить место в памяти под указатели на строки матрицы, добавь эту строку и запускай алгоритм
C++
1
A = (double **)realloc((void *)A,m*sizeof(double));
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
29.07.2011, 15:23  [ТС]     Решить систему алгебраических линейных неоднородных уравнени #27
Опять косяк... но тут хотя бы понятно где:
Миниатюры
Решить систему алгебраических линейных неоднородных уравнени  
-=ЮрА=-
Заблокирован
Автор 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 сек!Единственное что пока мне не удалось реализовать - это быстрый алгоритм Гаусса, пока работаю над этим...
Вложения
Тип файла: 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
Вообще, можно обойтись без конвертора. Могу просто дать исходную матрицу уже в таком виде)))
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
02.08.2011, 10:33  [ТС]     Решить систему алгебраических линейных неоднородных уравнени #30
Вот эти самый коэффициенты.
Вложения
Тип файла: rar Матрица.rar (29.8 Кб, 19 просмотров)
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2011, 10:36     Решить систему алгебраических линейных неоднородных уравнени #31
Хорошо, беру в работу, как что то будет отпишусь!
PS:Вектор В такой как ты присылал???
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
02.08.2011, 10:43  [ТС]     Решить систему алгебраических линейных неоднородных уравнени #32
Точно не понмю... просто с++ не любит когда пишут вот так 4,5 - любит 4.5. Может быть присылал уже исправленный.. Если надо могу кинуть еще.
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2011, 13:25     Решить систему алгебраических линейных неоднородных уравнени #33
Итак наконец-то откопал!Как я и говорил А содержит ряд пустых строк, об этом свидетельствует скриншот работы и поиск в исходном файле данных, так что уточни коэффициенты матрицы А.
Также выкладываю литературу по решению разрежённых СЛАУ. У меня есть мысль попробовать повычёркивать указанный строки из матрицы, и вектора свободных членов, это допустимо?
Миниатюры
Решить систему алгебраических линейных неоднородных уравнени   Решить систему алгебраических линейных неоднородных уравнени  
Вложения
Тип файла: pdf nstu144.pdf (671.5 Кб, 13 просмотров)
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
02.08.2011, 14:53  [ТС]     Решить систему алгебраических линейных неоднородных уравнени #34
опаньки... а я то думаю че прога падает))
ща спрошу че делать у "руководства".. насколько я знаю такого быть не должно... матрица должна содержать только НЕНУЛЕВЫЕ коэффициенты... а то ведь получается что она вырожденная...

Добавлено через 7 минут
Там даже 3 такие строчки... всего на диагонали стоит 3
1694
1721
1797

Добавлено через 5 минут
что же касается вчеркивания... думаю нет...

Добавлено через 1 час 8 минут
Вообщем просто систему другую дадут, только уже без нулевых строк.
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2011, 15:02     Решить систему алгебраических линейных неоднородных уравнени #35
Жду новой системы алгоритм готов!
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
02.08.2011, 15:22  [ТС]     Решить систему алгебраических линейных неоднородных уравнени #36
Все мы ждем...
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2011, 15:29     Решить систему алгебраических линейных неоднородных уравнени #37
Анализируя пришёл к заключеню что у вектора В элементы с индексами пустых строк равны 0, впринципе можно сжать матрицу А, вечером посмотрю что вышло
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
02.08.2011, 15:53  [ТС]     Решить систему алгебраических линейных неоднородных уравнени #38
да да.. я вот тоже сейчас проверял.. ща спрошу что делать

Добавлено через 14 минут
Ну чтож... мне сказали пока что их не удалять...стало быть просто будут еще дополнительные уравнения в системе и итоговый ранг 3635

Добавлено через 2 минуты
В пришципе - можно удалить, решить так, а потом просто дописать в ответ нули куда необходимо.

Добавлено через 5 минут
Что думаешь?
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2011, 17:09     Решить систему алгебраических линейных неоднородных уравнени #39
Хорошо, отпишу по окончанию расчётов, к сожалению Метод Гаусса при решении в лоб в любых его вариациях долгая задача, ещё немного повожусь над быстродействием
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2011, 17:14     Решить систему алгебраических линейных неоднородных уравнени
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
02.08.2011, 17:14  [ТС]     Решить систему алгебраических линейных неоднородных уравнени #40
Хотя вообще то просто вычеркнуть нулевые строчки и элементы столбца свободных членов - не получиться.
По сути дела - вычеркивая строку, мы должны убрать 1 переменную из каждого уравнения. По этому надо, чтобы и порядок матрицы коэффициентов тоже уменьшился...
Yandex
Объявления
02.08.2011, 17:14     Решить систему алгебраических линейных неоднородных уравнени
Ответ Создать тему
Опции темы

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