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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.67
williamvolkov
0 / 0 / 0
Регистрация: 17.11.2010
Сообщений: 23
#1

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

28.11.2012, 00:37. Просмотров 3619. Ответов 3
Метки нет (Все метки)

Задача:
Решить СЛАУ с помощью метода холецкого (квадратного корня). Вывести значение 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 минут
Закройте тему плиз, нашел ошибку)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.11.2012, 00:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Метод Холецкого (C++):

Метод Холецкого для решения Слау - C++
Ты не мог бы выложить программу?

Уровнения по Методу Холецкого - C++
помогите решить систему линейных уровнений по схеме Холецкого в общем виде...Если можно с коментариями...

СЛУ методом LDLT разложения Холецкого - C++
Решить СЛУ методом LDLT разложения Холецкого. помогите пожалуйста разработать данный алгоритм.

Разложение Холецкого и решение СЛАУ на его основе - C++
спасайте люди добрые... признаюсь сразу, я пень-пнём в С++. Мне задан курсовик &quot;Разложение Холецкого и решение СЛАУ на его основе&quot;. В...

СЛАУ. Метод обратной матрицы, метод Гаусса, метод Крамера, метод Зейделя - C++
Помогите ребят. Не могу построить алгоритмы для этих методов Язык C++

Метод медиан из трех элементов VS улучшенный быстрый метод сортировки(метод Бентли-Макилроя) - C++
Здравствуйте! Дали весьма интересное задание. Сравнить два вышеуказанных метода сортировки для массива из 10000 элементов, результаты...

3
grizlik78
Эксперт С++
1971 / 1464 / 122
Регистрация: 29.05.2011
Сообщений: 3,029
28.11.2012, 02:33 #2
Нашёл — выложи исправленный код Или хотя бы укажи, где ошибка.
P.S. Мне не надо.
0
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].
0
proc3nt
волшебник
536 / 404 / 137
Регистрация: 26.05.2012
Сообщений: 1,170
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];
                }
        }
да, и еще почему ты ориентируешься на столбцы, а не на строки. хотя матрица симметричная..
0
13.05.2013, 01:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2013, 01:42
Привет! Вот еще темы с ответами:

Мой код - метод бисекции, метод секущих (метод хорд) - C++
Всем привет!!! Изучаем в институте С++. Сделал код, и там, и там одна и та же проблема - при любых вбиваемых значениях программа делает...

Параллельная программа для метода холецкого с помощью openMp и mpi - C++
Товарищи,помогите пожалуйста с параллельным программированием: надо написать параллельную программу для метода холецкого с помощью openMp...

Исследовать итерационный метод- метод касательных для решения нелинейных уравнений - C++
прочитал много всего , но сам пример реализовать никак не могу , кто может помогите F(x) = x5+5x+1=0 с...

Не сходится теория и практика метод Шелла и метод простого выбора - C++
Здравствуйте! Помогите пожулуйста найти ошибке в коде, Я уже не знаю где ее искать. У меня метод простого выбора работает по показателям...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.