Официальный сайт студ.городка НГТУ
Программирование и БД » алгоритм Холецкого на delphi 

#1  23.10.10 19:12

алгоритм Холецкого на delphi

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

http://hostel.nstu.ru/uploaded/gallery/13807_1287835716.png


код:

Код::

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 можно вычислить, начиная с верхнего левого угла матрицы, по формулам:

http://hostel.nstu.ru/uploaded/gallery/13464_1287856587.png


http://hostel.nstu.ru/uploaded/gallery/13464_1287856597.png



Выражение под корнем всегда положительно, если A — действительная положительно-определённая матрица.

Для комплекснозначных эрмитовых матриц используются формулы:

http://hostel.nstu.ru/uploaded/gallery/13464_1287856607.png


http://hostel.nstu.ru/uploaded/gallery/13464_1287856618.png



© wiki

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

Программирование и БД » алгоритм Холецкого на delphi 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.261 сек.
Выполнено 11 запросов.