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

Метод Холецкого - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.67
williamvolkov
0 / 0 / 0
Регистрация: 17.11.2010
Сообщений: 23
28.11.2012, 00:37     Метод Холецкого #1
Задача:
Решить СЛАУ с помощью метода холецкого (квадратного корня). Вывести значение y и вектора невязки r
Ay=f - СЛАУ
r=Ay-f
Метод основан на представлении положительно определенной симметричной матрицы А в виде A=L*LT
, где L — нижняя треугольная матрица с положительными действительными элементами на диагонали
Работаю в Eclipse. Написал код, но не могу понять где ошибка. вроде все по алгориму. Помогите пожалуйста исправить или выложите какой-нибудь иной способ (код)
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
#include <iostream.h>
#include <fstream.h>
#include <math.h>
using namespace std;
 
int main()
{
int n=10;
int i,j,k,m;
float A[n][n],L[n][n],T[n][n];
float g[n],r[n],v[n],y[n],pk,sum;
 
m=n;
//открываем поток для работы с файлами
ifstream f("input.txt",ios::in);
//считываем из потока m
//f >> m;
//cout << " m = "<< m << "\n" ;
//считываем из потока матрицу и вектор g
    for(i = 0; i < m; i++)
    {
        for(j = 0; j < m; j++)
        {
        f >> A[i][j];
        cout << A[i][j]<<" ";
        }
        cout << "\n";
    }
    for(i = 0; i < m; i++)
    {
        f >> g[i];
        cout << g[i]<<" ";
    }
f.close(); // закрываем поток, т.к. все что нам надо мы считали
 
    for (i=0; i<m; i++)
        for (j=0; j<m; j++)
            L[i][j]=0;
 
//Нахождение матрицы L и T соответственно
    L[0][0]=sqrt(A[0][0]);
    for (j=1; j< m; j++)
        L[j][0]=A[j][0]/L[0][0];
 
    for (i = 1;i < m; i++)
    {
        sum=0;
        for (k = 0; k < i; k++ )
            sum=sum + L[i][k]*L[i][k]; //можно pow(L[i][j],2)
        pk=A[i][i]-sum;
        L[i][i]=sqrt(pk);
 
        for (j=i+1; j < m ; j++ )
        {
            sum=0;
            for (k = 0; k < i; k++)
                sum=sum + L[j][k]*L[i][k];
            pk=A[j][i]-sum;
            L[j][i]=pk/L[i][i];
        }
    }
 
    for (i=0; i<m; i++)
        for (j=0; j<m ; j++)
            T[i][j]=L[j][i];
 
//Решение L*v=g
    v[0]=g[0]/L[0][0];
    for (i=1; i<m; i++)
    {
        sum=0;
        for (k=0; k<i; k++)
            sum=sum+L[i][k]*v[k];
        pk=g[i]-sum;
        v[i]=pk/L[i][i];
    }
 
//Решение T*y=v
    y[m-1]=v[m-1]/T[m-1][m-1];
    for (i=m-2; i>=0; i--)
    {
        sum=0;
        for (k=i+1; k<m; k++)
            sum=sum+T[i][k]*y[k];
        pk=v[i]-sum;
        y[i]=pk/T[i][i];
    }
 
// Нахождение вектора невязки r
    for (i=0; i<m; i++)
    {
        r[i]=0;
        for (j=0; j < m; j++)
            r[i]=r[i]+A[i][j]*y[i];
        r[i]=r[i]-g[i];
    }
 
    cout << "\n";
    for (i=0; i<m ; i++)
    cout << y[i]<< " ";
    cout << "\n";
    for (i=0; i<m ; i++)
    cout << r[i]<< " ";
 
/*открываем поток для записи в файл
    ofstream f1("output.txt",ios::out);
    for (i=0; i<m ; i++)
    f1 << y[i];
    f1 << "\n";
    for (i=0; i<m ; i++)
    f1 << r[i];
    f1.close();
 
*/
    return 0;
}
Добавлено через 2 часа 15 минут
Закройте тему плиз, нашел ошибку)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
28.11.2012, 02:33     Метод Холецкого #2
Нашёл — выложи исправленный код Или хотя бы укажи, где ошибка.
P.S. Мне не надо.
williamvolkov
0 / 0 / 0
Регистрация: 17.11.2010
Сообщений: 23
28.11.2012, 03:09  [ТС]     Метод Холецкого #3
Цитата Сообщение от williamvolkov Посмотреть сообщение
// Нахождение вектора невязки r
* * for (i=0; i<m; i++)
* * {
* * * * r[i]=0;
* * * * for (j=0; j < m; j++)
* * * * * * r[i]=r[i]+A[i][j]*y[i];
* * * * r[i]=r[i]-g[i];
вот тут была ошибка . надо y[j] а не y[i].
proc3nt
Модератор
373 / 267 / 86
Регистрация: 26.05.2012
Сообщений: 720
13.05.2013, 01:42     Метод Холецкого #4
неа. ошибк? есть на начальном этапе. например, будет выход за границы массива при попытке преобразования элемента правее самого правого нижнего. надо это предусмотреть..

C++
1
2
3
4
5
6
7
8
9
10
11
12
if(i!=m-1)
        {
                for(int j=i+1;j<m;j++)
                {
                sum=0;
                for(int k=0;k<i;k++)
                {
                    sum+=u[k][j]*u[k][i];
                }
                u[i][j]=(a[i][j]-sum)/u[i][i];
                }
        }
да, и еще почему ты ориентируешься на столбцы, а не на строки. хотя матрица симметричная..
Yandex
Объявления
13.05.2013, 01:42     Метод Холецкого
Ответ Создать тему
Опции темы

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