#1 23.10.10 19:12
алгоритм Холецкого на delphi
на delphi нужно составить цикл для разложения матрицы по методу Холецкого
алгоритм:

код:
Код::
l[1,1]:=sqrt(a[1,1]); for i:=2 to n do begin l[i,1]:=a[i,1]/l[1,1]; end; l[2,2]:=sqrt(a[2,2]-l[2,1]*l[2,1]); for i:=3 to n do begin l[i,2]:=(a[i,2]-l[i,1]*l[2,1])/l[2,2];end; l[3,3]:=sqrt(a[3,3]-l[3,1]*l[3,1]-l[3,2]*l[3,2]);
код только для матрицы 3x3
подскажите как сделать в "цикле" для матрицы размерностью nxn
Исправлено (RU) (23.10.10 19:13)
Offline
#2 24.10.10 00:58
Re: алгоритм Холецкого на delphi
Разложе́ние Холе́цкого — представление симметричной положительно-определённой матрицы A в виде A = LLT, где L — нижняя треугольная матрица со строго положительными элементами на диагонали. Иногда разложение записывается в эквивалентной форме: A = UTU, где U = LT — верхняя треугольная матрица. Разложение Холецкого всегда существует и единственно для любой симметричной положительно-определённой матрицы.
Существует также обобщение этого разложения на случай комплекснозначных матриц. Если A — положительно-определённая эрмитова матрица, то существует разложение , где L — нижняя треугольная матрица с положительными действительными элементами на диагонали, а — эрмитово-сопряжённая к ней матрица.
Алгоритм
Элементы матрицы L можно вычислить, начиная с верхнего левого угла матрицы, по формулам:


Выражение под корнем всегда положительно, если A — действительная положительно-определённая матрица.
Для комплекснозначных эрмитовых матриц используются формулы:


Offline
#3 24.10.10 10:00
Re: алгоритм Холецкого на delphi
Banzzaj знаю, видел.
вопрос в том как объединить в цикл.
так как в первой формуле для L[i,i] конечное значение "к"=i-1, а по второй формуле "к"=j-1;
делал так:
Код::
sum1:=0;sum2:=0;
for i:=1 to n do begin
for k:=0 to i-1 do begin
l[i,i]:=sqrt(a[i,i]-sum1);
sum1:=sum1+l[i,k]*l1[i,k];
end;
end;
for i:=1 to n do begin
for j:=1 to n do begin
for k:=0 to j-1 do begin
if j>i then begin
l[i,j]:=1/l[j,j]*(a[i,j]-sum2);
sum2:=sum2+(l[i,k]*l1[j,k]);
end;
end;
end;
end;выдает ошибку в строке
Код::
l[i,j]:=1/l[j,j]*(a[i,j]-sum2);sum2:=sum2+(l[i,k]*l1[j,k]);
"деление на ноль"
Исправлено (RU) (24.10.10 10:01)
Offline
#4 24.10.10 13:41
Re: алгоритм Холецкого на delphi
(RU) написал(а):
"деление на ноль"
ну значит l[j,j] при какомто j равно 0.
то есть a[i,i]-sum1 на каком то шаге равно 0. => на каком то шаге a[i,i] = sum1.
Banzzaj написал(а):
A — действительная положительно-определённая матрица.
выполняется?
Исправлено Fire Stream (24.10.10 13:42)
Offline
#5 24.10.10 15:44
Re: алгоритм Холецкого на delphi
Fire Stream написал(а):
Banzzaj написал(а):
A — действительная положительно-определённая матрица.
выполняется?
да, вот матрица
Код::
4 2 6 2 10 9 6 9 14
у меня на L[i,j] и на L[i,i] два разных цикла, а нужно записать их под один.
так как переменные в них зависят друг от друга
Offline

