0 / 0 / 0
Регистрация: 07.10.2014
Сообщений: 62

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

10.07.2015, 00:05. Показов 7103. Ответов 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
33460 / 21560 / 8248
Регистрация: 22.10.2011
Сообщений: 37,017
Записей в блоге: 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
33460 / 21560 / 8248
Регистрация: 22.10.2011
Сообщений: 37,017
Записей в блоге: 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
33460 / 21560 / 8248
Регистрация: 22.10.2011
Сообщений: 37,017
Записей в блоге: 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
33460 / 21560 / 8248
Регистрация: 22.10.2011
Сообщений: 37,017
Записей в блоге: 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
33460 / 21560 / 8248
Регистрация: 22.10.2011
Сообщений: 37,017
Записей в блоге: 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru