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

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

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

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

22.07.2011, 15:58. Просмотров 9190. Ответов 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
-=ЮрА=-
Заблокирован
Автор FAQ
22.07.2011, 16:34 #2
Уже писал тебе здесь используй метод гаусса, он наиболее эфективен для систем с порядком менее 10000, чем тебя не устраивает ума не приложу...
Решение Системы уравнений
1
CEBEP
107 / 107 / 9
Регистрация: 21.03.2010
Сообщений: 445
23.07.2011, 02:48 #3
есть более эфективные методы, если действительно важно добиться производительного решения. Мне лично пригодилось как-то раз разложение какого-то ботана
1
-=ЮрА=-
Заблокирован
Автор FAQ
23.07.2011, 14:26 #4
Из за большой величины матрицы которая составляет 3638х3638 программа оказывается очень ресурсозатратной на одно запоминание матрицы А необходимо около 12,62 Мб, я уже не говорю о вычислениях, так что на слабых машинах возможна некорректная работа, ввиду неполного считывания матрицы А. Тестировал на двух машинах на одноядерном Celeron 2.0 с ОЗУ 512 Мб и на 4-х ядерном Athlon с ОЗУ Гб. На последней машине всё пошло, на селероне происходило некорректное считывание в итоге часть матрицы А оказывалась незаполненной. Вот алгоритм, даже на 4-х ядрах и 4 Гб приходится ждать, поэтому снабдил программу информационными сообщениями о текущей считываемой строке и извещениях о прямом и обратном методе Гаусса
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#include <math.h>
#include <stdio.h>
#include <windows.h>
 
#define N 3638
 
FILE * f;
double A[N][N];
double B[N];
double X[N];
 
char * str = (char *)malloc(sizeof(char));
char * buf;
 
char * fgetstr(FILE * f, char * s);
int str2vec(char * s, char delim, double * vec);
void swapvec(int m, double * vec);
void vec2file(FILE *f, int m, double * vec);
 
void PryamoiHod(int n, double a[][N], double *b);
void ObratniHod(int n, double a[][N], double *b, double *x);
 
int main()
{
    int i,m = 0;
    if(!(f = fopen("B.txt","rb+")))
        printf("ERROR OPEN B.txt\r\n");
    else
    {
        str = fgetstr(f, str);
        fclose(f);
        m = str2vec(str, '\n', B);
        swapvec(m, B);
    }
    if(!(f = fopen("A.txt","rb+")))
        printf("ERROR OPEN A.txt\r\n");
    else
    {
        str = fgetstr(f, str);
        fclose(f);
        buf = strrchr(str,'\n');
        i = 0;
        while(buf)
        {
            printf("READING %04d ROW\r\n",i + 1);
            m = str2vec(buf, ' ', A[i]);
            swapvec(m, A[i]);
            str[strlen(str) - strlen(buf)] = '\0';
            buf = strrchr(str,'\n');
            i++;
        }
        if(str)
        {
            printf("READING %04d ROW\r\n",i + 1);
            m = str2vec(str, ' ', A[i]);
            swapvec(m, A[i]);
        }
    }
    printf("\tCALCULATION ON GAUSS METHOD\r\n");
    printf(">FOVARD COURSE\r\n");
    PryamoiHod(m, A, B);
    printf(">BACK COURSE\r\n");
    ObratniHod(m, A, B, X);
    if(!(f = fopen("X.txt","wb+")))
        printf("ERROR OPEN X.txt\r\n");
    else
    {
        printf("SAVING RESULTS\r\n");
        vec2file(f, m, X);
        fclose(f);
    }
    system("pause");
    return 0;
}
 
char * fgetstr(FILE * f, char * s)
{
    int fLen = 0;
    if(s)
    {
        fseek(f,0,SEEK_END);
        fLen = ftell(f);
        fseek(f,0,SEEK_SET);
        s = (char *)realloc(s,fLen);
        fread(s,1,fLen,f);
        s[fLen] = '\0';
    }
    return s;
}
 
int str2vec(char * s, char delim, double * vec)
{
    int m = 0;
    char * chBuf = strrchr(s,delim);
    while(chBuf)
    {
        vec[m] = atof(chBuf + 1);
    //  printf("vec[%04d] = %lf\r\n",m + 1, vec[m]);
        s[strlen(s) - strlen(chBuf)] = '\0';
        chBuf = strrchr(s,delim);
        m++;
    }
    if(s)
    {
        vec[m] = atof(s + 3);
//      printf("vec[%04d] = %lf\r\n",m + 1, vec[m]);
    }
    if(0 < m)
        m++;
    return m;
}
 
void swapvec(int m, double * vec)
{
    double buf;
    for(int i = 0; i < m/2; i++)
    {
        buf = vec[m - i -1];
        vec[m - i -1] = vec[i];
        vec[i] = buf;
    }
}
 
void vec2file(FILE *f, int m, double * vec)
{
    for(int i = 0;i < m; i++)
    {
        printf("X[%04d] = %lf\r\n",i + 1,X[i]);
        fprintf(f,"%.3f\r\n",X[i]);
    }
    fprintf(f,"%s","\r\n");
}
 
void PryamoiHod(int n, double a[][N], double *b)
{
    double v;
    for(int k = 0,i,j,im; k < n - 1; k++)
    {
        printf("UPDATING %04d ROW\r\n",k);
        im = k;
        for(i = k + 1; i < n; i++)
        {
            if(fabs(a[im][k]) < fabs(a[i][k]))
            {
                im = i;
            }
        }
        if(im != k)
        {
            for(j = 0; j < n; j++)
            {
                v        = a[im][j];
                a[im][j] = a[k][j];
                a[k][j]  = v;
            }
            v     = b[im];
            b[im] = b[k];
            b[k]  = v;
        }
        for(i = k + 1; i < n; i++)
        {
            v       = a[i][k]/a[k][k];
            a[i][k] = 0;
            b[i]    = b[i] - v*b[k];
            for(j = k + 1; j < n; j++)
            {
                a[i][j] = a[i][j] - v*a[k][j];
            }
        }
    }
}
 
void ObratniHod(int n, double a[][N], double *b, double *x)
{
    double s = 0;
    x[n - 1] = b[n - 1]/a[n - 1][n - 1];
    for(int i = n - 2, j; 0 <= i; i--)
    {
        printf("UPDATING %04d ROW\r\n",n - i - 1);
        s = 0;
        for(j = i + 1; j < n; j++)
        {
            s = s+a[i][j]*x[j];
        }
        x[i] = (b[i] - s)/a[i][i];
    }
}
Мартицы
2
Вложения
Тип файла: rar SLAU.rar (67.5 Кб, 17 просмотров)
grizlik78
Эксперт С++
1974 / 1467 / 122
Регистрация: 29.05.2011
Сообщений: 3,034
23.07.2011, 15:14 #5
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Из за большой величины матрицы которая составляет 3638х3638 программа оказывается очень ресурсозатратной на одно запоминание матрицы А необходимо около 12,62 Мб, я уже не говорю о вычислениях
Странный подсчёт. Около 13 миллионов — это количество элементов матрицы, а памяти с использованием double нужно больше 100 МБ.

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

Не по теме:

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

2
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
0
co6ak
Кошковед
409 / 502 / 30
Регистрация: 12.04.2010
Сообщений: 1,392
25.07.2011, 10:45 #7
hello19, слушай, расскажи пажалста, НАХРЕНА тебе это?
откуда такие числа и их количество??

будь человеком, поделись информацией )
0
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
25.07.2011, 10:49  [ТС] #8
Это делу поможет?
0
co6ak
Кошковед
409 / 502 / 30
Регистрация: 12.04.2010
Сообщений: 1,392
25.07.2011, 10:49 #9
кто знает, кто знает...
0
-=ЮрА=-
Заблокирован
Автор FAQ
25.07.2011, 11:36 #10
co6ak, в энергетике матрица А может быть матрицей проводимости узлов энергосистемы, для какого нибудь промышленного района она и все 20000х20000 может быть. Программирование на то и программирование чтобы решать поставленные задачи, а не задаваться вопросом а зачем...
1
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
25.07.2011, 11:41  [ТС] #11
А в экономике может быть использована для расчета себе стоимости продукта...
0
Jupiter
Каратель
Эксперт С++
6564 / 3985 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.07.2011, 11:47 #12
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
в энергетике матрица А может быть матрицей проводимости узлов энергосистемы, для какого нибудь промышленного района она и все 20000х20000 может быть. Программирование на то и программирование чтобы решать поставленные задачи
вот сдесь я соглашусь, а вот с постом номер 4 категорически нет, разреженые системы таких объемов не решаются(на практике) через обычные матрици, там же одни ноли почти, нафига их хранить!!!? вы про метод прогонки знаете для трехдиагональных матриц(конкретно я о способе хранения элементов матрици в этом методе)? так вот для не трехдиагональных НО разреженных матриц тоже используют свою систему хранения элементов матрици
0
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
25.07.2011, 11:50  [ТС] #13
Цитата Сообщение от Maxwe11 Посмотреть сообщение
вот сдесь я соглашусь, а вот с постом номер 4 категорически нет, разреженые системы таких объемов нерешаются через обычные матрици, там же одни ноли почти, нафига их хранить!!!?
И ка же быть в этом случае?
0
Jupiter
Каратель
Эксперт С++
6564 / 3985 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.07.2011, 11:55 #14
писать обертку - структуру/класс, объект которой по обращению по индексу будет возвращать либо 0 либо элемент матрици отличный от ноля
0
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
25.07.2011, 11:58  [ТС] #15
Можете хотя бы наброски показать
0
25.07.2011, 11:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2011, 11:58
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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