Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.90/71: Рейтинг темы: голосов - 71, средняя оценка - 4.90
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313

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

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

Студворк — интернет-сервис помощи студентам
У меня есть система линейных уравнений. В ней 4000 уравнений.
Киньте плиз код для её решения. Желательно, чтобы он был максимально быстрым.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.07.2011, 15:58
Ответы с готовыми решениями:

Решить систему линейных алгебраических уравнений
Решить 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 линейных алгебраических уравнений
Помогите пожалуйста написать на с++ методом Гаусса решить систему n линейных алгебраических уравнений. Отсюда нашла именно ту тему там...

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

152
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
28.07.2011, 16:07
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от hello19 Посмотреть сообщение
У меня есть система линейных уравнений. В ней 4000 уравнений.
Киньте плиз код для её решения. Желательно, чтобы он был максимально быстрым.
hello19, я уже не первый день сижу и пробовал на матрицах небольшого размера, у тебя файл с матрицей А корректный, там во всех строчках нужное число элементов???Как ты этот файл получаешь???
1
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
29.07.2011, 12:33
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 байт, 15 просмотров)
2
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
29.07.2011, 12:45  [ТС]
Запустил на матрице порядка 3638... вылетело(
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
29.07.2011, 12:52
Видно всё таки буду тестировать на большом объёме, если можешь запусти у себя прогу ещё раз и пришли скриншот сообщения об ошибке, или хотя бы номер строки в которой вылетело(я о считывании или обработке). У меня дефицит времени - на работе сейчас и машина слабая(
1
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
29.07.2011, 13:02  [ТС]
Чет хз как миниатюру кинуть.. вообщем вот что получилось:
http://narod.ru/disk/203537160... A.png.html
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
29.07.2011, 14:11
Хорошо, работаю над этим...

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

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

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

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

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

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

Добавлено через 5 минут
Что думаешь?
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
02.08.2011, 17:09
Хорошо, отпишу по окончанию расчётов, к сожалению Метод Гаусса при решении в лоб в любых его вариациях долгая задача, ещё немного повожусь над быстродействием
1
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
02.08.2011, 17:14  [ТС]
Хотя вообще то просто вычеркнуть нулевые строчки и элементы столбца свободных членов - не получиться.
По сути дела - вычеркивая строку, мы должны убрать 1 переменную из каждого уравнения. По этому надо, чтобы и порядок матрицы коэффициентов тоже уменьшился...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.08.2011, 17:14

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

Решить систему линейных уравнений вида Ax=b методом Зейделя
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...

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru