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

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

22.07.2011, 15:58. Показов 17396. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru