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

int main()
{
  //Descomposicion LU de una matriz de Hilbert
	cout << "Entrar dimension" << endl;
	int             n;
	cin >> n;
	Matrix < Real > H(n, n);
        Vector < Real > b(n);
        b=1.;


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

	//descomposicion LU
       	LU < Real > mi_lu(H);//Creacion objeto llamado mi_lu de la clase de algoritmos LU
       	Matrix < Real > L = mi_lu.getL();	//obtencion matriz L
       	cout << L << endl;
	Matrix < Real > U = mi_lu.getU();	//Obtencion matriz U
       	cout << U << endl;
	Real            det = mi_lu.det();	//Obtencion determinante
       	cout << "det =" << det << endl;
	cout << "L*U = " << L * U << endl;//Producto L * U
       	Matrix < Real > IH = mi_lu.inv();	//Calculo de la inversa
	cout << "inversa = " << IH << endl;
	Matrix < Real > I = H * IH;
	cout << "H*IH = " << I << endl;	//comprobacion H * inv(H) = I
        //Solucion de ecuaciones
        Vector < Real > x = mi_lu.solve(b); //Solucion H * x = b;
        cout <<"x = "<<x<<endl;
        return 0;
        


}
