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

Решение СЛАУ методом минимальных невязок - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.90
DUKE009
0 / 0 / 0
Регистрация: 22.04.2012
Сообщений: 3
12.05.2012, 12:40     Решение СЛАУ методом минимальных невязок #1
Всем привет!
Помогите разобраться с данным методом, алгоритм я читал здесь:
http://www.physchem.chimfak.rsu.ru/S...ys_lin_eq.html

уже успел реализовать
функцию перемножения матрицы на вектор:
C++
1
2
3
4
5
6
7
8
9
10
void MatrVekt(int N, double **M, double *V, double *R)
//N- размерность, M- матрица, V- вектор, R- результат
{
for(int i=0; i<N; i++)
        {
        R[i]=0;
        for(int j=0; j<N; j++)
              R[i]+= M[i][j]*V[j];
        }
}
и часть алгоритма:

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
void MinNev(int N, double **A, double *F, double *X, float eps)
//N- размерность, A- матрица, F- вектор свободных членов, X-вектор результат
{
double *R = new double [N];
double *Delta = new double [N];
double *TempX = new double[N];
double maxi=0.0;
for (int i=0; i<N; i++)
    TempX[i]=0;//первое приближение задаём нулевым
do
{
MatrVekt(N, A, TempX, R);
for(int i=0; i<N; i++)
    {
    Delta[i]=F[i]-R[i];//Вектор невязок
    }
 
/////
maxi = fabs(X[0] - TempX[0]);
for(int i=0; i<N; i++)
    {
    if(fabs(X[i]-TempX[i])>maxi)
        maxi=fabs(X[i]-TempX[i]);
    X[i] = TempX[i];
    } 
}
while (maxi>=eps);
 
delete[] R;
delete[] Delta;
delete[] TempX;
}
Из теории мне не совсем ясно с параметром http://www.cyberforum.ru/cgi-bin/latex.cgi?\tau. Это тоже вектор? Получается чтобы его вычислить, нужно еще дополнительно написать функцию для векторного произведения?

Добавлено через 23 часа 30 минут
Немного посидел, и пришёл к такой реализации. Если не сложно, помогите найти ошибку. Суть в том, что при запуске функция уходит в бесконечный цикл. Условие выхода вроде реализовано верно. Короче не знаю в чём дело..
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
void MinNev(int N, double **A, double *F, double *X, float eps)
//N- размерность, A- матрица, F- вектор свободных членов, X-вектор результат
{
    int count=0;
double *R = new double [N];
double *Delta = new double [N];
double *TempX = new double[N];
double maxi=0.0, Tau=0.0, TempTau=0.0;
for (int i=0; i<N; i++)
    TempX[i]=0;//первое приближение задаём нулевым
do
{
MatrVekt(N, A, TempX, R);
for(int i=0; i<N; i++)
    {
    Delta[i]=F[i]-R[i];//Вектор невязок
    }
MatrVekt(N, A, Delta, R);
for(int i=0; i<N; i++)
    {
    Tau+=-(R[i]*Delta[i])/(R[i]*R[i]);
    } 
for(int i=0; i<N; i++)
    {
    X[i]=TempX[i]-Tau*Delta[i];
    } 
 
maxi = fabs(X[0] - TempX[0]);
for(int i=0; i<N; i++)
    {
    if(fabs(X[i]-TempX[i])>maxi)
        maxi=fabs(X[i]-TempX[i]);
    }
count++;
}
while (maxi>=eps);
 printf("%d",count);
delete[] R;
delete[] Delta;
delete[] TempX;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.05.2012, 12:40     Решение СЛАУ методом минимальных невязок
Посмотрите здесь:

Решение СЛАУ методом Зейделя C++
C++ Решение СЛАУ методом Крамера
Решение СЛАУ методом Гаусса C++
C++ Решение СЛАУ методом Якоби
C++ Решение СЛАУ методом Гаусса
Решение СЛАУ методом прогонки C++
Решение СЛАУ методом вращения C++
C++ Решение слау методом релаксации

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 13:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru