3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313

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

22.07.2011, 15:58. Показов 16443. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru