Advertisement
Guest User

Untitled

a guest
May 23rd, 2017
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5 5.45 KB | None | 0 0
  1. package proy3;
  2. /**
  3.  * Clase que que resuelve sistemas de ecuaciones de nxn, en caso de ser 2x2 se realiza optimizadamente
  4.  */
  5. public class SistemaEcuaciones
  6. {
  7.     /**
  8.      * matriz de doubles que representa el sistema de ecuaciones
  9.      */
  10.     private double[][] q;
  11.     /**
  12.      * arreglo en el que se almacenan las respuestas del sistema
  13.      */
  14.     private double[] soluciones;
  15.  
  16.     /**
  17.      * Constructor del sistema de ecuaciones
  18.      *
  19.      * @param a
  20.      *            matriz Izquierda que conforma la matriz representacion
  21.      *            (coeficientes de las incognitas)
  22.      * @param b
  23.      *            arreglo con los datos necesarios para la solucion del sistema
  24.      *            (parte derecha de la matrz representacion
  25.      * @param nIncognitas
  26.      *            numero de incognitas del sistema
  27.      */
  28.     public SistemaEcuaciones(double[][] a, double b[], int nIncognitas)
  29.     {
  30.         soluciones = new double[nIncognitas];
  31.         if (nIncognitas < 3)
  32.             solucionarCramer(a, b, nIncognitas);
  33.         else
  34.             solucionarGauss(a, b, nIncognitas);
  35.     }
  36.  
  37.     /**
  38.      * metodo Cramer para solucionar sistemas de ecuaciones resolucion de
  39.      * Sistemas de ecuaciones con 2 incognitas se usa para la resolucion de las
  40.      * homogeneas por ser mas eficiente No requiere la manipulacion de las
  41.      * matrices <b>pre: </b> a, b inicializados de la forma
  42.      * a[nIncognitas][nIncognitas] y b[nIncognitas], nIncognitas = 2 <b>post:
  43.      * </b> se ha agregado al arreglo soluciones las soluciones del sistema
  44.      *
  45.      * @param a
  46.      *            matriz Izquierda que conforma la matriz representacion
  47.      *            (coeficientes de las incognitas)
  48.      * @param b
  49.      *            arreglo con los datos necesarios para la solucion del sistema
  50.      *            (parte derecha de la matrz representacion
  51.      * @param nIncognitas
  52.      *            numero de incognitas del sistema
  53.      */
  54.     public void solucionarCramer(double[][] a, double b[], int nIncognitas)
  55.     {
  56.         if (nIncognitas == 2)
  57.         {
  58.             double A = (b[0] * a[1][1] - b[1] * a[0][1]) / (a[0][0] * a[1][1] - a[1][0] * a[0][1]);
  59.             double B = (a[0][0] * b[1] - a[1][0] * b[0]) / (a[0][0] * a[1][1] - a[1][0] * a[0][1]);
  60.             soluciones[0] = A;
  61.             soluciones[1] = B;
  62.         }
  63.         else
  64.         {
  65.             System.out.println("error no pueden existir menos de 2 ingonitas pues nos dan ecuaciones cuadraticas");
  66.         }
  67.     }
  68.  
  69.     /**
  70.      * Metodo encargado de juntar la matriz de la izquierda con el arreglo para
  71.      * formar la matriz representacion <b>pre: </b> a, b inicializados de la
  72.      * forma a[nIncognitas][nIncognitas] y b[nIncognitas], nIncognitas > 2
  73.      * <b>post: </b> se han insertado los datos de la matriz y el arreglo en la
  74.      * matriz q, la ultima columna contiene los valores del arreglo b
  75.      *
  76.      * @param a
  77.      *            matriz Izquierda que conforma la matriz representacion
  78.      *            (coeficientes de las incognitas)
  79.      * @param b
  80.      *            arreglo con los datos necesarios para la solucion del sistema
  81.      *            (parte derecha de la matrz representacion
  82.      * @param nIncognitas
  83.      *            numero de incognitas del sistema
  84.      */
  85.     public void cargar(double[][] a, double b[], int nIncognitas)
  86.     {
  87.         q = new double[nIncognitas][nIncognitas + 1];
  88.         for (int i = 0; i < nIncognitas; i++)
  89.         {
  90.             for (int j = 0; j < nIncognitas; j++)
  91.             {
  92.                 q[i][j] = a[i][j];
  93.             }
  94.             q[i][nIncognitas] = b[i];
  95.         }
  96.     }
  97.  
  98.     /**
  99.      * Metodo proveniente de la documentacion mencionada Diagonaliza la matriz,
  100.      * es decir, vuelve 0 todo lo que esta debajo de la diagonal En la
  101.      * documentacion lo llaman forward_solve <b>pre: </b> matriz q cargada
  102.      * <b>post: </b> valores bajo la diagonal de q quedan en 0
  103.      */
  104.     public void triangularizar()
  105.     {
  106.         int i, j, k, maxr, n;
  107.         double t, pivot;
  108.         n = q.length;
  109.         for (i = 0; i < n; i++)
  110.         {
  111.             maxr = i;
  112.             for (j = i + 1; j < n; j++)
  113.                 if (Math.abs(q[j][i]) > Math.abs(q[j][i]))
  114.                     maxr = j;
  115.             if (maxr != i)
  116.                 for (k = i; k <= n; k++)
  117.                 {
  118.                     t = q[i][k];
  119.                     q[i][k] = q[maxr][k];
  120.                     q[maxr][k] = t;
  121.                 }
  122.             for (j = i + 1; j < n; j++)
  123.             {
  124.                 pivot = q[j][i] / q[i][i];
  125.                 for (k = n; k >= i; k--)
  126.                     q[j][k] = q[j][k] - q[i][k] * pivot;
  127.             }
  128.         }
  129.     }
  130.  
  131.     /**
  132.      * Metodo proveniente de la documentacion mencionada Se apoya en la
  133.      * reduccion de gauss para resolver el sistema de ecuaciones Usa un metodo
  134.      * que en la documentacion llaman back_solve y lo que hace es hallar
  135.      * variables de "abajo  para arriba" <b>pre: </b> a, b inicializados de la
  136.      * forma a[nIncognitas][nIncognitas] y b[nIncognitas], nIncognitas > 2
  137.      * <b>post: </b> en el arreglo soluciones se encuentran las soluciones del
  138.      * sistema
  139.      *
  140.      * @param a
  141.      *            matriz Izquierda que conforma la matriz representacion
  142.      *            (coeficientes de las incognitas)
  143.      * @param b
  144.      *            arreglo con los datos necesarios para la solucion del sistema
  145.      *            (parte derecha de la matrz representacion
  146.      * @param nIncognitas
  147.      *            numero de incognitas del sistema
  148.      */
  149.     public void solucionarGauss(double[][] a, double[] b, int nIncognitas)
  150.     {
  151.         cargar(a, b, nIncognitas);
  152.         triangularizar();
  153.         int j, k, n;
  154.         double t;
  155.         n = nIncognitas;
  156.         for (j = n - 1; j >= 0; j--)
  157.         {
  158.             t = 0.0;
  159.             for (k = j + 1; k < n; k++)
  160.                 t += q[j][k] * q[k][n];
  161.             q[j][n] = (q[j][n] - t) / q[j][j];
  162.         }
  163.         for (int i = 0; i < n; i++)
  164.             soluciones[i] = q[i][n];
  165.     }
  166.  
  167.     /**
  168.      * retorna un arreglo con las soluciones del sistema
  169.      *
  170.      * @return arreglo con las soluciones del sistema
  171.      */
  172.     public double[] darSoluciones()
  173.     {
  174.         return soluciones;
  175.     }
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement