Anterior

Código fuente

public class Vector {
    public int n;      //dimensión
    double[] x;
    public Vector(int n) {
        this.n=n;
        x=new double[n];
        for(int i=0; i<n; i++){
            x[i]=0.0;
        }
    }
    public Vector(double[] x) {
        this.x=x;
        n=x.length;
    }
    public static double productoEscalar(Vector a, Vector b){
        double resultado=0.0;
        for(int i=0; i<a.n; i++){
            resultado+=a.x[i]*b.x[i];
        }
        return resultado;
    }
    public double modulo(){
        return Math.sqrt(productoEscalar(this, this));
    }
    public String toString(){
        String texto=" ";
        for(int i=0; i<n; i++){
            texto+="\t "+(double)Math.round(1000*x[i])/1000;
        }
        texto+="\n";
        return texto;
  }

}

 

public class Matriz implements Cloneable{
    public int n;      //dimensión
    private double[][] x;
    public Matriz(int n) {
        this.n=n;
        x=new double[n][n];
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                x[i][j]=0.0;
            }
        }
    }
    public Matriz(double[][] x) {
        this.x=x;
        n=x.length;
   }
   public Object clone(){
        Matriz obj=null;
        try{
            obj=(Matriz)super.clone();
        }catch(CloneNotSupportedException ex){
            System.out.println(" no se puede duplicar");
        }
//aquí está el código  para clonar la matriz bidimensional
        obj.x=(double[][])obj.x.clone();
        for(int i=0; i<obj.x.length; i++){
            obj.x[i]=(double[])obj.x[i].clone();
        }
        return obj;
    }

    double traza(){
        double tr=0.0;
        for(int i=0; i<n; i++){
            tr+=x[i][i];
        }
        return tr;
    }
//suma de dos matrices
    static Matriz suma(Matriz a, Matriz b){
        Matriz resultado=new Matriz(a.n);
        for(int i=0; i<a.n; i++){
            for(int j=0; j<a.n; j++){
                resultado.x[i][j]=a.x[i][j]+b.x[i][j];
            }
        }
        return resultado;
    }
//producto de dos matrices
    static Matriz producto(Matriz a, Matriz b){
        Matriz resultado=new Matriz(a.n);
        for(int i=0; i<a.n; i++){
            for(int j=0; j<a.n; j++){
                for(int k=0; k<a.n; k++){
                    resultado.x[i][j]+=a.x[i][k]*b.x[k][j];
                }
            }
        }
        return resultado;
    }
//producto de una matriz por un escalar
    static Matriz producto(Matriz a, double d){
        Matriz resultado=new Matriz(a.n);
        for(int i=0; i<a.n; i++){
            for(int j=0; j<a.n; j++){
                resultado.x[i][j]=a.x[i][j]*d;
            }
        }
        return resultado;
    }
//producto de un escalar por una matriz
    static Matriz producto(double d, Matriz a){
        Matriz resultado=new Matriz(a.n);
        for(int i=0; i<a.n; i++){
            for(int j=0; j<a.n; j++){
                resultado.x[i][j]=a.x[i][j]*d;
            }
        }
        return resultado;
    }
//producto de un vector fila por una matriz da un vector fila (1xn) (nxn)= (1xn)
    static Vector producto(Vector v, Matriz a){
        Vector b=new Vector(v.n);
        int n=v.n;  //dimensión
        for(int j=0; j<n; j++){
            for(int k=0; k<n; k++){
                b.x[j]+=v.x[k]*a.x[k][j];
            }
        }
        return b;
    }
//producto de una matriz por un vector columna (nxn) (nx1)= (nx1)
    static Vector producto(Matriz a, Vector v){
        int n=v.n;  //dimensión
        Vector b=new Vector(n);
        for(int i=0; i<n; i++){
            for(int k=0; k<n; k++){
                b.x[i]+=a.x[i][k]*v.x[k];
            }
        }
        return b;
    }

//determinante de una matriz
    double determinante(){
        Matriz a=(Matriz)clone();
        for(int k=0; k<n-1; k++){
            for(int i=k+1; i<n; i++){
                for(int j=k+1; j<n; j++){
                    a.x[i][j]-=a.x[i][k]*a.x[k][j]/a.x[k][k];
                }
            }
        }
        double deter=1.0;
        for(int i=0; i<n; i++){
            deter*=a.x[i][i];
        }
        return deter;
    }
//matriz inversa
    static Matriz inversa(Matriz d){
        int n=d.n;  //dimensión de la matriz
        Matriz a=(Matriz)d.clone();
        Matriz b=new Matriz(n);   //matriz de los términos independientes
        Matriz c=new Matriz(n);   //matriz de las incógnitas
//matriz unidad
        for(int i=0; i<n; i++){
            b.x[i][i]=1.0;
        }
//transformación de la matriz y de los términos independientes
        for(int k=0; k<n-1; k++){
            for(int i=k+1; i<n; i++){
//términos independientes
                for(int s=0; s<n; s++){
                    b.x[i][s]-=a.x[i][k]*b.x[k][s]/a.x[k][k];
                }
//elementos de la matriz
                for(int j=k+1; j<n; j++){
                    a.x[i][j]-=a.x[i][k]*a.x[k][j]/a.x[k][k];
                }
            }
        }
//cálculo de las incógnitas, elementos de la matriz inversa
        for(int s=0; s<n; s++){
            c.x[n-1][s]=b.x[n-1][s]/a.x[n-1][n-1];
            for(int i=n-2; i>=0; i--){
                c.x[i][s]=b.x[i][s]/a.x[i][i];
                for(int k=n-1; k>i; k--){
                    c.x[i][s]-=a.x[i][k]*c.x[k][s]/a.x[i][i];
                }
            }
        }
        return c;
    }
//matriz traspuesta
    static Matriz traspuesta(Matriz a){
        int n=a.n;    //dimensión
        Matriz d=new Matriz(a.n);
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                d.x[i][j]=a.x[j][i];
            }
        }
        return d;
    }
//polinomio característico

    public double[] polCaracteristico(){
        Matriz pot=new Matriz(n);
//matriz unidad
        for(int i=0; i<n; i++){
            pot.x[i][i]=1.0;
        }
        double[] p=new double[n+1];
        double[] s=new double[n+1];
        for(int i=1; i<=n; i++){
            pot=Matriz.producto(pot, this);
            s[i]=pot.traza();
        }
        p[0]=1.0;
        p[1]=-s[1];
        for(int i=2; i<=n; i++){
            p[i]=-s[i]/i;
            for(int j=1; j<i; j++){
                p[i]-=s[i-j]*p[j]/i;
            }
        }
        return p;
    }

    public Matriz valoresPropios(double[] valores, int maxIter)throws ValoresExcepcion{
        final double CERO=1e-8;
        double maximo, tolerancia, sumsq;
        double x, y, z, c, s;
        int contador=0;
        int i, j, k, l;
        Matriz a=(Matriz)clone();      //matriz copia
        Matriz p=new Matriz(n);
        Matriz q=new Matriz(n);
//matriz unidad
        for(i=0; i<n; i++){
            q.x[i][i]=1.0;
        }
        do{
            k=0; l=1;
            maximo=Math.abs(a.x[k][1]);
            for(i=0; i<n-1; i++){
                for(j=i+1; j<n; j++){
                    if(Math.abs(a.x[i][j])>maximo){
                        k=i;        l=j;
                        maximo=Math.abs(a.x[i][j]);
                    }
                }
            }
            sumsq=0.0;
            for(i=0; i<n; i++){
                sumsq+=a.x[i][i]*a.x[i][i];
            }
            tolerancia=0.0001*Math.sqrt(sumsq)/n;
            if(maximo<tolerancia) break;
//calcula la matriz ortogonal de p
//inicialmente es la matriz unidad
            for(i=0; i<n; i++){
                for(j=0; j<n; j++){
                    p.x[i][j]=0.0;
                }
            }
            for(i=0; i<n; i++){
                p.x[i][i]=1.0;
            }
            y=a.x[k][k]-a.x[l][l];
            if(Math.abs(y)<CERO){
                c=s=Math.sin(Math.PI/4);
            }else{
                x=2*a.x[k][l];
                z=Math.sqrt(x*x+y*y);
                c=Math.sqrt((z+y)/(2*z));
                s=signo(x/y)*Math.sqrt((z-y)/(2*z));
            }
            p.x[k][k]=c;
            p.x[l][l]=c;
            p.x[k][l]=s;
            p.x[l][k]=-s;
            a=Matriz.producto(p, Matriz.producto(a, Matriz.traspuesta(p)));
            q=Matriz.producto(q, Matriz.traspuesta(p));
            contador++;
        }while(contador<maxIter);

        if(contador==maxIter){
            throw new ValoresExcepcion("No se han podido calcular los valores propios");
        }
//valores propios
        //double[] valores=new double[n];
        for(i=0; i<n; i++){
            valores[i]=(double)Math.round(a.x[i][i]*1000)/1000;
        }
//vectores propios
        return q;
    }

    private int signo(double x){
        return (x>0 ? 1 : -1);
    }

    public String toString(){
        String texto="\n";
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                texto+="\t "+(double)Math.round(1000*x[i][j])/1000;
            }
            texto+="\n";
        }
        texto+="\n";
        return texto;
  }

}

class ValoresExcepcion extends Exception {

  public ValoresExcepcion() {
         super();
  }
  public ValoresExcepcion(String s) {
         super(s);
  }
}

 

public class MatrizApp {
    public static void main(String[] args) {
//vectores y matrices
        double[][] a1={{1, 2, 3},{4,5,6},{7,8,9}};
        Matriz a=new Matriz(a1);
        double[] v1={1,2,3};
        Vector v=new Vector(v1);
        Vector r=Matriz.producto(v, a);
        System.out.println("Vector "+r);
        r=Matriz.producto(a, v);
        System.out.println("Vector "+r);
//matrices
        double[][] b1={{1, 0, -1},{2,1,3},{-1, 0, 2}};
        Matriz b=new Matriz(b1);
        Matriz re=Matriz.suma(a, b);
        System.out.println("matriz "+re);
        re=Matriz.producto(a, b);
        System.out.println("matriz "+re);
//número por una matriz
        re=Matriz.producto(a, 2.0);
        System.out.println("matriz "+re);
        re=Matriz.producto(2.0, a);
        System.out.println("matriz "+re);
//determinantes
        System.out.println("determinante "+b.determinante());
        System.out.println("determinante "+a.determinante());
        double[][] h1={{3, 1, -1, 2, 1},{-2, 3, 1, 4, 3},{1, 4, 2, 3, 1},
{5, -2, -3, 5, -1},{-1, 1, 2, 3, 2}}; Matriz h=new Matriz(h1); System.out.println("determinante "+h.determinante()); //matriz inversa double[][] c1={{1.8, -3.8, 0.7, -3.7},{0.7, 2.1, -2.6, -2.8},
{7.3, 8.1, 1.7, -4.9},{1.9, -4.3, -4.9, -4.7}}; Matriz c=new Matriz(c1); Matriz in=Matriz.inversa(c); System.out.println("matriz inversa "+in); System.out.println("matriz unidad "+Matriz.producto(c, in)); //sistema de ecuaciones lineales double[][] m1={{3, -1, 0}, {-2, 1, 1}, {2, -1, 4}}; Matriz coef=new Matriz(m1); double[] n1={5, 0, 15}; Vector ter=new Vector(n1); Vector solucion=Matriz.producto(Matriz.inversa(coef), ter); System.out.println("solución "+solucion); //otro sistema de ecuaciones double[][] m2={{7.9, 5.6, 5.7, -7.2}, {8.5, -4.8, 0.8, 3.5},
{4.3, 4.2, -3.2, 9.3}, {3.2, -1.4, -8.9, 3.3}}; coef=new Matriz(m2); double[] n2={6.68, 9.95, 8.6, 1}; ter=new Vector(n2); solucion=Matriz.producto(Matriz.inversa(coef), ter); System.out.println("solución "+solucion); //polinomio característico double[][] p1={{1,2,3,4},{2,1,2,3},{3,2,1,2},{4,3,2,1}}; Matriz p=new Matriz(p1); double pol[]=p.polCaracteristico(); System.out.println("Polinomio característico"); for(int i=0; i<pol.length; i++){ System.out.print((double)Math.round(pol[i]*1000)/1000+" , "); } System.out.println(""); //valores propios y vectores propios System.out.println("Valores y vectores propios "); double[][] val1={{7, -1, -1}, {-1, 5, 1},{-1, 1, 5}}; Matriz matriz=new Matriz(val1); Matriz vectores=new Matriz(matriz.n); double[] valores=new double[matriz.n]; try{ vectores=matriz.valoresPropios(valores, 20); }catch(ValoresExcepcion ex){ System.out.println("Al calcular los valores propios se
ha producido una excepción\n " +ex.getClass()+ " con el mensaje "+ ex.getMessage()); } for(int i=0; i<matriz.n; i++){ //valores propios System.out.print(valores[i]+" , "); } System.out.println(""); System.out.println(vectores); //vectores propios try { //espera la pulsación de una tecla y luego RETORNO System.in.read(); }catch (Exception e) { } } }

 

Anterior