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

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

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

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

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

У меня есть система линейных уравнений. В ней 4000 уравнений.
Киньте плиз код для её решения. Желательно, чтобы он был максимально быстрым.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2011, 15:58     Решить систему алгебраических линейных неоднородных уравнени
Посмотрите здесь:
Решить систему линейных алгебраических уравнений C++
C++ Методом Гаусса решить систему n линейных алгебраических уравнений
C++ Решить систему алгебраических уравнений методом Гаусса
C++ Решить систему линейных неравенств
C++ Решить систему линейных уравнений вида Ax=b методом Зейделя
C++ Система линейных алгебраических уравнений
Система линейных алгебраических уравнений C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор 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
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
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
Кошковед
407 / 500 / 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
Кошковед
407 / 500 / 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
Каратель
Эксперт С++
6553 / 3973 / 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
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.07.2011, 11:55     Решить систему алгебраических линейных неоднородных уравнени #14
писать обертку - структуру/класс, объект которой по обращению по индексу будет возвращать либо 0 либо элемент матрици отличный от ноля
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2011, 11:58     Решить систему алгебраических линейных неоднородных уравнени
Еще ссылки по теме:
Система линейных алгебраических уравнений C++
Решение системы линейных алгебраических уравнений C++
Плохо обусловленные системы линейных алгебраических уравнений C++
C++ Численные методы решения линейных алгебраических уравнений
C++ Решение системы линейных алгебраических уравнений методом Гаусса

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

Или воспользуйтесь поиском по форуму:
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
25.07.2011, 11:58  [ТС]     Решить систему алгебраических линейных неоднородных уравнени #15
Можете хотя бы наброски показать
Yandex
Объявления
25.07.2011, 11:58     Решить систему алгебраических линейных неоднородных уравнени
Ответ Создать тему
Опции темы

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