SHARE
TWEET

Untitled

a guest Nov 17th, 2019 94 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package com.company;
  2.  
  3. import Jama.*;
  4. import java.util.Random;
  5.  
  6. public class Main {
  7.  
  8.     static double[][] LU;
  9.  
  10.     public static void main(String[] args) {
  11.         int n = 4;
  12.  
  13.         // Macierz A
  14.         Matrix A = Matrix.random(n, n);
  15.  
  16.         Random rand = new Random();
  17.         int isU = rand.nextInt((1 - 0) + 1) + 0;
  18.  
  19.  
  20.         // L lub U - uzupelnianie zerami
  21.         if (isU == 0) {
  22.             System.out.println("U");
  23.             for (int i = 0; i < n; i++) {
  24.                 for (int j = 0; j < i; j++) {
  25.                     A.set(i, j, 0);
  26.                 }
  27.             }
  28.         } else {
  29.             System.out.println("L");
  30.             for (int j = 0; j < n; j++) {
  31.                 for (int i = 0; i < j; i++) {
  32.                     A.set(i, j, 0);
  33.                 }
  34.             }
  35.         }
  36.  
  37.         // Macierz B - wektor
  38.         Matrix B = Matrix.random(n, 1);
  39.  
  40.         System.out.println("Macierz A:");
  41.         A.print(5,3);
  42.         System.out.println("\nMacierz B:");
  43.         System.out.println(" ");
  44.         B.print(5,3);
  45.  
  46.         // Macierz odwrotna dla testu
  47.         System.out.println("Rozwiazanie z biblioteki:");
  48.         Matrix  G = A.solve(B);
  49.         G.print(5,3);
  50.         System.out.println(" ");
  51.  
  52.         // Solution
  53.         System.out.println("Rozwiazanie:");
  54.         Matrix S = FindInverse(A, B, n);
  55.  
  56.         S.print(5, 3);
  57.  
  58.  
  59.         double Af = 0;
  60.         for(int i = 0; i < S.getRowDimension(); i++) {
  61.             for(int j = 0; j < S.getColumnDimension(); j++) {
  62.                 Af += S.get(i, j) * S.get(i, j);
  63.             }
  64.         }
  65.  
  66.  
  67.         Af = Math.sqrt(Af);
  68.         //System.out.println("\nWartość Af: " + Af);
  69.  
  70.         // --------------------------------
  71.  
  72.         Matrix identityMatrix = Matrix.identity(n, n);
  73.  
  74.         Matrix[] X = new Matrix[n];
  75.  
  76.         for(int i = 0; i < n; i++) {
  77.             X[i] = FindInverse(A, identityMatrix.getMatrix(0, n - 1, i, i), n);
  78.         }
  79.  
  80.         Matrix X1 = FindInverse(A, identityMatrix.getMatrix(0, n - 1, 0, 0), n);
  81.         Matrix X2 = FindInverse(A, identityMatrix.getMatrix(0, n - 1, 1, 1), n);
  82.         Matrix X3 = FindInverse(A, identityMatrix.getMatrix(0, n - 1, 2, 2), n);
  83.         Matrix X4 = FindInverse(A, identityMatrix.getMatrix(0, n - 1, 3, 3), n);
  84.  
  85.         Matrix IKS = new Matrix(n,n);
  86.  
  87.         for(int i = 0; i < n; i++) {
  88.             for(int j = 0; j < n; j++) {
  89.                 IKS.set(i, j, X[j].get(i, 0));
  90.             }
  91.         }
  92.  
  93.         IKS.print(5, 3);
  94.  
  95.         // po pomnozeniu otrzymanej odwrotnej X przez A
  96.         Matrix newIdentity = A.times(IKS);
  97.  
  98.         newIdentity.print(10, 10);
  99.  
  100.  
  101.         double Af2 = 0;
  102.         for(int i = 0; i < newIdentity.getRowDimension(); i++) {
  103.             for(int j = 0; j < newIdentity.getColumnDimension(); j++) {
  104.                 Af2 += newIdentity.get(i, j) * newIdentity.get(i, j);
  105.             }
  106.         }
  107.  
  108.         Af2 = Math.sqrt(Af2);
  109.         System.out.println("\nWartość Af: " + Af2);
  110.  
  111.     }
  112.  
  113.     public static Matrix FindInverse(Matrix A, Matrix B, int n) {
  114.  
  115.         // pivot generowanie
  116.         int piv[] = getPivot(A, n);
  117.  
  118.         int columnNumber = 1;
  119.         Matrix matrixX = B.getMatrix(piv,0,columnNumber-1);
  120.         double[][] X = matrixX.getArray();
  121.  
  122.  
  123.         // Solve L*Y = B(piv,:)
  124.         for (int k = 0; k < n; k++) {
  125.             for (int i = k+1; i < n; i++) {
  126.                 for (int j = 0; j < columnNumber; j++) {
  127.                     X[i][j] -= X[k][j]*LU[i][k];
  128.                 }
  129.             }
  130.         }
  131.         // Solve U*X = Y;
  132.         for (int k = n-1; k >= 0; k--) {
  133.             for (int j = 0; j < columnNumber; j++) {
  134.                 X[k][j] /= LU[k][k];
  135.             }
  136.             for (int i = 0; i < k; i++) {
  137.                 for (int j = 0; j < columnNumber; j++) {
  138.                     X[i][j] -= X[k][j]*LU[i][k];
  139.                 }
  140.             }
  141.         }
  142.         return matrixX;
  143.     }
  144.  
  145.  
  146.     public static int[] getPivot(Matrix A, int n) {
  147.         LU = A.getArrayCopy();
  148.         int piv[] = new int[n];
  149.  
  150.         for (int i = 0; i < n; i++) {
  151.             piv[i] = i;
  152.         }
  153.         double[] LUrowi;
  154.         double[] LUcolj = new double[n];
  155.  
  156.         // Outer loop.
  157.         for (int j = 0; j < n; j++) {
  158.  
  159.             // Make a copy of the j-th column to localize references.
  160.             for (int i = 0; i < n; i++) {
  161.                 LUcolj[i] = LU[i][j];
  162.             }
  163.  
  164.             // Apply previous transformations.
  165.             for (int i = 0; i < n; i++) {
  166.                 LUrowi = LU[i];
  167.  
  168.                 // Most of the time is spent in the following dot product.
  169.                 int kmax = Math.min(i,j);
  170.                 double s = 0.0;
  171.                 for (int k = 0; k < kmax; k++) {
  172.                     s += LUrowi[k]*LUcolj[k];
  173.                 }
  174.  
  175.                 LUrowi[j] = LUcolj[i] -= s;
  176.             }
  177.  
  178.             // Find pivot and exchange if necessary.
  179.             int p = j;
  180.             for (int i = j+1; i < n; i++) {
  181.                 if (Math.abs(LUcolj[i]) > Math.abs(LUcolj[p])) {
  182.                     p = i;
  183.                 }
  184.             }
  185.             if (p != j) {
  186.                 for (int k = 0; k < n; k++) {
  187.                     double t = LU[p][k]; LU[p][k] = LU[j][k]; LU[j][k] = t;
  188.                 }
  189.                 int k = piv[p];
  190.                 piv[p] = piv[j];
  191.                 piv[j] = k;
  192.             }
  193.  
  194.             if (j < n & LU[j][j] != 0.0) {
  195.                 for (int i = j+1; i < n; i++) {
  196.                     LU[i][j] /= LU[j][j];
  197.                 }
  198.             }
  199.         }
  200.  
  201.         return  piv;
  202.     }
  203. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top