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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Английские и русские буквы. http://www.cyberforum.ru/cpp-beginners/thread335375.html
Здравствуйте! Подскажите пожалуйста, как в С отличить русские буквы от английских? Я думаю что надо оперировать с кодами букв, но как именно-не соображу. Добавлено через 18 минут /* *...
C++ Что делается этимим строчками void main() { srand((unsigned)time(NULL)); setlocale(0, ""); ..... } http://www.cyberforum.ru/cpp-beginners/thread335373.html
C++ Почему то не могу считать матрицу
Есть матрица порядка 3638. Мне нужно найти обратную к ней. ( В последствии порядок матрицы будет около 100 000) Есть код, вот только он не совсем рабочий. На маленьких матрицах порядка 3-4 он...
наследование классов C++
Здарова, народ! :D Вот сижу и пытаюсь сделать задание из книги по которой "учимся программировать в универе", а там такой поворот событий :wall:, что я не понял как сделать. Помогите как накатать...
C++ Дорогие, помогите с линковкой libeay32.lib http://www.cyberforum.ru/cpp-beginners/thread335326.html
Здравствуйте, Уважаемые гуру! Собираю ntp-сервер, написанный на "с". Называется ntp 4.2.6p3 http://support.ntp.org/bin/view/Main/SoftwareDownloads Собираю его в Visual Studio 2003, в последствии...
C++ Нужен алгоритм Как на с++ сделать так что б в игре противники двигались паралельно главному персонажу (которым непосредственно мы и управляем)... Заранее спасибо за идеи... PS Пробовал все реализовать так... подробнее

Показать сообщение отдельно
-=ЮрА=-
Заблокирован
Автор FAQ
23.07.2011, 14:26
Из за большой величины матрицы которая составляет 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 просмотров)
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru