%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Matematica Numerica 2 - Ano Lectivo 2005/06
%
% Departamento de Matematica da FCTUC
%
% Exercicio 4(b) - Trabalho 2 
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 
%
function [E, Hpt, L, Dpt] = ptDP(H);
%
% Input: H simetrica e densa.
%
% Output: E simetrica e densa tal que H+E e' definida positiva.
%         Hpt = H + E = L * Dpt * L',
%         com Dpt diagonal e L triangular inferior
%         com elementos diagonais unitarios.
%
% Factorizar sem escolha parcial de pivot:
[L,U] = lu(sparse(H),0);
%
% Tornar os factores densos:
L = full(L);
U = full(U);
%
% Aceder 'a diagonal de U em forma de vector:
d = diag(U);
%
tol = 10^-4;
%
% Ver quais os pivots "negativos":
ko = ~( d > tol );
%
n  = size(H,1);
pt = zeros(n,1);
%
% Calcular a perturbacao desses pivots:
pt(ko) = -d(ko) + tol;
%
% Finalizar as contas:
Dpt = diag( d + pt );
Hpt = L * Dpt * L';
E   = L * diag(pt) * L';
%
% Fim.
