// Ejemplos con TNT y JAMA
// compilar con g++ - I./templates jama_eigen.cpp
#include <iostream>
#include <iomanip>
#include "algebralineal.h"
using namespace std;
using namespace CALNUM;

typedef long double Real;//tipo generico Real

int main()
{
	cout << "Entrar dimension" << endl;
	int             n;
	cin >> n;
	Matrix < Real > H(n, n);
	Matrix < Real > E(n, n);

	//Creacion matriz Hilbert
		for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
			H[i][j] = Real(1.) / Real(i + j + 1.);
	cout << "H=" << H << endl;

	//valores y vectores propios
	Eigenvalue < Real > val_prop(H);//Se crea un elemennto val_prop de la clase Eingenvalue
        Vector < Real > lambda;//creacion vector de valores propios reales en lambda
	val_prop.getRealEigenvalues(lambda);//relleno de lambda con los valores propios
	cout << "valores propios=" << lambda << endl;//vectores propios, se escriben en la matriz V
	Matrix < Real > V;//Creacion de matriz de vectores propios
	val_prop.getV(V);//relleno de V
      	// matriz diagonal, se escribe en D
	Matrix < Real > D;
	val_prop.getD(D);//relleno de D con la diagonal de H
	cout << "Matriz Diagonal= " << D << endl;
	cout << " Vectores propios = " << V << endl;

	//Comprobacion H * V = V * D
       	Matrix < Real > AV = H * V - V * D;
	//Comprobacion H * V = V * D
	cout << " H*V-V*D= " << AV << endl;
	Matrix < Real > I = V * transpose(V);
	//Comprobacion ortogonalidad V
	cout << "V*transpose(V)=" << I << endl;
	I = transpose(V) * H * V;
	//Comprobacion VT * H * V = D
	cout << "transpose(V)*H*V=" << I << endl;
        return 0;
}
