Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.97/34: Рейтинг темы: голосов - 34, средняя оценка - 4.97
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 62

Разложение Холецкого

10.07.2015, 00:05. Показов 7087. Ответов 37
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Прошу помощи в поиске ошибки.

Условие: Выполнить разложение холецкого над матрицей n на n.

Исходный код:
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "main.h"
#include "matrix1.h"
#include "matrix21.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMain_menu *Main_menu;
int n,i,j,k;
double** matrix1;
double** matrix_hol;
//---------------------------------------------------------------------------
__fastcall TMain_menu::TMain_menu(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TMain_menu::Button1Click(TObject *Sender)
{
n = StrToInt(Edit1->Text);
matrix->StringGrid1->RowCount = n;
matrix->StringGrid1->ColCount = n;
matrix->StringGrid1->Width = (25*n)+5;
matrix->StringGrid1->Height = (21*n)+5;
 
matrix->Width = (25*n)+25;
matrix->Height = (21*n)+50;
 
matrix->Show();
 
 
matrix2->StringGrid1->RowCount = n;
matrix2->StringGrid1->ColCount = n;
matrix2->StringGrid1->Width = (25*n)+5;
matrix2->StringGrid1->Height = (21*n)+5;
 
matrix2->Width = (25*n)+25;
matrix2->Height = (21*n)+50;
}
//---------------------------------------------------------------------------
void __fastcall TMain_menu::Button2Click(TObject *Sender)
{
randomize();
matrix1 = new double*[n];
 
    for ( i = 0; i < n; i++)
        matrix1[i] = new double[n];
 
    for ( i = 0; i < n; i++)
        for ( j = 0; j < n; j++)
        {
         matrix1[i][j]=rand()%100;
         matrix->StringGrid1->Cells[i][j]=matrix1[i][j];
        }
 
    for ( i = 0; i < n; i++)
        for ( j = 0; j < n; j++)
        {
         matrix1[i][j]=matrix1[j][i];
         matrix->StringGrid1->Cells[i][j]=matrix1[i][j];
        }
 
}
//---------------------------------------------------------------------------
void __fastcall TMain_menu::Button4Click(TObject *Sender)
{
    matrix2->Show();
 
    matrix_hol = new double*[n];
    for ( i = 0; i < n; i++)
    {
        matrix_hol[i] = new double[n];
    }
 
 
 
    for (int i = 0; i < n; i++)
        {
            double temp;
            
            for (int j = 0; j < i; j++)
            {
                temp = 0;
                for (int k = 0; k < j; k++)
                {
                    temp += matrix_hol[i][k] * matrix_hol[j][k];
                }
                matrix_hol[i][j] = (matrix1[i][j] - temp) / matrix_hol[j][j];
            }
 
            
            temp = matrix1[i][i];
            for (int k = 0; k < i; k++)
                {
                    temp -= matrix_hol[i][k] * matrix_hol[i][k];
                }
            matrix_hol[i][i] = sqrt(temp);
        }
 
 
    for ( i = 0; i < n; i++)
        for ( j = 0; j < n; j++)
        {
            matrix2->StringGrid1->Cells[i][j] = matrix_hol[i][j];
        }
 
 
 
}
//---------------------------------------------------------------------------
Ниже скриншот с результатом работы.
Миниатюры
Разложение Холецкого  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.07.2015, 00:05
Ответы с готовыми решениями:

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

Разложение Холецкого
Мог бы кто-нибудь , кто имел дело с этим преобразованием помочь разобратся с ним, мне необходимо составить программу , но я не очень...

Программа QR разложения и Разложение Холецкого
Все разложение применимы для матриц любого размера, n размер матрицы b. QR function =Zayka(A,b,n) for i= 1:1:n for j =...

37
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 62
11.07.2015, 05:09  [ТС]
Студворк — интернет-сервис помощи студентам
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
    
 
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "main.h"
#include "matrix1.h"
#include "matrix21.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMain_menu *Main_menu;
int n,i,j,k;
double** matrix1;
double** matrix_hol;
//---------------------------------------------------------------------------
__fastcall TMain_menu::TMain_menu(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TMain_menu::Button1Click(TObject *Sender)
{
n = StrToInt(Edit1->Text);
matrix->StringGrid1->RowCount = n;
matrix->StringGrid1->ColCount = n;
matrix->StringGrid1->Width = (25*n)+5;
matrix->StringGrid1->Height = (21*n)+5;
 
matrix->Width = (25*n)+25;
matrix->Height = (21*n)+50;
 
matrix->Show();
 
 
matrix2->StringGrid1->RowCount = n;
matrix2->StringGrid1->ColCount = n;
matrix2->StringGrid1->Width = (25*n)+5;
matrix2->StringGrid1->Height = (21*n)+5;
 
matrix2->Width = (25*n)+25;
matrix2->Height = (21*n)+50;
}
//---------------------------------------------------------------------------
void __fastcall TMain_menu::Button2Click(TObject *Sender)
{
randomize();
matrix1 = new double*[n];
 
    for ( i = 0; i < n; i++)
        matrix1[i] = new double[n];
 
    for ( i = 0; i < n; i++)
        for ( j = 0; j < n; j++)
        {
         matrix1[i][j]=rand()%100;
         matrix->StringGrid1->Cells[i][j]=matrix1[i][j];
        }
 
    for ( i = 0; i < n; i++)
        for ( j = 0; j < n; j++)
        {
         matrix1[i][j]=matrix1[j][i];
         matrix->StringGrid1->Cells[i][j]=matrix1[i][j];
        }
 
}
//---------------------------------------------------------------------------
void __fastcall TMain_menu::Button4Click(TObject *Sender)
{
    matrix2->Show();
    double temp,temp2;
 
    matrix_hol = new double*[n];
    for ( i = 0; i < n; i++)
    {
    matrix_hol[i] = new double[n];
    }
 
 
 
 
 
 
 
 
 
        for (int i = 0; i < n; i++)
                {
 
                    double temp;
                    temp = 0;
 
                    //temp = matrix1[i][i];
                    for (int k = 0; k < i; k++)
                        {
                            temp = temp + (matrix_hol[i][k] * matrix_hol[i][k]);
                        }
                    temp2 = matrix1[i][i] - temp;
                    matrix_hol[i][i] = sqrt(temp2);
 
                    for (int j = 0; j < i; j++)
                    {
                        temp = 0;
                        for (int k = 0; k < i; k++)
                        {
                            temp = temp + (matrix_hol[i][k] * matrix_hol[j][k]);
                        }
                        temp2 = matrix1[i][j] - temp;
                        matrix_hol[i][j] = (matrix1[i][j] - temp) / matrix_hol[j][j];
                    }
 
                }
 
 
 
    for ( i = 0; i < n; i++)
        for ( j = 0; j < n; j++)
        {
            matrix2->StringGrid1->Cells[j][i] = matrix_hol[i][j];
        }
 
 
 
}
//---------------------------------------------------------------------------
void __fastcall TMain_menu::Button3Click(TObject *Sender)
{
matrix1[0][0]=81;
matrix1[0][1]=-45;
matrix1[0][2]=45;
matrix1[1][0]=-45;
matrix1[1][1]=50;
matrix1[1][2]=-15;
matrix1[2][0]=45;
matrix1[2][1]=-15;
matrix1[2][2]=38;
for ( i = 0; i < n; i++)
        for ( j = 0; j < n; j++)
        {
 
         matrix->StringGrid1->Cells[i][j]=matrix1[i][j];
        }
}
//---------------------------------------------------------------------------
Сейчас кусок кода выглядит так.

Ошибок нет, но считает неверно. Уже попробовал десятки разных вариантов, но ничего не получается.
Ниже пример правильного решения, и пример того, что делает моя программа.
Миниатюры
Разложение Холецкого   Разложение Холецкого  
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
11.07.2015, 10:17
Цитата Сообщение от andrewromanov Посмотреть сообщение
Ошибок нет, но считает неверно.
Так не бывает.Ошибка либо у вас в реализации,либо в том,что вы применяете метод не применимый к вашим условиям.
0
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 62
11.07.2015, 14:30  [ТС]
S_el, ошибка имелась ввиду в другом плане, ранее программа совсем ничего не считала, кроме первого столбца, и выдавала "sqrt domain error".
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33459 / 21559 / 8248
Регистрация: 22.10.2011
Сообщений: 37,016
Записей в блоге: 12
11.07.2015, 14:45
andrewromanov, нормально эта матрица раскладывается. Просто массив matrix_hol надо очищать после выделения памяти.
Миниатюры
Разложение Холецкого  
0
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 62
11.07.2015, 14:47  [ТС]
gunslinger, я отсюда взял, там не может быть мешанины.
https://ru.wikibooks.org/wiki/... 0%B3%D0%BE

Добавлено через 14 часов 32 минуты
По ошибке, запостил свое сообщение в другую тему (Метод Холецкого)
0
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 62
11.07.2015, 14:47  [ТС]
volvo, как это сделать?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33459 / 21559 / 8248
Регистрация: 22.10.2011
Сообщений: 37,016
Записей в блоге: 12
11.07.2015, 14:48
Это твой код, без изменений, кроме:
C++
1
2
3
4
5
6
    matrix_hol = new double*[n];
    for ( i = 0; i < n; i++)
    {
        matrix_hol[i] = new double[n];
        for (int j = 0; j < n; j++) matrix_hol[i][j] = 0; // вот этой строки
    }
0
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 62
11.07.2015, 14:56  [ТС]
Что-то не то.

Если не трудно, дайте код полностью.
Миниатюры
Разложение Холецкого  
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33459 / 21559 / 8248
Регистрация: 22.10.2011
Сообщений: 37,016
Записей в блоге: 12
11.07.2015, 14:57
Тебе для начала надо научиться читать код на С++, а потом браться писать что-то. Что там не то? Что не изменяется? Где проблема в понимании того, как заполнить массив нулями?

И почему ты продолжаешь обсуждение в чужой теме, собственно?
Перенесено...
0
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 62
11.07.2015, 15:03  [ТС]
volvo, вы меня совсем запутали, у меня второй массив изначально заполнен нулями.

Ту строчку, что вы написали, я добавил в свою программу, но она не стала считать корректно 2 и следующие столбцы.

Тему перепутал случайно, извиняюсь.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33459 / 21559 / 8248
Регистрация: 22.10.2011
Сообщений: 37,016
Записей в блоге: 12
11.07.2015, 15:08
В аттаче проект, который прекрасно раскладывает приведенную матрицу. Не знаю, что там где у тебя заполнено нулями, но по коду:
Цитата Сообщение от andrewromanov Посмотреть сообщение
C++
71
72
73
74
75
76
77
78
79
80
81
void __fastcall TMain_menu::Button4Click(TObject *Sender)
{
* * matrix2->Show();
* * double temp,temp2;
matrix_hol = new double*[n];
* * for ( i = 0; i < n; i++)
* * {
* * matrix_hol[i] = new double[n];
* * }
// ...
for (int i = 0; i < n; i++)
этого заполнения не видно ни разу. Ты просто выделяешь память под массив и тут же начинаешь с ним работать, не инициализируя ничем...
Вложения
Тип файла: 7z cholesky.7z (60.7 Кб, 8 просмотров)
1
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 62
11.07.2015, 15:28  [ТС]
Спасибо большое теперь все работает.
0
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 62
11.07.2015, 15:30  [ТС]
Рано поблагодарил, код взят из вашей программы
Миниатюры
Разложение Холецкого  
0
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 62
11.07.2015, 15:37  [ТС]
А вот ваша программа с случайным заполнением
Миниатюры
Разложение Холецкого  
0
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 62
12.07.2015, 13:21  [ТС]
Вопрос актуален.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33459 / 21559 / 8248
Регистрация: 22.10.2011
Сообщений: 37,016
Записей в блоге: 12
12.07.2015, 15:53
andrewromanov, ты что, издеваешься? Случайная матрица НЕ РАСКЛАДЫВАЕТСЯ методом Холецкого, еще раз повторить необходимое условие для того, чтобы разложение было успешным, или ты сам соизволишь перечитать тему с начала? Ну ладно, поскольку перечитывать ничего ты не будешь, повторяю еще раз: случайно заданная матрица не обязательно является положительно определенной. Всё, закончили обсуждение этого факта. Добавь в конце концов функцию, проверяющую, удовлетворяет ли матрица всем критериям положительно-определенной, и ТОЛЬКО если да, тогда начинай разложения. Чего ж ты непробиваемый-то такой?

Почему ты не можешь вычислить действительный квадратный корень из отрицательного действительного же числа, не задумывался? Потому что для того, чтобы извлечь квадратный корень и получить действительное число, значение под корнем должно быть положительным. Это необходимое условие. Это понятно? А теперь объясни, что непонятного в том, что на разложение матрицы тоже накладываются какие-то предварительные условия?

В общем, с тобой разговаривать бесполезно, насколько я понимаю. Ты слышать ничего НЕ ХОЧЕШЬ, равно как и понимать. Тебе надо всеми путями получить программу, которая любую матрицу разложит методом Холецкого? Хорошо. Я тебе напишу такую программу. Только после того, как ты напишешь мне код, который извлечет действительный квадратный корень из ЛЮБОГО действительного числа. Пока твой код не отработает на ЛЮБОМ введенном мной значении, я пальцем не пошевелю, чтобы начать программировать это разложение, договорились? А когда (и если) ты все-таки осознаешь, что не любая, а только удовлетворяющая некоторым критериям матрица может быть разложена - иди и проверяй удовлетворяющую этим критериям матрицу кодом из 31-го поста.
0
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 62
12.07.2015, 16:42  [ТС]
volvo, не нужно придираться к словам, на скриншоте 33 поста явно видна симметричная, положительно определенная матрица, но тем не менее она не раскладывается.
0
0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 62
13.07.2015, 21:04  [ТС]
Актуально!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.07.2015, 21:04

Разложение Холецкого(метод квадратного корня)
Требуется помощь, чтобы разобраться. Есть готовая блок-схема, по ней написал программу, но что-то никак не получается. Знаю про встроенные...

Разложение Холецкого для решения СЛАУ
Здравствуйте помогите пожалуйста создать программу на с++ которая решает СЛАУ методом разложении Холецкого , Элементы матрицы должны...

Разложение Холецкого для не положительной матрицы
Доброго вечера В общем возник следующий вопрос. Есть корреляционная матрица 3 на 3 (или более), например такого вида: С...

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

Разложение Холецкого симметричной матрицы коэффициентов и его использование для решения системы линейных алгебраических уравнений
41 x1+15x2+10x3-48x4+42x5=1, 15x1+38x2-17x3-18x4+12x5=-6, 10x1-17x2+175x3+15x4+9x5+4=0, -48x1-18x2+15x3+78x4-40x5+9=0, ...


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

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru